1. 程式人生 > >八、分組函式/聚合函式/雙行處理函式

八、分組函式/聚合函式/雙行處理函式

函式

count 數量
sum 求和
avg 平均值
max 最大值
min 最小值

分組函式不能直接使用在where關鍵字後面。

    mysql> select ename, sal from emp where max(sal) < sal;
    ERROR 1111 (HY000): Invalid(無效) use of group function

去除重複記錄

    select distinct deptno,job from emp;
distinct只能出現在所有欄位前方

分組查詢

  1. 分組查詢兩個子句:
    group by、 having
    mysql> select ename,job, max(sal) from emp group by job;
在mysql中可以,但是沒有實際意義。
在Oracle中不可以,語法報錯。

重點:
若一條DQL語句當中有group by子句,那麼select關鍵字後面只能跟參與分組的欄位和分組函式。

    select job, max(sal) from emp where job != 'MANAGER' group by job;
where條件得在group by的前面。先得去除不等於MAMAGER的,然後在進行分組。
    select job, avg(sal) from emp where avg(sal) > 1500 group by job;
    select job, avg(sal) from emp group by job having avg(sal) > 1500;

重點:

where關鍵字後面不能直接使用分組函式。
分組函式必須在分組完成後執行,而分組需要group by,而group by在where後面執行。


having和where功能都是為了完成資料的過濾。
where和having後面都是新增條件。
where在group by之前完成過濾。
having在group by之後完成過濾

原則:
儘量在where中過濾,無法過濾的資料,通常是需要先分組子後在過濾的,這個時候可以選擇使用having。

完整的DQL語句的總結:

select
    ... 
from ...
where ...
group by ...
having ...
order by...

說明:
1. 書寫順序不能改變
2. having不能單獨使用,必須和group by連用
3. 執行順序:
3.1 from 從某張表中檢索資料
3.2 where 經過某個條件進行篩選
3.3 group by 分組
3.4 having 分組之後在篩選
3.5 select 查詢列
3.6 order by 排序輸出