前言
考慮到這樣一種情況:查詢員工中有哪些員工的工資比SMITH高。要解決這類問題我們首先要
要的就是將SIMTH的工資查詢出來,之后再將所有員工的工資與其進行比較。那么如何利用第一
次查詢的結果了,就需要用到子查詢了。
子查詢
子查詢其實就是指嵌入到其他語句中的select語句,也稱其為嵌套查詢。值得注意的的在DDL
語句中應用子查詢的時候子查詢可以使用order by 子句。但是在DML語句中的where子句,set子句
中,子查詢是不能使用order by子句的。
簡單例子:查詢工作和SMITH一樣的所有員工的信息(不包含SMITH)
[sql] view plaincopyprint?
select ename ,sal from emp e where job =
(select job from emp where ename = 'SMITH')
and e.ename <> 'SMITH';
select ename ,sal from emp e where job =
(select job from emp where ename = 'SMITH')
and e.ename <> 'SMITH';
子查詢分類
單行子查詢
只返回一條記錄的子查詢 ,就可上述例子一樣
[sql] view plaincopyprint?
--返回工資比SMITH多的員工和工資情況
select ename ,sal from emp where
sal>
(
select sal from emp where ename ='SMITH'
) ;
--返回工資比SMITH多的員工和工資情況
select ename ,sal from emp where
sal>
(
select sal from emp where ename ='SMITH'
) ;
能夠用于當行子查詢的操作符有>、<、=、like等等
多行子查詢
多行子查詢返回的是一個記錄組,也就是多條記錄,這種情況對于子查詢的操作就
應該是in、any、all,exits 等。直接一個實例來看
查詢各部門中員工工資最高的員工信息
一種看起來是正確的查詢方式:
[sql] view plaincopyprint?
select max(sal) from emp group by(deptno) --子查詢的結果
select ename ,sal ,job from emp
where sal in
(
select max(sal) from emp group by deptno
)
;
select max(sal) from emp group by(deptno) --子查詢的結果
select ename ,sal ,job from emp
where sal in
(
select max(sal) from emp group by deptno
)
;
不過仔細思考就可以知道上述思路是存在問題的,因為雖然將各部門中的最高工資查詢出來了
但是外部查詢中無法無法指定員工的工資與各自部門的最高工資進行比較。查詢出來的結果必然
是不正確的。
下面提供一種正確的方法:
[sql] view plaincopyprint?
select ename ,deptno,sal,job from emp e
where not exists
(
select ename,deptno,job from emp
where deptno = e.deptno
and
sal > e.sal
)
order by deptno
;
select ename ,deptno,sal,job from emp e
where not exists
(
select ename,deptno,job from emp
where deptno = e.deptno
and
sal > e.sal
)
order by deptno
;
其實這種子查詢的方式是相關子查詢的方式,至于什么是相關子查詢會在后面進行介紹。
多行子查詢的一些操作符的使用示例:
IN操作符:
[sql] view plaincopyprint?
--in操作符的使用
--查詢員工的職業類型在部門10中有的員工的信息
select ename,job,sal,deptno from emp where job
in
(
select distinct job from emp where deptno =10
)
;
--in操作符的使用
--查詢員工的職業類型在部門10中有的員工的信息
select ename,job,sal,deptno from emp where job
in
(
select distinct job from emp where deptno =10
)
;
ALL操作符:
[sql] view plaincopyprint?
--ALL操作符的使用
--查詢員工的工資大于30號部門的所有員工的信息
select ename,sal,deptno from emp
where sal > all
(
select sal from emp where deptno=30
)
;
--">all"表示大于最大的,"
--ALL操作符的使用
--查詢員工的工資大于30號部門的所有員工的信息
select ename,sal,deptno from emp
where sal > all
(
select sal from emp where deptno=30
)
;
--">all"表示大于最大的,"
ANY操作符:
[sql] view plaincopyprint?
--ANY操作符的使用
--只要員工的工資存在這種情況:
--即他的工資情況比30部門的其中一個人的工資多就查詢出來
原文轉自:http://blog.csdn.net/kiritor/article/details/8782257