左连接或使用逗号(,)从多个表中选择
左连接或使用逗号(,)从多个表中选择
我很好奇为什么我们需要使用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
在上述内容中,讨论了使用逗号(,)进行联接(JOIN)或从多个表中进行选择的问题。下面将对问题的出现原因和解决方法进行整理。
问题的出现原因:
在上述内容中,提到将JOIN与WHERE条件分离开来可以提高代码的可读性,并且通常会更快,因为服务器不需要进行两个单独的查询并合并结果。这暗示了使用逗号进行表联接可能导致代码可读性差、执行效率低下的问题。
问题的解决方法:
上述内容给出了一个更好的示例,展示了如何使用逗号进行表联接:
SELECT vs.*, mw.* FROM vocab_stats vs, mst_words mw LEFT JOIN vocab_stats vs ON mw.no = vs.vocab_no WHERE vs.correct > 0 AND mw.level = 1 AND vs.owner = 1111
这个示例中,使用了逗号将两个表vocab_stats和mst_words进行联接。然后,通过LEFT JOIN将vocab_stats表与自身进行联接,并在WHERE子句中添加了一些条件。
通过这种方式,可以清晰地将联接逻辑与WHERE条件区分开来,提高代码的可读性。此外,由于只执行了一次查询,而不是两次并合并结果,这种方法还可以提高执行效率。
通过上述内容,我们了解了在使用逗号进行表联接时可能出现的问题以及如何解决这些问题。通过将JOIN与WHERE条件分离开来,可以提高代码的可读性,并且在性能方面也有所提升。因此,在编写SQL查询时,应当尽量避免过度使用逗号进行表联接,而是选择合适的联接方式来编写清晰、高效的代码。
左连接或使用逗号(,)从多个表中选择的问题出现的原因是查询中的语法错误和对连接操作的理解不准确。在给出的示例查询中,使用了LEFT JOIN关键字,但实际上应该使用INNER JOIN关键字。此外,查询中的语法也有一些问题,需要进行修正。
解决方法是将查询中的LEFT JOIN关键字更改为INNER JOIN关键字,并对查询语法进行调整以保证查询的正确性。修正后的查询如下所示:
SELECT mw.*, nvs.* FROM mst_words mw INNER JOIN (SELECT * FROM vocab_stats WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no WHERE (nvs.correct > 0) AND mw.level = 1
修正后的查询将返回与原查询相同的结果,但使用了更准确的连接操作和修正后的语法。
在修正后的查询中,我们使用了INNER JOIN关键字来表示表之间的连接操作。INNER JOIN只返回两个表中满足连接条件的行。修正后的查询还使用了子查询来获取符合条件的vocab_stats记录。最后,我们使用WHERE子句对查询结果进行过滤,以满足所需的条件。
需要注意的是,LEFT JOIN和INNER JOIN是数据库中常用的连接操作。LEFT JOIN返回左表中的所有记录以及与右表中满足连接条件的记录。而INNER JOIN只返回满足连接条件的记录。另外,还有RIGHT JOIN和FULL OUTER JOIN等其他类型的连接操作,但在本文中没有进行详细讨论。
修正后的查询语句不仅正确地执行了连接操作,还提高了查询的性能。使用INNER JOIN关键字可以避免数据库系统错误地解释查询意图并生成错误的查询计划。
总之,正确理解连接操作的语法和使用适当的连接关键字是编写正确的查询语句的关键。修正语法错误和使用准确的连接关键字可以确保查询的正确性和性能。