一、單行子查詢:= < > >= <= <>
- SELECTename
FROM emp
WHERE sal>(SELECT sal
FROM emp
WHERE ename='JONES');
- SELECTename,job
FROM emp
WHERE job=(SELECT job
FROM emp
WHERE empno=7369)
AND sal>(SELECT sal
FROM emp
WHERE empno=7876);
- 子查詢中使用組函數
SELECT ename,job,sal
FROM emp
WHERE sal=(SELECT MIN(sal)
FROM emp);
- HAVING子句中的子查詢
SELECT deptno,MIN(sal)
FROM emp
GROUP BY deptno
HAVING MIN(sal)>(SELECT MIN(sal)
FROM emp
WHERE 57 ptno=20);
查詢哪個部門的員工人數高於平均人數
SELECT deptno,count(empno)
FROM emp
GROUP BY deptno
HAVING COUNT(empno)>(
SELECT AVG(COUNT(empno))
FROM emp
GROUP BY deptno);
二、多行子查詢 IN / ANY / ALL
IN
SELECT ename,sal
FROM emp
WHERE empno IN(SELECT mgr FROM emp);
ANY(或)
(1) >ANY (2)
查詢部門編號不爲10,工資比10部門任意一名員工工資高的 編號、姓名.....
SELECT empno,ename,job,sal
FROM emp
WHERE sal>ANY(SELECT sal FROM emp WHERE deptno=10)
AND deptno<>10;
ALL(與)
查詢部門編號不爲10,工資比10部門所有員工工資高的 編號、姓名.....
SELECT empno,ename,job,sal
FROM emp
WHERE sal>ALL(SELECT sal FROM emp WHERE deptno=10)
AND deptno<>10;
三、多列子查詢
- SELECTename,deptno,job,hiredate
FROM emp
WHERE (deptno,job) IN
(SELECT deptno,job FROM emp WHERE
TO_CHAR(hiredate,'yyyy')='1981')
AND TO_CHAR(hiredate,'yyyy')<>'1981';
- 查詢和1981年入職的任意一個員工的部門或職位相同員工姓名、部門、職位、入職日期,不包括1981入職員工。
SELECT ename,deptno,job,hiredate
FROM emp
WHERE deptno IN
(SELECT deptno FROM emp WHERE TO_CHAR(hiredate,'YYYY')='1981')
AND job IN
(SELECT job FROM emp WHERE TO_CHAR(hiredate,'YYYY')='1981')
AND TO_CHAR(hiredate,'YYYY')<>'1981';
四、在FROM子句中使用子查詢
SELECT a.ename,a.sal,a.deptno,b.salavg
FROM emp a,
(SELECT deptno,avg(sal) salavg FROM emp GROUP BY deptno) b
WHERE a.deptno=b.deptno
AND a.sal>b.salavg
五、分頁查詢
1、ROWNUM介紹(就是方便查看的序號,實現分頁)
SELECT ROWNUM,ename,job,mgr from emp;
2、TOP-N查詢
//就輸出指定條記錄
SELECT * FROM emp WHERE ROWNUM<=5;
3、ROWNUM分頁
SELECT ename,hiredate
FROM emp
WHERE ROWNUM<=5
ORDER BY hiredate ASC;
SELECT emp.ename,emp.hiredate
FROM emp,dept
WHERE ROWNUM<=2 AND dept.loc='CHICAGO'
ORDER BY hiredate ASC;
SELECT * FROM
(SELECT a.*,ROWNUM nu FROM
(SELECT * FROM emp) a
WHERE ROWNUM<=6)
WHERE nu>3;