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
    评论
### 回答1: MySQL的JOIN语句用于将两个或多个表的数据行连接起来,生成一个结果集。JOIN语句的基本语法如下: SELECT 列名1, 列名2, ... FROM 表名1 JOIN 表名2 ON 连接条件 其,列名是要查询的字段名称,表名是要连接的表名称,连接条件是连接两个表的条件,可以使用“=”、“<”、“>”、“<=”、“>=”等运算符进行比较。 JOIN语句可以使用不同的连接类型,包括INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN等。INNER JOIN是最常用的连接类型,它只返回两个表匹配的行。 例如,如果有两个表A和B,它们有一个共同的字段id,那么可以使用INNER JOIN将它们连接起来: SELECT A.id, A.name, B.address FROM A INNER JOIN B ON A.id = B.id; 这个查询语句将返回表A和表Bid字段相等的行,并且返回A表的name字段和B表的address字段。 除了INNER JOIN之外,还可以使用LEFT JOIN和RIGHT JOIN等连接类型。LEFT JOIN返回左表所有的行和右表匹配的行,如果右表没有匹配的行,则返回NULL值;RIGHT JOIN则返回右表所有的行和左表匹配的行,如果左表没有匹配的行,则返回NULL值。 注意,在使用JOIN语句时,需要确保连接条件正确,否则可能会返回错误的结果。 ### 回答2: MySQL的JOIN语句用于从多个表检索数据,并根据指定的关联条件将它们连接在一起。JOIN操作可以按需从表选取相应的字段组合成新的结果集。 JOIN语句的基本语法如下: SELECT 对应字段 FROM 表1 JOIN 表2 ON 条件; JOIN语句的关键字有INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN。这些关键字决定了连接类型。 1. INNER JOIN(内连接):返回两个表的匹配记录。 语法:SELECT 对应字段 FROM 表1 INNER JOIN 表2 ON 条件; 2. LEFT JOIN(左连接):返回左表的所有记录以及右表匹配的记录。 语法:SELECT 对应字段 FROM 表1 LEFT JOIN 表2 ON 条件; 3. RIGHT JOIN(右连接):返回右表的所有记录以及左表匹配的记录。 语法:SELECT 对应字段 FROM 表1 RIGHT JOIN 表2 ON 条件; 4. FULL OUTER JOIN(全外连接):返回左右表的所有记录。 语法:SELECT 对应字段 FROM 表1 FULL OUTER JOIN 表2 ON 条件; 在条件(ON 子句),可以使用等于(=)、大于(>)、小于(<)、不等于(<>)等操作符进行比较,还可以使用AND和OR逻辑运算符组合多个条件。 表1和表2之间的连接条件可以是简单的列名比较,也可以是复杂的条件表达式。JOIN语句还可以连接多个表,在FROM子句通过逗号分隔表名,并按照连接顺序指定JOIN关键字和条件。 JOIN语句的使用可以根据具体的需求确定,通过合理使用连接类型和连接条件可以灵活处理各种数据关联需求,实现数据的表之间的联接。 ### 回答3: MySQL的JOIN语句用于将两个或多个表的行连接在一起,以便可以根据它们之间的关系检索相关数据。JOIN语句通过共享数据列将表连接在一起,以便在查询结果能够使用关联的数据。 常见的JOIN类型包括: 1. INNER JOIN:表示只返回两个表匹配的行,即两个表连接列的值相等的行。 2. LEFT JOIN:返回左表的所有行,并包括与右表匹配的行。如果右表没有匹配的行,则返回NULL值。 3. RIGHT JOIN:与LEFT JOIN相反,返回右表的所有行,并包括与左表匹配的行。如果左表没有匹配的行,则返回NULL值。 4. FULL OUTER JOIN:返回两个表的所有行,如果没有匹配的行,则返回NULL值。 JOIN语句的基本语法如下: SELECT 列名 FROM 表1 JOIN 表2 ON 表1.列 = 表2.列; 例如,假设有两个表students和grades,students表包含学生的ID、姓名和年龄,grades表包含学生的ID和考试成绩。要找出每个学生的姓名和考试成绩,可以使用以下SQL查询: SELECT students.姓名, grades.考试成绩 FROM students JOIN grades ON students.ID = grades.ID; 这将返回一个结果集,其包含每个学生的姓名和对应的考试成绩。 需要注意的是,为了避免数据冗余和提高查询性能,JOIN操作应该尽量避免表之间的重复数据,确保连接列上有正确的索引,并使用适当的JOIN类型来满足查询需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值