分組函數(多行處理函數)
即多個輸入對應一個輸出。前面講的數據處理函數是單行處理函數。(在公司中常說單,多行處理函數)
分組函數包括五個:
- max:最大值
- min:最小值
- avg:平均值
- sum:求和
- count:計數
例子:
select max(sal),min(sal),avg(sal),sum(sal),count(ename) from emp;
分組函數自動忽略NULL。
例如:count(ename)結果為14,而count(comm)結果為4。(其中comm里面有null)
面試題:count(某個字段)與count(*)的區別。count(某個字段)是統計該字段不為空的總數,count(*)則是統計該表有多少行記錄。count(數字)效果跟count(*)一樣。
分組函數不能用在where后面
原因:where語句在執行的時候分組函數還沒有進行分組
- 分組函數執行之前需要先分組才能在使用
- group by 可以進行分組若是沒用group by 則自認為一組
- 執行順序:from,where,group by ,select,order by
分組查詢
group by
注意:
- group by 在where之后執行
- 當sql語句中有group by 則select語句后面只能接參加分組的字段或者分組函數其他的字段不能加
語法:
- 按某個字段分組:group by 字段1
- 按多個字段聯合分組:group by 字段1,字段2…
示例
- 示例一:找出每個崗位的平均薪資
- select job,avg(sal) from emp group by job;
示例二:找出每個部門不同崗位的平均薪資
select deptno,avg(sal) from emp group by deptno,job;
過濾 having
兩個過濾where與having的區別:
- where:使用where進行過濾是在分組之前進行過濾
- having:使用having進行過濾必須在group by進行分組之后進行過濾
推薦使用where,高效
having示例
示例一:查詢每個部門平均薪資,找出平均薪資高于2000的
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
執行順序
from,where,group by ,having,select,order by
組內排序
substring_index函數的使用
語法格式:substring_index('要處理的字符串','分隔符',截取位置)
示例一:select substring_index('abcdaef','a',2);
結果為:abcd示例二:select substring_index(12342,2,2);
結果為:1234
group_concat函數的使用:
GROUP_CONCAT
?是 MySQL 中強大的聚合函數,用于將分組后的多行數據合并成單個字符串。
示例:
SELECT department_id,GROUP_CONCAT(DISTINCT expr -- 表達式ORDER BY .....SEPARATOR '; ' -- 自定義分隔符) AS employees
FROM employees
GROUP BY department_id;
參數說明:
組件 | 是否必需 | 說明 | |
---|---|---|---|
DISTINCT | 可選 | 去除重復值 | |
expr | 必需 | 要連接的表達式(列名、計算字段等),可多個:GROUP_CONCAT(col1, col2) | |
ORDER BY | 可選 | 指定連接順序: ?? col_name :列名 ?? expr :表達式 ?? position :選擇列位置(從1開始) ?? ASC/DESC :排序方向 | |
SEPARATOR | 可選 | 指定連接分隔符(默認逗號, ) 示例:`SEPARATOR ’ | ', SEPARATOR '; '` |
示例
示例一: select job,group_concat(empno) from emp group by job;解釋:將每個職位(job)下的所有員工編號(empno)合并成單個字符串,默認用逗號分隔。結果:
+-----------+---------------------+
| job | group_concat(empno) |
+-----------+---------------------+
| ANALYST | 7788,7902 |
| CLERK | 7369,7876,7900,7934 |
| MANAGER | 7566,7698,7782 |
| PRESIDENT | 7839 |
| SALESMAN | 7499,7521,7654,7844 |
+-----------+---------------------+
示例二:找出每個工作崗位的工資排名在前兩名的編號代碼: select job,substring_index(group_concat(empno),',',2) as empno from emp group by job;結果:
+-----------+-----------+
| job | empno |
+-----------+-----------+
| ANALYST | 7788,7902 |
| CLERK | 7369,7876 |
| MANAGER | 7566,7698 |
| PRESIDENT | 7839 |
| SALESMAN | 7499,7521 |
+-----------+-----------+