【发布时间】:2011-01-15 20:22:25
【问题描述】:
在我看来,您可以在 SQL 查询中使用 NOT EXISTS、NOT IN 或 LEFT JOIN WHERE IS NULL 来执行相同的操作。例如:
SELECT a FROM table1 WHERE a NOT IN (SELECT a FROM table2)
SELECT a FROM table1 WHERE NOT EXISTS (SELECT * FROM table2 WHERE table1.a = table2.a)
SELECT a FROM table1 LEFT JOIN table2 ON table1.a = table2.a WHERE table1.a IS NULL
我不确定我的所有语法是否正确,但这些是我见过的一般技术。为什么我会选择使用其中一种?性能不同吗...?其中哪一个是最快/最有效的? (如果取决于实现,我什么时候会使用每个?)
【问题讨论】:
-
许多常见的 SQL 引擎让您能够查看执行计划。通过这种方式,您通常可以发现逻辑等效查询的效率显着差异。任何方法的成功都取决于表大小、存在的索引等因素。
-
@wich:没有数据库关心您在
EXISTS子句中返回的确切内容。您可以返回*、NULL或其他任何内容:所有这些都将被优化掉。 -
@wich - 为什么?这里:techonthenet.com/sql/exists.php 和这里:msdn.microsoft.com/en-us/library/ms188336.aspx 似乎都使用 *...
-
@wich:这不是“表达兴趣”。这是关于查询解析器要求您在
SELECT和FROM之间放置一些内容。*更容易输入。是的,SQL确实与自然语言有一些相似之处,但它是由一台机器解析和执行的,一台经过编程的机器。并不是说它会突然闯入您的隔间并大喊“停止要求EXISTS查询中的额外字段,因为我已经厌倦了解析它们然后将它们扔掉!”。用电脑没问题,真的。 -
@Quassnoi 如果您编写代码的唯一目的是让机器解释它,那么代码看起来会很糟糕,不幸的是,很多人都是这样工作的。但是,如果您用另一种方式编写代码,编写代码来表达您希望机器执行的操作作为与您的同行的公报,您将编写更好、更易于维护的代码。聪明点,为人写代码,而不是为电脑写代码。
标签: sql