我很好奇为什么需要使用,LEFT JOIN因为我们可以使用逗号选择多个表。
LEFT JOIN
LEFT JOIN和使用逗号选择多个表之间有何区别?
哪一个更快?
这是我的代码:
SELECT mw.*, nvs.* FROM mst_words mw LEFT JOIN (SELECT no as nonvs, owner, owner_no, vocab_no, correct FROM vocab_stats WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no WHERE (nvs.correct > 0 ) AND mw.level = 1
…和:
SELECT * FROM vocab_stats vs, mst_words mw WHERE mw.no = vs.vocab_no AND vs.correct > 0 AND mw.level = 1 AND vs.owner = 1111
首先,要完全等同,应该已经编写了第一个查询
SELECT mw.*, nvs.* FROM mst_words mw LEFT JOIN (SELECT * FROM vocab_stats WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no WHERE (nvs.correct > 0 ) AND mw.level = 1
这样mw。和nvs。一起产生与第二个查询的单数*相同的集合。您编写的查询可以使用INNER JOIN,因为它包括对nvs.correct的过滤器。
一般形式
TABLEA LEFT JOIN TABLEB ON <CONDITION>
attempts 查找基于条件的TableB记录。如果失败,将保留来自TABLEA的结果,并将来自TableB的所有列都设置为NULL。相比之下
attempts
TABLEA INNER JOIN TABLEB ON <CONDITION>
还 attempts 可以根据条件查找TableB记录。 但是 ,如果失败,则将TableA中的特定记录从输出结果集中删除。
CROSS JOIN的ANSI标准在两个表之间产生笛卡尔乘积。
TABLEA CROSS JOIN TABLEB -- # or in older syntax, simply using commas TABLEA, TABLEB
语法的意图是将TABLEA中的EACH行与TABLEB中的EACH行连接在一起。因此,A中的4行和B中的3行会产生12行输出。与WHERE子句中的条件配对时,有时会产生INNER JOIN相同的行为,因为它们表达的是相同的东西(A和B之间的条件=>保持或不保持)。但是,在阅读有关使用INNER JOIN而不是逗号的意图时,它要清晰得多。
在性能方面,大多数DBMS处理LEFT联接的速度要比INNER JOIN更快。逗号表示法可能导致数据库系统误解其意图并产生错误的查询计划- SQL92表示法的另一优点。
为什么我们需要左加入? 如果上面对LEFT JOIN的解释仍然不够(保留A中的记录而B中没有匹配项),则认为要达到相同的效果,您将需要使用旧的逗号将两组之间的UNION复杂化以达到相同的效果。 但是,如前所述 ,这不适用于您的示例,它实际上是一个隐藏在LEFT JOIN后面的INNER JOIN。
笔记:
LEFT OUTER JOIN