1. 程式人生 > >Oracle分組查詢

Oracle分組查詢


首先要明白的一點:資料重複的時候分組才有意義。

分組查詢語法:

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>