子查询
1. 单行子查询除了可以放在WHERE子句中,还可以放在HAVING子句中和FROM子句中。在书写单行子查询的时候要注意以下要求:
单行子查询使用单行比较关系符。
单行子查询放在单行比较关系符的右边
单行子查询放在括号中
单行子查询中不能使用ORDER BY子句。
select empno,ename,sal,job
from emp
where job =
(
select job
from emp
where ename = 'SMITH'
)
2. HAVING子句中的单行子查询
select job,min(sal),avg(sal),max(sal)
from
emp
where job not like 'presid%'
group by job
having avg(sal) >
(
select min(avg(sal))
from emp
group by job
)
3. FROM子句中的单行子查询
SQL> selecte.empno,e.ename,e.sal,e.job,a.avesal
2 fromemp e,(select job,avg(sal) avesal
3 fromemp
4 group by job) a
5 where e.job = a.job
6 ande.sal > a.avesal
7 ande.job <>'CLERK';
4. 使用IN操作符的多行子查询
比较操作符IN的含义是为子查询返回列表中的任何一个。
1 select empno,ename,job,sal
2 from
3 emp
4 where sal in
5 (select max(sal) from emp
6 group by job)
7 and job <> 'CLERK'
8 and job NOT LIKE
9* 'PRES%'
4. 使用ALL操作符的多行子查询
ALL操作符比较子查询返回列表中的每一个值。<ALL 为小于最小的,>ALL为大于最大的。=ALL 为等于ALL中的所用值,即ALL中的值全相同。
selectempno,ename,job,sal
from emp
where sal <all
(select avg(sal)
from emp
group by job
);
5. 使用ANY操作符的多行子查询
ANY操作符比较子查询返回列表中的每一个值。<ANY 为小于最大的,>ANY为大于最小的,那么等于ANY 相当于IN.
SQL> selectempno,ename,job,sal
2 fromemp
3 where sal > ANY(select avg(sal)
4 fromemp group by job);
6. 子查询中的空值问题
7. 多列子查询
成对比较多列子查询(Pairwise Comparison)
非成对比较子查询(Nonpairwise Comparison)