Oracle数据库之SQL子查询详解(2)

发表于:2013-05-31来源:Csdn作者:一个小菜仔点击数: 标签:oracle
select ename,sal,deptno from emp where salany ( 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操作符的使用

  --只要员工的工资存在这种情况:

  --即他的工资情况比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