这里我说说容易被忽略的NOT IN和NOT EXISTS小区别。
惯例先看例子
- 例子相关表基础数据展示
<pre name="code" class="sql">select * from dept;
CD NM
--- --
001 D1
002 D2
003 D3
select * from emp;
CD NM CCD
---------- -- ---
1 N1 001
2 N2 001
3 N3 002
4 N4
- NOT IN结果数据
<div><pre name="code" class="sql">SELECT *
FROM dept t
WHERE t.cd NOT IN (SELECT ccd FROM emp);
--查询无数据返回
</pre></div>
- NOT EXISTS结果数据
SELECT *
FROM dept t
WHERE NOT EXISTS (SELECT 1
FROM emp t1
WHERE t1.ccd = t.cd);
CD NM
--- --
003 D3
结论及分析:
从上面两个语句看出NOT IN和NOT EXISTS从功能上来说并不是等价的。
NOT IN其实可以为!=ANY,可以理解为NOT IN在将进行一个循环比较,如果找到一个匹配的值则丢弃这条记录。没有找到匹配则返回记录。
但是大家别忘记了有一个NULL是Oracle不知道是否匹配的情况。但是得记住NULL与任何值都不想等,即使是另外一个NULL。但是在NOT IN这里它是整体结果为未知,所以不予返回记录。
NOT EXISTS则不存在这个问题。