z子查詢就是將一個查詢(子查詢)的結果作為另一個查詢(主查詢)的數據來源或判斷條件的查詢。常見的子查詢有WHERE子查詢,HAVING子查詢,FROM子查詢,SELECT子查詢,EXISTS子查詢,子查詢要使用小括號();
WHERE子查詢
在WHERE子句中進行使用查詢
SELECT *
FROM EMP
WHERE SAL < (SELECT AVG(SAL) FROM EMP);
- 查詢薪資比平均薪資低的員工信息
HAVING子查詢
HAVING子句是對分組統計函數進行過濾的子句,也可以在HAVING子句中使用子查詢
SELECT JOB,AVG(SAL)
FROM EMP
GROUP BY JOB
HAVING AVG(SAL) = (SELECT MAX(AVG(SAL)) FROM EMP GROUP BY JOB);
- 查詢平均薪資最高的職位及其平均薪資
FROM子查詢
FROM子查詢就是將一個查詢結構(一般多行多列)作為主查詢的數據源
SELECT JOB,AVG(SAL)
FROM (SELECT JOB,AVG(SAL) AS AVGSAL FROM EMP GROUP BY JOB)TEMP
WHERE TEMP.AVGSAL>2000;
- 查詢平均薪資高於2000的職位以及該職位的平均薪資
SELECT子查詢
SELECT子查詢在SELECT子句中使用查詢的結果(一般會和dual空表一起使用)
SELECT (SELECT COUNT(*) FROM EMP WHERE JOB = 'SALESMAN')/(SELECT COUNT(*) FROM EMP)
FROM DUAL;
- 職位是SALESMAN的員工占總員工的比例
EXISIT子查詢
將主查詢的數據帶到子查詢中驗證,如果成功則返回true,否則發水false。主查詢接收true是就會顯示這條數據,flase就不會顯示。
SELECT *
FROM EMP E
WHERE EXISIT (
SELECT *
FROM DEPT D
WHERE E.DEPTNO = D.DEPTNO);
- 查詢有部門的員工信息
查詢薪資排名的員工信息(面試)
SELECT *
FROM EMP
WHERE SAL = (SELECT MIN(SAL)
FROM (SELECT ROWNUM,SAL
FROM (SELECT SAL FROM EMP GROUP BY SAL ORDER BY SAL DESC)
WHERE ROWNUM<=n));
- 查詢薪資排名第n個員工的信息(包括並列排名)
思路:
1.先按薪資降序分組
2.再取前n名薪資中最低的薪資,即第n名的薪資。
3.最后在原表中找出薪資與最低薪資相同的員工信息。
以上
@Fzxey