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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97