使用命令:select 字段 from table_name group by col_name;
注意點:
- 在有group by的查詢語句中,select指定的字段要么就包含在group by語句的后面,作為分組的依據,要么就包含在聚合函數中。
- 常用聚合函數有count計數,sum求和,avg平均數,max最大值,min最小值等
1.group by 一個字段:
舉栗1. SELECT name FROM test GROUP BY name;
- 1)FROM test GROUP BY name:該句執行后,我們想象生成了虛擬表3,如下所圖所示,生成過程是這樣的:group by name,那么找name那一列,具有相同name值的行,合並成一行,如對於name值為aa的,那么<1 aa 2>與<2 aa 3>兩行合並成1行,所有的id值和number值寫到一個單元格里面。
2)執行Select語句了:
(1)如果執行select *的話,那么返回的結果應該是虛擬表3,可是id和number中有的單元格里面的內容是多個值的,此時返回的id和number會是多個值之中的一個,不一定是我們想要的結果。
(2)我們再看name列,每個單元格只有一個數據,所以我們select name的話,就沒有問題了。為什么name列每個單元格只有一個值呢,因為我們就是用name列來group by的。
(3)那么對於id和number里面的單元格有多個數據的情況怎么辦呢?答案就是用聚合函數,聚合函數就用來輸入多個數據,輸出一個數據的。如cout(id),sum(number),而每個聚合函數的輸入就是每一個多數據的單元格。
(4)例如我們執行select name,sum(number) from test group by name,那么sum就對虛擬表3的number列的每個單元格進行sum操作,例如對name為aa的那一行的number列執行sum操作,即2+3,返回5,最后執行結果如下:
2.group by 多個字段
舉栗2. SELECT name,number FROM test GROUP BY name,number;
group by name,number;我們可以把name和number 看成一個整體字段,以他們整體來進行分組的。如
3.having
where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前使用where條件過濾出特定的行,where條件中不能包含聚組函數。
having 子句的作用是篩選滿足條件的組,即在分組之后過濾數據,對GROUP BY對象進行篩選,having條件中經常包含聚組函數,使用having 條件過濾出特定的組。
舉栗3:查找員工人數大於30000的部門
SELECT de.dept_name AS 部門,count( de.emp_no ) AS 人數 FROM dept_emp de WHERE de.to_date = '9999-01-01' GROUP BY de.dept_no HAVING count( de.emp_no ) > 30000 .



