MySQL 中 where-conditions 中运算符的解析顺序是什么(示例:SELF join)
What's the resolving order of operators in where-conditions in MySQL (example: SELF join)
我正在研究一些 SQL 教程,发现了一个让我挠头的例子。我不想复制那里给出的所有 SELF
连接示例,所以我将 post link 到相关页面 here.
在该示例中,SELF
联接是在包含薪水的 "customer" table 上进行的。 WHERE
-条件是 a.SALARY < b.SALARY
。我假设 "lesser than"-operator 是左关联的。意思是,我预计引擎会获取 table a
的每一行并将其与 table b
的相应行连接起来,这符合 WHERE
条件。
所以我会得到以下结果:
+----+----------+---------+
| ID | NAME | SALARY |
+----+----------+---------+
| 1 | Chaitali | 2000.00 |
| 1 | Hardik | 2000.00 |
| 1 | Komal | 2000.00 |
| 1 | Muffy | 2000.00 |
| 2 | Ramesh | 1500.00 |
| 2 | kaushik | 1500.00 |
| 2 | Chaitali | 1500.00 |
| 2 | Hardik | 1500.00 |
| 2 | Komal | 1500.00 |
| 2 | Muffy | 1500.00 |
| 3 | Chaitali | 2000.00 |
| 3 | Hardik | 2000.00 |
| 3 | Komal | 2000.00 |
| 3 | Muffy | 2000.00 |
| 4 | Hardik | 6500.00 |
| 4 | Muffy | 6500.00 |
| 5 | Muffy | 8500.00 |
| 6 | Chaitali | 4500.00 |
| 6 | Hardik | 4500.00 |
| 6 | Muffy | 4500.00 |
+----+----------+---------+
我的问题是作者说 MySQL-输出(参见:"the authors statement about using MySQL for testing example-code")如下:
+----+----------+---------+
| ID | NAME | SALARY |
+----+----------+---------+
| 2 | Ramesh | 1500.00 |
| 2 | kaushik | 1500.00 |
| 1 | Chaitali | 2000.00 |
| 2 | Chaitali | 1500.00 |
| 3 | Chaitali | 2000.00 |
| 6 | Chaitali | 4500.00 |
| 1 | Hardik | 2000.00 |
| 2 | Hardik | 1500.00 |
| 3 | Hardik | 2000.00 |
| 4 | Hardik | 6500.00 |
| 6 | Hardik | 4500.00 |
| 1 | Komal | 2000.00 |
| 2 | Komal | 1500.00 |
| 3 | Komal | 2000.00 |
| 1 | Muffy | 2000.00 |
| 2 | Muffy | 1500.00 |
| 3 | Muffy | 2000.00 |
| 4 | Muffy | 6500.00 |
| 5 | Muffy | 8500.00 |
| 6 | Muffy | 4500.00 |
+----+----------+---------+
这表示引擎首先从 table b
中获取行并将它们与 table a
.
进行比较
我现在不知道这是否是作者的错,因为他忘记提及任何 ORDER BY
或 GROUP BY
参数。 (在那种情况下,该教程简直糟透了。)
但是如果他说的输出在MySQL-服务器上确实是正确的,我想从比我更了解SQL的人那里知道,
a) 为什么这个运算符从右到左解析并且
b) 这样做的理由是什么。这是性能问题吗?还是我从一开始就对 "lesser than"-运算符有误:它从不先取左操作数?
c) 我想知道这只是 MySQL 的结果还是与 SQL 一般相关的问题。
不幸的是,我无法自己测试此输出,因为我目前没有任何允许安装 MySQL 的计算机。非常感谢您的帮助:)
我希望这个问题听起来不太愚蠢,但我无法在互联网上找到专门解释此行为的有用资源。当我学习时,我有两个关于 RDBMS 的模块,并且在所有示例中,运算符总是按照我在上面的第一个输出示例中所做的方式解析。这就是为什么我目前对此感到困惑^^
提前感谢您为我浪费您的时间:D
最好的问候。
通常您有一个聪明的过程,可以确定应按哪个方向处理特定查询以使其最有效。然后它只取决于那个过程,以及每个查询,如果先比较一个或另一个。
如果没有一个比另一个更好,那只是一个因数据库而异的实现决策,我认为当你在这里写的时候 MySQL 是右结合的。
期望结果按插入顺序排列是一种常见的误解。即使使用聚簇索引,结果集也可能不是预期的那样。强制执行命令的唯一方法是使用 order by
子句。查询可能是并行执行的,结果集可能是合并的,也可能是由于查询优化计划试图return 尽可能快地得到结果集。这就是为什么会出现这样的问题。
我正在研究一些 SQL 教程,发现了一个让我挠头的例子。我不想复制那里给出的所有 SELF
连接示例,所以我将 post link 到相关页面 here.
在该示例中,SELF
联接是在包含薪水的 "customer" table 上进行的。 WHERE
-条件是 a.SALARY < b.SALARY
。我假设 "lesser than"-operator 是左关联的。意思是,我预计引擎会获取 table a
的每一行并将其与 table b
的相应行连接起来,这符合 WHERE
条件。
所以我会得到以下结果:
+----+----------+---------+
| ID | NAME | SALARY |
+----+----------+---------+
| 1 | Chaitali | 2000.00 |
| 1 | Hardik | 2000.00 |
| 1 | Komal | 2000.00 |
| 1 | Muffy | 2000.00 |
| 2 | Ramesh | 1500.00 |
| 2 | kaushik | 1500.00 |
| 2 | Chaitali | 1500.00 |
| 2 | Hardik | 1500.00 |
| 2 | Komal | 1500.00 |
| 2 | Muffy | 1500.00 |
| 3 | Chaitali | 2000.00 |
| 3 | Hardik | 2000.00 |
| 3 | Komal | 2000.00 |
| 3 | Muffy | 2000.00 |
| 4 | Hardik | 6500.00 |
| 4 | Muffy | 6500.00 |
| 5 | Muffy | 8500.00 |
| 6 | Chaitali | 4500.00 |
| 6 | Hardik | 4500.00 |
| 6 | Muffy | 4500.00 |
+----+----------+---------+
我的问题是作者说 MySQL-输出(参见:"the authors statement about using MySQL for testing example-code")如下:
+----+----------+---------+
| ID | NAME | SALARY |
+----+----------+---------+
| 2 | Ramesh | 1500.00 |
| 2 | kaushik | 1500.00 |
| 1 | Chaitali | 2000.00 |
| 2 | Chaitali | 1500.00 |
| 3 | Chaitali | 2000.00 |
| 6 | Chaitali | 4500.00 |
| 1 | Hardik | 2000.00 |
| 2 | Hardik | 1500.00 |
| 3 | Hardik | 2000.00 |
| 4 | Hardik | 6500.00 |
| 6 | Hardik | 4500.00 |
| 1 | Komal | 2000.00 |
| 2 | Komal | 1500.00 |
| 3 | Komal | 2000.00 |
| 1 | Muffy | 2000.00 |
| 2 | Muffy | 1500.00 |
| 3 | Muffy | 2000.00 |
| 4 | Muffy | 6500.00 |
| 5 | Muffy | 8500.00 |
| 6 | Muffy | 4500.00 |
+----+----------+---------+
这表示引擎首先从 table b
中获取行并将它们与 table a
.
进行比较
我现在不知道这是否是作者的错,因为他忘记提及任何 ORDER BY
或 GROUP BY
参数。 (在那种情况下,该教程简直糟透了。)
但是如果他说的输出在MySQL-服务器上确实是正确的,我想从比我更了解SQL的人那里知道,
a) 为什么这个运算符从右到左解析并且
b) 这样做的理由是什么。这是性能问题吗?还是我从一开始就对 "lesser than"-运算符有误:它从不先取左操作数?
c) 我想知道这只是 MySQL 的结果还是与 SQL 一般相关的问题。
不幸的是,我无法自己测试此输出,因为我目前没有任何允许安装 MySQL 的计算机。非常感谢您的帮助:)
我希望这个问题听起来不太愚蠢,但我无法在互联网上找到专门解释此行为的有用资源。当我学习时,我有两个关于 RDBMS 的模块,并且在所有示例中,运算符总是按照我在上面的第一个输出示例中所做的方式解析。这就是为什么我目前对此感到困惑^^
提前感谢您为我浪费您的时间:D 最好的问候。
通常您有一个聪明的过程,可以确定应按哪个方向处理特定查询以使其最有效。然后它只取决于那个过程,以及每个查询,如果先比较一个或另一个。
如果没有一个比另一个更好,那只是一个因数据库而异的实现决策,我认为当你在这里写的时候 MySQL 是右结合的。
期望结果按插入顺序排列是一种常见的误解。即使使用聚簇索引,结果集也可能不是预期的那样。强制执行命令的唯一方法是使用 order by
子句。查询可能是并行执行的,结果集可能是合并的,也可能是由于查询优化计划试图return 尽可能快地得到结果集。这就是为什么会出现这样的问题。