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子查詢:
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子句中實現子查詢
?
轉載于:https://www.cnblogs.com/xiaoxing/p/5339820.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Oracle 数据库基础学习 (六) 子查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ1031: [JSOI2007]
- 下一篇: [转]vue全面介绍--全家桶、项目实例