1. 程式人生 > >mysql篇第十課:查詢語句(四)

mysql篇第十課:查詢語句(四)

  這節課繼續學查詢

 

分組查詢

語法: select 查詢的欄位,分組函式 from 表 group by 分組的欄位

 

注意:

1、可以按單個欄位分組

2、和分組函式一同查詢的欄位最好是分組後的欄位

3、分組篩選

                  針對的表  位置                  關鍵字

分組前篩選:  原始表              group by的前面               where

分組後篩選:  分組後的結果集       group by的後面               having

 

4、可以按多個欄位分組,欄位之間用逗號隔開

5、可以支援排序

6having後可以支援別名

 

 

Demo 01:

-- 根據部門分組

select * from tbl_employee GROUP BY d_id;

 

非常奇怪,為什麼每組只有一條資料?

因為group by的機制就是每組只取一條資料

 

如果我希望所有資料都顯示怎麼辦?

 

Demo 02:

-- 根據部門分組

select * from tbl_employee GROUP BY d_id,id;

 

為什麼加上id之後就全部出來了呢?

 

因為根據id分組的話,id作為主鍵是不可重複的,所以所有資料都會顯示

 

因此,如果分組後想取得所有資料而不是每組取一條資料的話,分組條件要加上主鍵或者其他不可重複的列

 

下面說說where和having的區別

 

Where是在分組前 對所有資料進行條件篩選

Having 是在分組後 對所有資料以組為單位進行篩選

 

Demo 03:

-- 根據部門分組,獲取組內人數大於3的組內所有成員

select * from tbl_employee GROUP BY d_id, id having count(*) > 3;

 

為什麼會這樣呢?

 

因為我們是根據d_id和id分組,既然你根據id分組了那麼每個組其實只有一行資料

 

那麼怎麼才能實現呢? 要用子查詢,這個以後講。

 

Demo 04:

-- 檢視每個部門的人數

select d_id as 部門, count(*) as 部門人數 from tbl_employee GROUP BY d_id;

 

Demo 05:

-- 檢視部門人數大於3的每個部門的人數

select d_id as 部門, count(*) as 部門人數 from tbl_employee GROUP BY d_id having count(*) > 3;