MySQL中逗号分隔的连接和语法连接之间有什么区别?

Big*_*ney 86 mysql sql syntax join

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

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

SELECT * 
FROM Person 
JOIN Worker 
  ON Person.id = Worker.id;
Run Code Online (Sandbox Code Playgroud)

SELECT * 
FROM Person, 
     Worker 
WHERE Person.id = Worker.id;
Run Code Online (Sandbox Code Playgroud)

谢谢

sat*_*esh 50

完全没有区别.

第二种表示使查询更具可读性,并使得哪种连接对应于哪种条件看起来非常清楚.

  • 对于较大的查询,我会说第一种方式更具可读性.如果你有一个混合左连接和一些内连接,那么在连接子句上有连接条件,而不是在连接中的一些和在where子句中的一些条件更加一致. (55认同)
  • 第一种方式更具可读性和显性 (5认同)
  • 性能上绝对没有区别。SQL Server 准备的最终版本在这两种情况下都是相同的。 (2认同)
  • 这个答案是不正确的.在https://dev.mysql.com/doc/refman/5.5/en/join.html页面上的MySQL手册中,它指出:"但是,逗号运算符的优先级小于INNER JOIN,CROSS JOIN的优先级. ,LEFT JOIN等等.如果在存在连接条件时将逗号连接与其他连接类型混合,则可能会出现"on子句"中未知列'col_name'形式的错误" (2认同)
  • @CaptainPayalytic:问题中给出的两个查询在逻辑上是等效的。正如您所指出的,这两种表示法实际上是有区别的。(我同意你的观点,这个答案是错误的。事实上,两个查询之间存在*差异*...我们可以说,一个使用旧式逗号语法进行连接操作,另一个使用 JOIN 关键字.) (2认同)

spe*_*593 32

查询在逻辑上是等效的.逗号运算符等同于[INNER] JOIN运算符.

逗号是旧式连接运算符.JOIN关键字稍后添加,并且受到青睐,因为它还允许OUTER连接操作.

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

  • 逗号是CROSS JOIN或INNER JOIN ON 1 = 1.它的优先级低于关键字连接.INNER JOIN ON是用逗号和WHERE定义的. (2认同)

vel*_*ije 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
)
Run Code Online (Sandbox Code Playgroud)

以下查询将为我提供两个表中的所有列和行

SELECT
    *
FROM table1, table2
Run Code Online (Sandbox Code Playgroud)

以下查询将为我提供第一个表中的列,其中包含名为"table2"的表别名

SELECT
    *
FROM table1 table2
Run Code Online (Sandbox Code Playgroud)

如果您在逗号分隔的连接中错误地忘记了逗号,则第二个表会自动转换为第一个表的表别名.并非在所有情况下,但有机会这样的事情


vha*_*lgi 6

使用 JOINS 使代码更易于阅读,因为它是不言自明的。

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

如果查询优化器的工作正常,那么这些查询之间应该没有区别。它们只是指定相同所需结果的两种方法。