在 Oracle 資料庫日常開發與維護中,掌握高效的 SQL 查寫技巧至關重要。本文整理了多個經典實戰場景,涵蓋分組統計、子查詢應用、集合運算、層級查詢等核心知識點,並附帶詳細代碼解析,幫助開發者快速提升 SQL 能力。
使用內連結搭配子查詢,先按部門分組求最大薪資,再關聯回原表獲取員工詳情:
SELECT e.ename, e.sal
FROM emp e
JOIN (
SELECT deptno, MAX(sal) AS max_sal
FROM emp
GROUP BY deptno
) t ON e.deptno = t.deptno AND e.sal = t.max_sal;
結合 salgrade 薪資等級表,利用 BETWEEN 進行範圍匹配:
SELECT t.deptno, t.avg_sal, s.grade
FROM (
SELECT deptno, AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
) t
JOIN salgrade s ON t.avg_sal BETWEEN s.losal AND s.hisal;
先將員工薪資映射到等級,再按部門分組求平均:
SELECT deptno, AVG(grade)
FROM (
SELECT e.deptno, s.grade
FROM emp e
JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal
)
GROUP BY deptno;
利用 IN 子查詢,將 mgr 欄位去重後與 empno 比對:
SELECT ename
FROM emp
WHERE empno IN (SELECT DISTINCT mgr FROM emp);
通過自連結找出不存在更高薪資的記錄:
SELECT sal
FROM emp e1
WHERE NOT EXISTS (
SELECT 1 FROM emp e2 WHERE e2.sal > e1.sal
);
最直接的寫法:
SELECT MAX(sal) FROM emp;
巢狀子查詢層層過濾:
SELECT deptno, avg_sal
FROM (
SELECT deptno, AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
) t
WHERE avg_sal = (
SELECT MAX(avg_sal)
FROM (
SELECT AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
)
);
Oracle 允許在 HAVING 或子查詢中直接嵌套聚合:
SELECT deptno, AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
HAVING AVG(sal) = (
SELECT MAX(AVG(sal))
FROM emp
GROUP BY deptno
);
多表連結,逐層定位:
SELECT d.dname
FROM dept d
WHERE d.deptno = (
SELECT deptno
FROM (
SELECT deptno, AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
) t
WHERE avg_sal = (
SELECT MAX(avg_sal)
FROM (
SELECT AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
)
)
);
結合薪資等級表,尋找等級最小的部門:
SELECT d.dname, t.avg_sal, s.grade
FROM (
SELECT deptno, AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
) t
JOIN salgrade s ON t.avg_sal BETWEEN s.losal AND s.hisal
JOIN dept d ON t.deptno = d.deptno
WHERE s.grade = (
SELECT MIN(grade)
FROM (
SELECT AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
) t2
JOIN salgrade s2 ON t2.avg_sal BETWEEN s2.losal AND s2.hisal
);
SELECT MIN(avg_sal)
FROM (
SELECT AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
);
SELECT avg_sal, deptno
FROM (
SELECT AVG(sal) AS avg_sal, deptno
FROM emp
GROUP BY deptno
) t
WHERE avg_sal = (
SELECT MIN(avg_sal)
FROM (
SELECT AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
)
);
SELECT t.avg_sal, t.deptno, s.grade
FROM (
SELECT AVG(sal) AS avg_sal, deptno
FROM emp
GROUP BY deptno
) t
JOIN salgrade s ON t.avg_sal BETWEEN s.losal AND s.hisal
WHERE t.avg_sal = (
SELECT MIN(avg_sal)
FROM (
SELECT AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
)
);
SELECT d.dname, t.avg_sal, t.deptno, s.grade
FROM (
SELECT AVG(sal) AS avg_sal, deptno
FROM emp
GROUP BY deptno
) t
JOIN salgrade s ON t.avg_sal BETWEEN s.losal AND s.hisal
JOIN dept d ON t.deptno = d.deptno
WHERE t.avg_sal = (
SELECT MIN(avg_sal)
FROM (
SELECT AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
)
);
SELECT t1.deptno, t1.avg_sal, t1.grade, d.dname
FROM (
SELECT t.deptno, t.avg_sal, s.grade
FROM (
SELECT deptno, AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
) t
JOIN salgrade s ON t.avg_sal BETWEEN s.losal AND s.hisal
) t1
JOIN dept d ON t1.deptno = d.deptno
WHERE t1.grade = (
SELECT MIN(grade)
FROM (
SELECT t.deptno, t.avg_sal, s.grade
FROM (
SELECT deptno, AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
) t
JOIN salgrade s ON t.avg_sal BETWEEN s.losal AND s.hisal
)
);
CONN sys/sys AS SYSDBA;
GRANT CREATE TABLE, CREATE VIEW TO scott;
本文匯總了 Oracle 開發中高頻使用的查詢模式,從基礎的分組統計到複雜的多層巢狀子查詢,再到權限管理實操。掌握這些範本並理解其邏輯,能顯著提升處理業務數據的效率。實際應用中,建議結合執行計劃(EXPLAIN PLAN)優化大數據量場景下的查詢性能。