程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle 數據庫基礎學習 (六) 子查詢,oracle數據庫

Oracle 數據庫基礎學習 (六) 子查詢,oracle數據庫

編輯:Oracle教程

Oracle 數據庫基礎學習 (六) 子查詢,oracle數據庫


子查詢在一個select中出現多個嵌套查詢語句

 

1、在where子句中使用子查詢(一般返回"單行單列" "單行多列" "多行單列"(可以提供in、any、all ))

示例1:查找低於平均工資的雇員信息(返回單行單列)

select * from emp where sal < (select avg(sal) from emp)

示例2:查找出公司最早雇傭的雇員信息(返回單行單列)

select * from emp where hiredate =(select min(hiredate) from emp) 

示例3:與scott從事同一個工作,且工資相同(返回多行單列)--但是一般不這麼使用

select * from emp 
where ((job, sal)= (select job, sal from emp where ename='SCOTT')) and (ename != 'SCOTT')

 

在子查詢返回多行單列的時候,可以使用in、any、all 進行比較

⑴   in和not in(不能與null一起使用)的用法

示例:查詢和職位是MANAGER工資不同的員工信息

select * from emp 
where sal not in (select sal from emp where job='MANAGER') ;

 

⑵  any的用法(  “>any”大於最小的 “<any”小於最大的)

示例1:查詢和職位是MANAGER工資相同的員工信息(”=any”和in一樣用法)

select * from emp 
where sal =any (select sal from emp where job='MANAGER') ;

 

示例2:查詢比職位是MANAGER工資最低工資還高的員工信息(”>any”就是比最小的大)

select * from emp 
where sal >any (select sal from emp where job='MANAGER') ;

 

示例3:查詢比職位是MANAGER工資最高工資還低的員工信息(”<any”就是比最大的小)

select * from emp 
where sal <any (select sal from emp where job='MANAGER') ;

 

 

⑶  all的用法(“>all”比最大的大 “<all”比最小的小)

示例1:查詢比職位是MANAGER工資都高的員工信息(”>all”就是比最大的還大)

select * from emp 
where sal >all (select sal from emp where job='MANAGER') ;

 

 

示例2:查詢比職位是MANAGER工資都低的員工信息(”<all”就是比最小的還小)

select * from emp 
where sal <all (select sal from emp where job='MANAGER') ;

 

 

2、在having子句中使用子查詢,使用的情況只有在子查詢返回單行單列,並且使用統計函數的情況

示例1:查詢出高於公司平均工資的員工的職位名稱,職位人數,平均工資

select job, count(empno), avg(sal)
from emp
group by job 
having avg(sal) > (select avg(sal) from emp) ;

 

 

3、在select子句中使用子查詢(返回單行單列,不過一般不使用)

示例1:查詢每個雇員的編號、姓名、職位、部門名稱

使用多表查詢:

select e.empno, e.ename, e.job, d.dname
from emp e, dept d
where e.deptno=d.deptno(+) ;

 

使用select子查詢:

select e.empno, e.ename, e.job, (select dname from dept d where e.deptno=d.deptno) dname
from emp e ;   

 

 

4、在from子句中使用子查詢(返回多行多列)

示例1:查詢每個部門名稱、位置、部門人數

使用多表查詢:

 

select d.dname, d.loc, count(empno)
from emp e, dept d
where e.deptno=d.deptno(+)
group by d.dname, d.loc ;

 

 

 

 

使用from子查詢:

  |-查詢部門的名稱、位置、編號

select deptno, dname, loc from dept ; 

 

  |-查詢部門的編號和部門人

select  deptno, count(empno)
from emp
group by deptno ;

 

  |-實現在from的子查詢,相當與將兩張表做多表連接查詢

select d.dname, d.loc, temp.count
from dept d, (select deptno, count(empno) count from emp group by deptno ) temp
where d.deptno=temp.deptno(+) ;

 

 

 

注意:1、當子查詢返回單行單列、多行單列、單行多列的情況,在where子句中實現子查詢

   2、having子句中使用子查詢,使用的情況只有在子查詢返回單行單列,並且使用統計函數的情況

     3、當子查詢返回多行多列的情況,在from子句中實現子查詢

     4、一般不在select子句中實現子查詢

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved