先看下面的例子:oracle中兩個(gè)系統(tǒng)表.emp,dept. example: 1:not exists(not in) not exists: 這條語(yǔ)句返回select * from scott.dept d where e.deptno=d.deptno and d.deptno=10條件滿足的結(jié)果集.也就是說(shuō), 返回的結(jié)果集中不存在d.deptno=10結(jié)果集的記錄,即emp表中沒有dept表中d.deptno=10的記錄. SQL> select empno,ename,deptno from scott.emp e where not exists(select * from scott.dept d where e.deptno=d.deptno and d.deptno=10); EMPNO ENAME DEPTNO 11 rows selected not in: 第一個(gè)where條件必須給定字段(deptno), 第二個(gè)sql語(yǔ)句中,必須明確給定要查詢的字段是哪個(gè)(deptno). SQL> select empno,ename,deptno from scott.emp e where deptno not in(select deptno from scott.dept d where e.deptno=d.deptno and d.deptno=10); EMPNO ENAME DEPTNO 11 rows selected 2: exists(in) exists: 這條語(yǔ)句返回select * from scott.dept d where e.deptno=d.deptno and d.deptno=10條件滿足的記錄結(jié)果集. 也就是說(shuō)返回的結(jié)果集中只存在有d.deptno=10的記錄,即emp表中只存在dept表中d.deptno=10的記錄. SQL> select empno,ename,deptno from scott.emp e where exists(select * from scott.dept d where e.deptno=d.deptno and d.deptno=10); EMPNO ENAME DEPTNO in: 第一個(gè)where條件必須給定字段(deptno), 第二個(gè)sql語(yǔ)句中,必須明確給定要查詢的字段是哪個(gè)(deptno). SQL> select empno,ename,deptno from scott.emp e where deptno in(select deptno from scott.dept d where e.deptno=d.deptno and d.deptno=10); EMPNO ENAME DEPTNO
oracle 中exists (in)和not exists(not in)是判斷是否存在和不存在表中記錄的關(guān)鍵子. 請(qǐng)注意:not in 邏輯上不完全等同于not exists,如果你誤用了not in,小心你的程序存在致命的BUG:因此,請(qǐng)盡量不要使用not in(它會(huì)調(diào)用子查詢),而盡量使用not exists(它會(huì)調(diào)用關(guān)聯(lián)子查詢)。 |
|
來(lái)自: COPY&PASTE > 《我的圖書館》