概念
按照一定標准把數據分成若干部分
語法
from 表名 where 條件 group by 分組標准 (group標准的要寫在where之后,沒有where寫在from之后)
語句:select dept_id,count(id) from s_emp group by dept_id;
- 實際執行時先執行from s_emp
- 再執行group by dept_id
- 最后是統計輸出select dept_id,count(id)
如何對組數據進行過濾
- where是對表數據進行過濾的。
- 組數據過濾有特殊的語法——having
- having要加在group后面
演示:按照部門號分組,統計每個部門的人數,顯示人數大於2的部門並且按部門號降序排列
select dept_id, count(id) from s_emp group by dept_id having count(id)>2 order by dept_id desc;
演示:按照部門號分組,統計每個部門的平均工資,顯示平均工資大於1300的部門
select dept_id, avg(salary) from s_emp group by dept_id having avg(salary)>1300;
在分組語句中,select后的字段要么是分組標准,要么是經過合適組函數處理過的內容
舉例:按照部門號分組,統計每個部門的平均工資,顯示平均工資大於1300的部門,還要顯示部門名
select dept_id, avg(salary), name from s_emp e, s_dept d where dept_id=d.id group by dept_id, name having avb(salary)>1300;
(存在一些問題)匹配顯示次數問題
所以用組函數,因為組函數只會有一個結果, 如果用count:
select dept_id, avg(salary), count(name) from s_emp e, s_dept d where dept_id=d.id group by dept_id having avg(salary)>1300;
如果用max:
select dept_id, avg(salary), max(name) from s_emp e, s_dept d where dept_id=d.id group by dept_id having avg(salary)>1300;
因為可能會有的部門沒有對應部門名,數據會丟失,則要全部顯示部門表的內容,所以還要加上外連接。
select dept_id, avg(salary), count(name) from s_emp e, s_dept d where dept_id=d.id(+) group by dept_id having avg(aslary)>1300;
sql語句的執行順序
(1)from 先找到要操作的表
(2)where 會有過濾條件
(3)group by 分組肯定在having之前
(4)having 對組數據進行過濾 通過下面舉例的別名可以確定having和select的執行順序
(5)select 查詢輸出(語法規則要求select寫前面)
(6)order by 永遠在最后
演示:按照部門號分組,統計每個部門的人數,要求顯示部門人數大於2的部門,還要求按照人數進行排序
select dept_id, count(id) ac from s_emp group by dept_id having count(id)>2 order by ac;