标签:
子查询返回有单行,多行和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 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来说明一下。
标签:
原文地址:http://www.cnblogs.com/lulu638/p/4498098.html