例如,如果我有一个表“Person”,其列“id”引用表“Worker”中的列“id”
这两个查询之间有什么区别?它们产生相同的结果。
SELECT *
FROM Person
JOIN Worker
ON Person.id = Worker.id;
和
SELECT *
FROM Person,
Worker
WHERE Person.id = Worker.id;
由于
答案 0 :(得分:45)
完全没有区别。
第二种表示使查询更具可读性,并使其看起来非常清楚哪个连接对应于哪种条件。
答案 1 :(得分:28)
查询在逻辑上是等效的。逗号运算符等同于[INNER] JOIN
运算符。
逗号是旧式连接运算符。 JOIN关键字稍后添加,并且受到青睐,因为它还允许OUTER连接操作。
它还允许将连接谓词(条件)与WHERE
子句分隔为ON
子句。这提高了(人类)可读性。
<强>后续强>
这个答案说问题中的两个查询是等价的。我们不应该将连接操作的旧式逗号语法与同一查询中较新的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'
形式的错误。有关处理此问题的信息将在本节后面给出。
答案 2 :(得分:12)
除了更好的可读性之外,还有一种情况是明确连接的表更好而不是以逗号分隔的表。
让我们看一个例子:
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
如果您在逗号分隔的连接中错误地忘记了逗号,则第二个表会自动转换为第一个表的表别名。并非在所有情况下,但有机会这样的事情
答案 3 :(得分:3)
使用JOINS使代码更容易阅读,因为它不言自明。
在速度上没有差异(我测试了它)并且执行计划是相同的
如果查询优化器正在执行其工作,那么这些查询之间应该没有区别。它们只是两种指定相同结果的方法。
答案 4 :(得分:2)
The SELECT * FROM table1, table2, etc.
适用于几个表,但随着表数的增加,它会变得指数级增加。
JOIN
语法明确了哪些条件会影响哪些表(给出条件)。另外,第二种方式是较旧的标准。
虽然,对于数据库来说,最终会成为相同的