Oracle分組查詢
阿新 • • 發佈:2019-02-02
首先要明白的一點:資料重複的時候分組才有意義。
分組查詢語法:
SELECT [DISTINCT] *|分組欄位1 [別名] [,分組欄位2 [別名] ,…] | 統計函式
FROM 表名稱 [別名], [表名稱 [別名] ,…]
[WHERE 條件(s)]
[GROUP BY 分組欄位1 [,分組欄位2 ,…]]
[ORDER BY 排序欄位 ASC | DESC [,排序欄位 ASC | DESC]];
特別說明的幾點(非常重要):
1,GROUP BY 分組欄位不能用欄位別名;
2,沒有分組時
統計函式可以單獨用於SELECT之後,但是不能再出現其他欄位;
3,單欄位分組時
SELECT之後就只能用統計函式和GROUP BY之後的欄位;
4,多欄位分組時
涉及到的兩個問題:
①跨表間的關聯欄位;-->消除笛卡兒積
②需要解決單欄位分組時的侷限性(如上第3點),解決方法:一般情況是在FROM後巢狀子查詢-->構建臨時表。舉例如下:
列出各個部門的MANAGER(經理)的最低薪金、姓名、部門名稱、部門人數。
1、確定所需要的資料表:
- emp表:找到經理的薪金、姓名;
- dept表:部門名稱;
- emp表:統計部門人數;
2、確定已知的關聯欄位:emp.deptno=dept.deptno;
第一步:找到所有部門的經理
<span style="font-size:18px;">SELECT deptno,MIN(sal)
FROM emp
WHERE job='MANAGER'
GROUP BY deptno;</span>
第二步:找到姓名,但是以上的子查詢,不能再出現其他的欄位<span style="font-size:18px;">SELECT e.ename,e.sal FROM emp e,( SELECT deptno dno,MIN(sal) sal FROM emp WHERE job=’MANAGER’ GROUP BY deptno) temp WHERE e.deptno=temp.dno AND e.sal=temp.sal AND e.job='MANAGER';</span>
第三步:加入部門的名稱資訊
<span style="font-size:18px;">SELECT e.ename,e.sal,d.dname
FROM emp e,(
SELECT deptno dno,MIN(sal) sal
FROM emp
WHERE job='MANAGER'
GROUP BY deptno) temp,dept d
WHERE e.deptno=temp.dno AND e.sal=temp.sal AND e.job='MANAGER'
AND e.deptno=d.deptno;</span>
第四步:統計部門人數
<span style="font-size:18px;">SELECT e.ename,e.sal,d.dname,res.count
FROM emp e,(
SELECT deptno dno,MIN(sal) sal
FROM emp
WHERE job=’MANAGER’
GROUP BY deptno) temp,dept d,(
SELECT deptno dno,COUNT(empno) count
FROM emp
GROUP BY deptno) res
WHERE e.deptno=temp.dno AND e.sal=temp.sal AND e.job='MANAGER'
AND e.deptno=d.deptno AND res.dno=d.deptno;</span>