子查詢:sql
--查詢emp表中工資高於allen的員工信息
SELECT sal FROM emp
WHERE ename = 'ALLEN';函數
SELECT * FROM emp
WHERE sal > 1600;spa
--當查詢的條件不是客觀條件,而是表中的數據,而且不關心具體的數據是多少時,使用子查詢
--子查詢就是查詢語句的嵌套,將子查詢的結果做爲主查詢的條件
--子查詢必須用括號括起來表示運算順序,子查詢最好單獨做爲一行編寫
--習慣上將子查詢寫在比較運算符的右邊
SELECT * FROM emp
WHERE sal >
(SELECT sal FROM emp WHERE ename = 'ALLEN');
--主查詢中的條件和子查詢的結果數據類型必須一致
--主查詢中的條件和子查詢的結果應該是同一意義的數據class
1.單行子查詢
--子查詢的結果是一個數據時
--查詢跟allen的部門和職位都相同的員工信息
SELECT * FROM emp
WHERE deptno =
(SELECT deptno FROM emp WHERE ename = 'ALLEN')
AND job =
(SELECT job FROM emp WHERE ename = 'ALLEN');效率
--子查詢的數據跟主查詢能夠不在同一張表
--查詢allen所在的部門名稱
1)多表查詢
SELECT d.dname
FROM emp e,dept d
WHERE e.deptno = d.deptno
AND e.ename = 'ALLEN';
--多表查詢在笛卡爾結果中查詢知足條件的數據,在14*4=56條數據中進行比對date
2)子查詢
SELECT dname FROM dept
WHERE deptno =
(SELECT deptno FROM emp WHERE ename = 'ALLEN');
--先經過allen的名字找到deptno,在emp表中找了14次
--經過deptno找dname,在dept表中找了4次
--最終查找了14+4=18次sql語句
--若是查詢結果中的數據來自多張表,只能用多表查詢分頁
--若是查詢結果中的數據來自一張表,只是用到了另外一張表的數據做爲條件
--能夠用多表查詢,也能夠用子查詢,推薦使用子查詢
--子查詢一般比多表查詢效率高數據類型
--子查詢中能夠包含分組函數
--查詢emp表中工資最高的員工名字
SELECT ename FROM emp
WHERE sal =
(SELECT MAX(sal) FROM emp);數據
--having 中也能夠包含子查詢
--查詢人數比10號部門多的部門編號
SELECT deptno FROM emp
GROUP BY deptno
HAVING COUNT(*) >
(SELECT COUNT(*) FROM emp
WHERE deptno = 10);
2.多行子查詢
--子查詢的結果是多行數據時,使用多行子查詢
--多行子查詢必須使用多行比較運算符
--in 匹配多個值
--查詢人數比10號部門多的部門名稱
SELECT dname FROM dept
WHERE deptno IN
(SELECT deptno FROM emp
GROUP BY deptno
HAVING COUNT(*) >
(SELECT COUNT(*) FROM emp
WHERE deptno = 10));
--any, 知足任意一個條件就能返回結果
--查找工資比任意一個部門平均工資高的員工
SELECT * FROM emp
WHERE sal > ANY
(SELECT AVG(sal) FROM emp GROUP BY deptno);
--大於 any 表示大於最小值,小於 any 表示小於最大值
--all,知足全部條件才能返回結果
SELECT * FROM emp
WHERE sal > ALL
(SELECT AVG(sal) FROM emp GROUP BY deptno);
--大於 all 表示大於最大值,小於 all 表示小於最小值
3.多列子查詢
--子查詢返回的結果是多列數據
--in
--查詢跟allen的部門和職位都相同的員工信息
SELECT * FROM emp
WHERE (deptno,job) IN
(SELECT deptno,job FROM emp WHERE ename = 'ALLEN');
4.分頁子查詢
--能夠將子查詢的結果看做一張表,再進行查詢
SELECT ename,sal FROM
(SELECT ename,job,sal,deptno FROM emp
WHERE sal > 1500)
WHERE deptno = 30;
--rownum,是系統自動分配給查詢結果的行號
--rownum不是真正的數據,只能從1開始,若是匹配的範圍不是從1開始則返回空結果
--查詢emp表中工資排名前三的員工信息
--先根據工資進行降序排列,找到這個結果中前三行數據
SELECT * FROM
(SELECT * FROM emp
ORDER BY sal DESC)
WHERE ROWNUM <= 3;
--查詢emp表中工資排名3到5位的員工信息
--先根據工資進行降序排列,將rownum轉換成真正的一列,在用這一列進行條件限定
SELECT * FROM emp
WHERE sal IN
(SELECT sal FROM
(SELECT ROWNUM rn,sal FROM
(SELECT sal FROM emp
ORDER BY sal DESC))
WHERE rn BETWEEN 3 AND 5);
【做業】
1.使用子查詢,找出哪一個部門下沒有員工
SELECT * FROM dept
WHERE deptno NOT IN
(SELECT deptno FROM emp);
--distinct 去重
SELECT * FROM dept
WHERE deptno NOT IN
(SELECT DISTINCT deptno FROM emp);
2.使用子查詢,列出薪金比「ALLEN」多的全部員工
SELECT * FROM emp
WHERE sal >
(SELECT sal FROM emp WHERE ename = 'ALLEN');
3.使用子查詢,列出在銷售部(SALES)工做的員工信息
SELECT * FROM emp
WHERE deptno =
(SELECT deptno FROM dept WHERE dname = 'SALES');
4.使用子查詢,找出那些工資低於平均工資的員工
SELECT * FROM emp
WHERE sal <
(SELECT AVG(sal) FROM emp);
5.使用子查詢,找出那些工資低於任意一個部門的平均工資的員工
SELECT * FROM emp
WHERE sal < ANY
(SELECT AVG(sal) FROM emp GROUP BY deptno);
6.使用sql語句查出各個部門工資最高的員工的部門編號、員工姓名及其工資的信息
SELECT deptno,ename,sal FROM emp
WHERE (deptno,sal) IN
(SELECT deptno,MAX(sal) FROM emp GROUP BY deptno);
7.列出全部部門的相應信息和部門人數,沒有員工的部門則部門人數顯示爲0
1)多表查詢
SELECT d.*,COUNT(e.empno)
FROM dept d,emp e
WHERE d.deptno = e.deptno(+)
GROUP BY d.deptno,d.dname,d.loc
ORDER BY d.deptno;
2)子查詢
--先使用子查詢構造出一張知足查詢條件的表,而後和其餘表進行多表查詢
SELECT deptno,COUNT(empno) FROM emp
GROUP BY deptno;
SELECT d.*,NVL(c.ct,0)
FROM dept d,
(SELECT deptno,COUNT(empno) ct FROM emp
GROUP BY deptno) c
WHERE d.deptno = c.deptno(+);
SELECT ename FROM emp
WHERE deptno = 40;
SELECT AVG(sal) FROM emp
WHERE deptno = 40;
SELECT COUNT(ename) FROM emp
WHERE deptno = 40;
8.查詢高於本身部門平均工資的員工名字,部門號,工資,平均工資(保留2位小數)
SELECT deptno,AVG(sal) asal FROM emp
GROUP BY deptno;
SELECT e.ename,e.deptno,e.sal,ROUND(a.asal,2)
FROM emp e,
(SELECT deptno,AVG(sal) asal FROM emp
GROUP BY deptno) a
WHERE e.deptno = a.deptno
AND e.sal > a.asal
ORDER BY e.deptno;
9.查詢入職日期排名後3位的員工信息SELECT * FROM(SELECT * FROM empORDER BY hiredate DESC)WHERE ROWNUM <= 3;