子查询中的NULL问题
子查询返回有单行,多行和null值;适用于单行子查询的比较运算符是=,>,>=,<,<=<>和!=。适用于多行子查询的比较运算符是in,not in,any和any。在子查询中不可回避的是会返回null值,下面就这个问题来讨论一下。
SQL> select last_name,department_id from employees where department_id is null;
LAST_NAME DEPARTMENT_ID
------------------------- -------------
Grant
先来查看一下employees表中的department_id,它有个null值。
SQL> select last_name,department_id from employees
where department_id=(select department_id from employees where last_name='Haus');
no rows selected
在employees表中没有一行的last_name是等于Haus的,故子查询返回null值。由上面的查询知道department_id是有null值的,那没有显示呢?
SQL> select employee_id,manager_id from employees where manager_id is null;
EMPLOYEE_ID MANAGER_ID
----------- --- -------
100
先来查看一下employees表中的manager_id,它有个null值。
SQL> select last_name from employees where employee_id not in (select manager_id from
employees );
no rows selected
那这个为什么也没有显示?我们来先看一下in
SQL> select last_name from employees emp where emp.employee_id in (select manager_id from employees);
LAST_NAME
-------------------------
Cambrault
De Haan
Errazuriz
Fripp
这里用in可以显示了。这个原因是因为not in 和in本质上都是OR运算,但是计算逻辑OR时处理NULL的方式不同,产生的结果也不同。
select last_name from employees where employee_id not in (select manager_id from
employees );
子查询select manager_id from employees会产生很多值而且有一个NULL值,它们之间是OR的关系,假设manager_id是10,11和NULL,那么可以把上面的句子改为:
select last_name from employees where employee_id not in (10,11,null);
其中where employee_id not in (10,11,null)等价于where no (employee_id=10 or employee_id=11 or employee_id=null),拿employee_id=12来说明一下。
select last_name from employees emp where emp.employee_id in (select manager_id from employees);
按照上面的方法,假设manager_id是10,11和NULL,则句子改为:
select last_name from employees where employee_id not in (10,11,null);
其中where employee_id in (10,11,null)等价于where (employee_id=10 or employee_id=11 or employee_id=null),拿employee_id=10来说明一下。
最新文章
- 记一次Suse下的Django环境配置——第一弹
- 使用Jmeter录制web脚本
- IntelliJ IDEA 使用说明(For Eclipse user)
- mysql-advanced-5.6.23-linux-glibc2.5-x86_64安装
- IP的正则表达式
- (转)Yale CAS + .net Client 实现 SSO(6)
- 体验Azure的 Automation “自动化” 服务预览版
- 回溯算法————n皇后、素数串
- 微信支付 v 3.3.6
- js判断是否使用的是微信浏览器
- 大数据Hadoop学习之搭建hadoop平台(2.2)
- Spark学习笔记2(spark所需环境配置
- [LeetCode] Maximum Distance in Arrays 数组中的最大距离
- Linux服务器查看外网IP地址的命令
- Xamarin.Android多窗口传值【1】
- RESTful API 最佳实践----转载阮一峰
- python2.x 与 python3.x的不同
- 【BZOJ3551】【BZOJ3545】 【ONTAK2010】 Peaks (kruskal重构树+主席树)
- hive进行词频统计
- Hibernate Criteria用法大全