设为首页 加入收藏

TOP

“NOT_IN”与“NULL”的邂逅(二)
2014-11-24 08:09:26 来源: 作者: 【 】 浏览:7
Tags:NOT_IN NULL 邂逅
no in(select deptno from emp)
3 /

DNAME
--------------
RESEARCH
SALES
ACCOUNTING


SQL> select dname from dept
2 where exists(select * from emp where emp.deptno=dept.deptno)
3 /

DNAME
--------------
RESEARCH
SALES
ACCOUNTING

而NOT IN一般可以改为NOT EXISTS:

SQL> select dname from dept
2 where deptno not in(select deptno from emp where deptno is not null)
3 /

DNAME
--------------
OPERATIONS

SQL> select dname from dept
2 where not exists(select * from emp where dept.deptno=emp.deptno)
3 /

DNAME
--------------
OPERATIONS

使用NOT EXISTS,即使子查询中包含NULL值,也会得到正确结果。原因是:

select * from emp where dept.deptno=null不会有返回值,这样,EXISTS(select * from emp where dept.deptno=null)返回的布尔值为false,而 NOT(false)显然为TRUE,其他条件与之作and后,依然得到true。

而在NOT IN子句中,是NOT(deptno=null),即NOT(unkown),结果依然为unkown,而unkown被当作false,其他条件与之作and后,最后得到false。

NOT EXISTS(select * from emp where dept.deptno=null) ===>

NOT (false) ===>TRUE

所以子查询中的null不会影响其他的查询结果。

EXISTS可以改为使用表连接语法:

SQL> select dname from dept
2 where exists(select * from emp where emp.deptno=dept.deptno)
3 /

DNAME
--------------
RESEARCH
SALES
ACCOUNTING

SQL> select

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇OCP043第十四讲Automating Tasks .. 下一篇Oracle触发器中select into报错no..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·我的Linux内核学习笔 (2025-12-26 22:21:10)
·如何评价腾讯开源的 (2025-12-26 22:21:07)
·为什么TCP网络编程中 (2025-12-26 22:21:04)
·Python 数据分析与可 (2025-12-26 21:51:20)
·从零开始学Python之 (2025-12-26 21:51:17)