select ename,sal,deptno from emp
where sal>any
(
select sal from emp where deptno = 30
)
;
--ANY操作符的使用
--只要員工的工資存在這種情況:
--即他的工資情況比30部門的其中一個人的工資多就查詢出來
select ename,sal,deptno from emp
where sal>any
(
select sal from emp where deptno = 30
)
;
“>ANY”意味著大于最小值,"
多列子查詢
指的是子查詢語句返回的是多列。
例如查詢:某個名叫SMITH的員工,但是由于員工的名字可能出現重復,因此需要結合其工作
和和部門id進行判斷。
[sql] view plaincopyprint?
--多列子查詢實例
select ename ,job ,deptno from emp
where (ename,job,deptno) =
(
select ename, job,deptno from emp
where ename='SMITH'
)
;--這里主要在于說明多列子查詢的使用,并不注重其實際意義
--多列子查詢實例
select ename ,job ,deptno from emp
where (ename,job,deptno) =
(
select ename, job,deptno from emp
where ename='SMITH'
)
;--這里主要在于說明多列子查詢的使用,并不注重其實際意義
● 成對比較
[sql] view plaincopyprint?
--成對比較
select ename ,sal,comm ,deptno from emp
where (sal,nvl(comm,-1)) in
(
select sal,nvl(comm,-1) from emp
where deptno = 30
)
--成對比較
select ename ,sal,comm ,deptno from emp
where (sal,nvl(comm,-1)) in
(
select sal,nvl(comm,-1) from emp
where deptno = 30
)
;
● 非成對比較
[sql] view plaincopyprint?
--非成對比較
elect ename ,sal,deptno,comm from emp
where sal in
(
select sal from emp
where deptno = 30
)
and nvl(comm,-1) in
(
select nvl(comm,-1) from emp
where deptno = 30
)
;
--非成對比較
select ename ,sal,deptno,comm from emp
where sal in
(
select sal from emp
where deptno = 30
)
and nvl(comm,-1) in
(
select nvl(comm,-1) from emp
where deptno = 30
)
;
其他子查詢
1、相關子查詢
是指需要引用主查詢表列的子查詢 語句。相關子查詢是通過exists 來實現的 。
[sql] view plaincopyprint?
--查詢在NEW YORK工作的員工的信息
select ename ,job ,sal ,deptno from emp
where exists
(
select 1 from dept
where dept.deptno = emp.deptno
and dept.loc ='NEW YORK'
)
;
--查詢在NEW YORK工作的員工的信息
select ename ,job ,sal ,deptno from emp
where exists
(
select 1 from dept
where dept.deptno = emp.deptno
and dept.loc ='NEW YORK'
)
;
思考:相關子查詢的執行過程:
相關子查詢會引用外部查詢的一列或多列,在執行的時候外部查詢的每一行被一次一行的
傳遞給子查詢,子查詢依次讀取外部查詢傳遞過來的每一個值,并將其用到子查詢上,直到外部
查詢的所有行都用完為止,然后返回查詢結果。
2、FROM子句中的子查詢
在from子句中使用子查詢的時候子查詢會被當做一個view對待,需要給子查詢指定別名。
[sql] view plaincopyprint?
--查看比本部門平均工資高的員工信息
select ename,job,sal from emp ,
(
select deptno,avg(sal) as avgsal from emp
group by deptno
) tmp_dept
where emp.deptno=tmp_dept.deptno and sal >tmp_dept.avgsal;
--查看比本部門平均工資高的員工信息
select ename,job,sal from emp ,
(
select deptno,avg(sal) as avgsal from emp
group by deptno
) tmp_dept
where emp.deptno=tmp_dept.deptno and sal >tmp_dept.avgsal;
3、DML語句中使用子查詢
[sql] view plaincopyprint?
--DML語句中使用子查詢
--insert中
insert into employee (id,name,title,salary)
select emptno,ename ,job,sal from emp;
--update中
update emp set (sal,comm)=
(
select sal,comm from emp
原文轉自:http://blog.csdn.net/kiritor/article/details/8782257