考虑我们有两个表,Users和Posts。user_id是Posts表中的外键,并且是表中的主键Users。
Users
Posts
user_id
这两个SQL查询之间有什么区别?
select user.name, post.title from users as user, posts as post where post.user_id = user.user_id;
与
select user.name, post.title from users as user join posts as post using user_id;
除语法外,对于小片段,它们的工作原理完全相同。但是,如果有可能,请始终使用ANSI-JOIN编写新查询。
至于语义上,逗号用于在两个表之间生成CARTESIAN乘积,这意味着生成表A中的所有记录与表B中的所有记录的矩阵,因此具有4和6条记录的两个表分别生成24个记录。然后,使用WHERE子句,可以从此笛卡尔积中选择实际需要的行。但是,MySQL实际上并没有遵循并建立这个庞大的矩阵,但是从语义上讲,这就是它的意思。
JOIN语法是ANSI标准,可以更清楚地定义表之间的交互方式。通过将该ON子句放在旁边JOIN,可以使两个表链接在一起。
ON
JOIN
从功能上讲,它们将对您的两个查询执行相同的操作。开始使用其他[OUTER]JOIN类型时会有所不同。
[OUTER]
特别是对于MySQL,逗号符号确实有一个区别
STRAIGHT_JOIN与JOIN相似,不同之处在于总是在右表之前读取左表。这可以用于联接优化器将表以错误的顺序放置的那些(很少)情况。
但是,利用这种差异是不明智的。