猿问

“不存在”与“左联接”之间有什么区别?

“不存在”与“左联接”之间有什么区别?

在我看来,您可以在SQL查询中使用“不存在”、“不使用IN”或“左联接为空”来执行相同的操作。例如:

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

我不确定是否所有语法都是正确的,但这是我所见过的一般技巧。我为什么要选择一个而另一个呢?表现不同吗.?其中哪一个是最快/最有效的?(如果这取决于实现,何时使用?)


哈士奇WWW
浏览 512回答 3
3回答

HUX布斯

非IN与不存在与左联接/ISNULL:SQLServerNOTIN vs NOTISTISHONJOIN/ISNULL:PostgreSQLNotIN与NotReasvs.LeftJoin/is null:OracleNOTIN vs NOTISRESTONJOIN/ISNULL:MySQL简而言之:NOT IN有点不同:如果只有一个NULL在名单上。在……里面MySQL, NOT EXISTS效率有点低在……里面SQL Server, LEFT JOIN / IS NULL效率较低在……里面PostgreSQL, NOT IN效率较低在……里面Oracle,这三种方法都是相同的。

MYYA

如果数据库擅长优化查询,那么第一个查询将被转换为接近第三个查询的查询。对于问题中的简单情况,应该很少或根本没有区别,因为它们都将以联接的形式执行。在更复杂的查询中,数据库可能无法从not in和not exists开雷耶斯。在这种情况下,查询将变得更慢。另一方面,如果没有可以使用的索引,联接也可能执行不好,所以仅仅因为使用联接并不意味着您是安全的。您必须检查查询的执行计划,以判断是否存在性能问题。

小怪兽爱吃肉

假设您正在避免空值,它们都是编写反连接使用标准SQL。一个明显的遗漏是等效的使用EXCEPT:SELECT a FROM table1EXCEPTSELECT a FROM table2注在Oracle中,您需要使用MINUS运算符(可以说是一个更好的名称):SELECT a FROM table1 MINUSSELECT a FROM table2说到专有语法,也可能有非标准的等价物值得研究,这取决于您正在使用的产品。OUTER APPLY在SQLServer中(类似于):SELECT t1.a  FROM table1 t1       OUTER APPLY         (         SELECT t2.a          FROM table2 t2         WHERE t2.a = t1.a       ) AS dt1 WHERE dt1.a IS NULL;
随时随地看视频慕课网APP
我要回答