考虑我们有两个表,Users
和Posts
。 user_id
是Posts
表中的外键,是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;
答案 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 JOIN
,INNER JOIN
和JOIN
都是相同的。以逗号分隔的表格列表为JOIN
。
答案 3 :(得分:0)
第https://dev.mysql.com/doc/refman/5.5/en/join.html页的MySQL手册就两种方法之间的区别提出了这一点:
但是,逗号运算符的优先级小于 内部联接,交叉联接,左联接等。如果您混合使用逗号联接 与其他联接类型存在联接条件时,错误为 可能会出现“ on子句”中的“未知列” col_name”形式。