測試必備的Mysql常用sql語句系列
https://www.cnblogs.com/poloyy/category/1683347.html
前言
- group by 關鍵字可以根據一個或多個字段對查詢結果進行分組
- group by 一般都會結合Mysql聚合函數來使用
- 如果需要指定條件來過濾分組后的結果集,需要結合 having 關鍵字;原因:where不能與聚合函數聯合使用 並且 where 是在 group by 之前執行的
group by 的語法格式
GROUP BY <字段名>[,<字段名>,<字段名>]
確認測試表里有什么數據,方便后面的栗子做對比
group by 單字段分組的栗子
對sex單個字段進行分組查詢
select * from yyTest group by sex;
知識點
分組之后,只會返回組內第一條數據;具體原理可以看看下圖
group by 多字段分組的栗子
先按照age進行分組,然后再在每個組內按department分組
select * from yyTest group by age,department;
知識點
- 多個字段分組查詢時,先按照第一個字段分組,如果第一個字段有相同值,則把分組結果再按第二個字段進行分組,以此類推
- 如果第一個字段每個值都是唯一的,則不會按照第二個字段再進行分組了,具體原理可看下圖
group by + group_concat()的栗子
group_concat()可以將分組后每個組內的值都顯示出來
select department,group_concat(username) as "部門員工名字" from yyTest group by department;
可以看到,按department部門分組 ,然后查看每個部門都有哪些員工的名字;還是很便捷的
group by +聚合函數的栗子
有什么聚合函數?
- count():統計記錄的條數
- sum():字段值的總和
- max():字段值的最大值
- min():字段值的最小值
- avg():字段值的平均值
具體的栗子
# count統計條數 select count(*) from yyTest group by department; # sum總和 select sum(age) from yyTest group by department; # max最大值 select max(age) from yyTest group by department; # min最小值 select min(age) from yyTest group by department; # 平均值 select avg(age) from yyTest group by department;
group by + with rollup的栗子
with rollup用來在所有記錄的最后加上一條記錄,顯示上面所有記錄每個字段的總和(不懂的直接看栗子)
select GROUP_CONCAT(username) from yyTest group by department with rollup;
select sum(age) from yyTest group by department with rollup;
select count(*) from yyTest group by department with rollup ;