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