1、单行子查询
select * from emp
where sal > (select sal from emp where empno=7566)
2、子查询空值\多值问题
如果子查询未返回任何行,则主查询不会返回任何结果。
(空值)select * from emp where sal>(select sal from where empno=8888)
如果子查询返回单行结果,则为单行子查询,可以在主查询中对其使用相应的单行记录比较运算符。
(正常) select * from emp where sal>(select sal from where empno=7566)
如果子查询返回多行结果,则为多行子查询,此时不允许对其使用单行记录比较运算符。
(多值)select * from emp where sal >(select avg(sal) from emp group by deptno); //非法
3、多行子查询
1、 in
用等号表示1对1,in表示一个范围,用来处理子查询返回多条记录
select * from emp where job in
(select distinct job from emp where deptno=10) --这里的select
2、all
虽然in能解决多行等号的问题,但是要和子查询结果中字段比较大小呢,下面用操作符来解决。
select * from emp where sal>
all (select sal from emp where deptno=30) --这里的select查询返回多行记录
3、 any
select * from emp where sal>
any (select sal from emp where deptno=30) --这里的select查询返回多行记录
这段代码表示:检索出emp表,只检索那些(只要比子查询的结果集的任意一行大)就行的数据行,所以上面的代码也相当于: