简单加入vs. Where子句

时间:2014-01-23 16:37:52

标签: mysql sql

以下查询是否相同?或者是否有任何重大差异(表现)?

SELECT 
   u.id, u.username, u.name 
FROM 
   `friends` f, `user` u
WHERE 
   (f.friend_id = u.id AND f.user_id = 2 AND f.fstatus = 1)

SELECT 
   u.id, u.username, u.name 
FROM 
   `friends` f
LEFT JOIN user u ON (f.friend_id = u.id)
WHERE 
   (f.user_id = 2 AND f.fstatus = 1)

1 个答案:

答案 0 :(得分:5)

不,从技术上讲,这些查询不一样:第一个查询不会列出朋友,除非user表中有相应的项目。虽然不应该发生friends行没有对应的user(在关系数据库中具有正确定义的参照完整性约束的外键冲突),但理论上的差异仍然存在。 / p>

第一个查询检查条件f.friend_id = u.id,如果条件不满足则抛出连接的两边(即它是内部连接)。第二个查询具有外部联接,该联接是使用LEFT关键字引入的。因此,即使第二个表中没有相应的行,第二个查询也会保留第一个表的行。