我有一个表 Person,其中一列 id引用了表 Worker中的一列 id。
Person
id
Worker
这两个查询之间的区别是什么? 它们产生相同的结果。
SELECT * FROM Person JOIN Worker ON Person.id = Worker.id;
还有
SELECT * FROM Person, Worker WHERE Person.id = Worker.id;
使用 JOINS 使代码更容易阅读,因为它是不言而喻的。
在速度上没有区别(我测试了它) ,执行计划是相同的
如果查询优化器正确执行其工作,那么这些查询之间应该没有区别。它们只是指定相同期望结果的两种方法。
这些查询在逻辑上是等价的。逗号运算符等价于 [INNER] JOIN运算符。
[INNER] JOIN
逗号是较早的样式联接运算符。JOIN 关键字是后来添加的,它之所以受欢迎,是因为它还允许 OUTER 连接操作。
它还允许将连接谓词(条件)从 WHERE子句分隔成 ON子句。这提高了(人类的)可读性。
WHERE
ON
后续报道
这个答案说明问题中的两个查询是等价的。在同一个查询中,我们不应该将连接操作的老式逗号语法与较新的 JOIN关键字语法混合使用。如果我们把它们混合在一起,我们需要意识到优先顺序的不同。
JOIN
摘自 MySQL 参考手册
Https://dev.mysql.com/doc/refman/5.6/en/join.html
在没有连接条件的情况下,INNER JOIN和 ,(逗号)在语义上是等价的: 它们都在指定的表之间产生一个笛卡儿积(也就是说,第一个表中的每一行都被连接到第二个表中的每一行)。 但是,逗号运算符的优先级小于 INNER JOIN、 CROSS JOIN、 LEFT JOIN等的优先级。如果在存在连接条件时将逗号连接与其他连接类型混合,则可能出现形式为 Unknown column 'col_name' in 'on clause'的错误。有关处理此问题的信息将在本节后面给出。
在没有连接条件的情况下,INNER JOIN和 ,(逗号)在语义上是等价的: 它们都在指定的表之间产生一个笛卡儿积(也就是说,第一个表中的每一行都被连接到第二个表中的每一行)。
INNER JOIN
,
但是,逗号运算符的优先级小于 INNER JOIN、 CROSS JOIN、 LEFT JOIN等的优先级。如果在存在连接条件时将逗号连接与其他连接类型混合,则可能出现形式为 Unknown column 'col_name' in 'on clause'的错误。有关处理此问题的信息将在本节后面给出。
CROSS JOIN
LEFT JOIN
Unknown column 'col_name' in 'on clause'
完全没有区别。
第一种表示使得查询更具可读性,并且使得哪个连接对应于哪个条件看起来非常清楚。
The SELECT * FROM table1, table2, etc.适用于几个表,但是随着表数量的增加,它会变得非常困难。
The SELECT * FROM table1, table2, etc.
JOIN语法明确了哪些条件影响哪些表(给出一个条件)。另外,第二种方法是旧的标准。
不过,对于数据库来说,结果还是一样
除了更好的可读性之外,还有一种情况是显式联接的表比逗号分隔的表更好。
举个例子:
Create Table table1 ( ID int NOT NULL Identity(1, 1) PRIMARY KEY , Name varchar(50) ) Create Table table2 ( ID int NOT NULL Identity(1, 1) PRIMARY KEY , ID_Table1 INT NOT NULL )
下面的查询将提供两个表中的所有列和行
SELECT * FROM table1, table2
下面的查询将为我提供第一个表中的列,其表别名为‘ table2’
SELECT * FROM table1 table2
如果在逗号分隔的连接中错误地忘记了逗号,第二个表将自动转换为第一个表的表别名。不是所有的情况,但是这样的事情是有可能发生的