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

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

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

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

SELECT *

FROM Person

JOIN Worker

ON Person.id = Worker.id;

SELECT *

FROM Person,

Worker

WHERE Person.id = Worker.id;

谢谢

完全没有区别。

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

性能有什么不同吗?PostgreSQL怎么样?

性能绝对没有差别。在这两种情况下,由SQL Server准备的最终版本是相同的。

对于更大的查询,我会说第一种方法更具可读性。如果您有一个混合左联接和一些内部联接,那么在联接子句中使用联接条件要比在联接子句中使用一些条件和在WHERE子句中使用一些条件一致得多。

第一种方法是更加可读和明确

这个答案不正确。在dev.mysql.com/doc/refman/5.5/en/join.html页面上的mysql手册中,它指出:"但是,逗号运算符的优先级低于内部联接、交叉联接、左联接等。如果在存在联接条件时将逗号联接与其他联接类型混合,则可能会出现"on子句"中未知列"col_name"的格式错误。

@CaptainPayAlytic:问题中给出的两个查询在逻辑上是等效的。正如你指出的,这两个符号实际上是有区别的。(我同意你的看法,这个答案是错误的。实际上,这两个查询之间存在差异…我们可以说,一个使用旧的逗号语法进行连接操作,另一个使用join关键字。)

除前面的注释外,使用第一种格式,您可以将所有联接条件分组到ON子句中,让WHERE子句为您的数据指定筛选器(注意,可以编写用作筛选器的联接条件,但一般来说,保持这种做法会使代码更具可读性)。

这些查询在逻辑上是等价的。逗号运算符等价于[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=1上的交叉联接或内部联接。它的优先级低于关键字联接。上的内部联接是用逗号和where定义的。

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

让我们看一个例子:

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

SELECT

*

FROM table1, table2

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

SELECT

*

FROM table1 table2

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

如果table1和table2是无关的,我会把这里的FROM逗号语法放在可选的和更冗长的INNER JOIN table2 ON 1 = 1之上,因为ON谓词是多余的。

@Mattarnold:对于MySQL,ON子句是可选的。ON 1=1没有作用,是不必要的。此外,inner关键字是可选的,没有任何效果。也就是说,FROM table1 JOIN table2就足够了,尽管在这种情况下,在on或where子句中没有连接条件,我们可以包括可选的CROSS关键字,以帮助将来的读者。帮助读者理解缺少连接条件是有意的。即FROM table1 CROSS JOIN table2。我认为这种形式比逗号语法更清楚地传达了我们的意图。

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

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

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

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

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

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

指数难度?怎样?为了谁?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值