这两种联合表方法之间的区别?

时间:2011-03-14 03:03:29

标签: mysql sql join

考虑我们有两个表,UsersPostsuser_idPosts表中的外键,是Users表中的主键。

这两个sql查询之间的区别是什么?

select user.name, post.title 
  from users as user, posts as post 
 where post.user_id = user.user_id;

VS

select user.name, post.title 
  from users as user join posts as post using user_id;

4 个答案:

答案 0 :(得分:13)

除了语法之外,对于小片段,它们的工作方式完全相同。但是,如果可能的话,总是使用ANSI-JOINs编写新的查询。

至于语义上,逗号表示法用于在两个表之间生成CARTESIAN产品,这意味着从表A生成包含表B中所有记录的所有记录的矩阵,因此两个表分别有4个和6个记录产生24记录。然后,使用WHERE子句,您可以从此笛卡尔积中选择实际需要的行。然而,MySQL并没有真正贯彻并制造出这个巨大的矩阵,但从语义上讲,这就是它的含义。

JOIN语法是ANSI标准,它更清楚地定义了表的交互方式。通过将ON子句放在JOIN旁边,可以清楚地将两个表链接在一起。

从功能上讲,他们将对您的两个查询执行相同的操作。当您开始使用其他[OUTER] JOIN类型时会出现差异。

对MySQL而言,特别是逗号does have one difference

  

STRAIGHT_JOIN类似于JOIN,只是左表始终在右表之前读取。这可以用于连接优化器以错误的顺序放置表的那些(少数)情况。

然而,not be wise会依据这种差异来解决问题。

答案 1 :(得分:4)

where post.user_id = user.user_id

您在这里制作条件陈述

from users as user join posts as post using user_id

这里使用外键

连接两个表

最后是相同的,但JOIN更适合用于更高级的查询...

答案 2 :(得分:3)

在MySQL JOIN syntax中,CROSS JOININNER JOINJOIN都是相同的。以逗号分隔的表格列表为JOIN

答案 3 :(得分:0)

https://dev.mysql.com/doc/refman/5.5/en/join.html页的MySQL手册就两种方法之间的区别提出了这一点:

  

但是,逗号运算符的优先级小于   内部联接,交叉联接,左联接等。如果您混合使用逗号联接   与其他联接类型存在联接条件时,错误为   可能会出现“ on子句”中的“未知列” col_name”形式。