为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哈士奇WWW 2019-06-15 13:04:00
“不存在”与“左联接”之间有什么区别?在我看来,您可以在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我不确定是否所有语法都是正确的,但这是我所见过的一般技巧。我为什么要选择一个而另一个呢?表现不同吗.?其中哪一个是最快/最有效的?(如果这取决于实现,何时使用?)
查看完整描述

3 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

简而言之:

NOT IN有点不同:如果只有一个NULL在名单上。

  • 在……里面MySQLNOT EXISTS效率有点低

  • 在……里面SQL ServerLEFT JOIN / IS NULL效率较低

  • 在……里面PostgreSQLNOT IN效率较低

  • 在……里面Oracle,这三种方法都是相同的。


查看完整回答
反对 回复 2019-06-15
?
MYYA

TA贡献1868条经验 获得超4个赞

如果数据库擅长优化查询,那么第一个查询将被转换为接近第三个查询的查询。

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


查看完整回答
反对 回复 2019-06-15
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

假设您正在避免空值,它们都是编写反连接使用标准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;


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 511 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信