关于sql:MySQL中逗号分隔的连接和语法连接有什么区别?

What's the difference between comma separated joins and join on syntax in MySQL?

本问题已经有最佳答案,请猛点这里访问。

例如,如果我有一个表"person",其列"id"引用表"worker"中的列"id"

这两个查询之间的区别是什么?它们产生相同的结果。

1
2
3
4
SELECT *
FROM Person
JOIN Worker
  ON Person.id = Worker.id;

1
2
3
4
SELECT *
FROM Person,
     Worker
WHERE Person.id = Worker.id;

谢谢


完全没有区别。

第二种表示形式使查询更具可读性,并使查询看起来非常清楚哪个联接对应于哪个条件。


这些查询在逻辑上是等价的。逗号运算符等价于[INNER] JOIN运算符。

逗号是旧样式的联接运算符。join关键字是在后面添加的,因为它还允许外部联接操作,所以比较受欢迎。

它还允许将连接谓词(条件)与WHERE子句分隔成ON子句。这提高了(人类)的可读性。

跟进

此答案表示问题中的两个查询是等效的。在同一个查询中,我们不应该将旧的join操作逗号语法与新的JOIN关键字语法混合使用。如果我们真的混合了它们,我们需要知道优先级顺序的不同。

摘自MySQL参考手册

https://dev.mysql.com/doc/refman/5.6/en/join.html网站

INNER JOIN and , (comma) are semantically equivalent in the absence of a join condition: both produce a Cartesian product between the specified tables (that is, each and every row in the first table is joined to each and every row in the second table).

However, the precedence of the comma operator is less than that of INNER JOIN, CROSS JOIN, LEFT JOIN, and so on. If you mix comma joins with the other join types when there is a join condition, an error of the form Unknown column 'col_name' in 'on clause' may occur. Information about dealing with this problem is given later in this section.


除了可读性更好之外,还有一种情况是显式联接的表更好,而不是逗号分隔的表。

让我们看一个例子:

1
2
3
4
5
6
7
8
9
10
11
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
)

下面的查询将给出两个表中的所有列和行

1
2
3
SELECT
    *
FROM table1, table2

下面的查询将给出表别名为"table2"的第一个表中的列

1
2
3
SELECT
    *
FROM table1 table2

如果您错误地忘记了逗号分隔联接中的逗号,则第二个表将自动转换为第一个表的表别名。并非所有情况下都如此,但有可能出现这种情况


使用连接使代码更容易阅读,因为它是不言而喻的。

在速度上没有区别(我测试过),执行计划是相同的

如果查询优化器做得很好,那么这些查询之间应该没有区别。它们只是指定相同期望结果的两种方法。


The SELECT * FROM table1, table2, etc.对于几个表来说是好的,但是随着表的数量的增加,它变得成倍的困难。

JOIN语法明确了什么条件影响哪些表(给出条件)。另外,第二种方法是旧标准。

但是,在数据库中,它们最终是相同的