目錄
一、分組函數
功能:統計信息
分類:
sum
求和avg
平均值max
最大值min
最小值count
計算個數
特點
- 參數支持類型
函數 | 參數支持類型 |
---|---|
sum avg |
具有可加性的數據 |
max min |
具有可比較性的數據 |
count |
計數`非空的數據個數,都支持 |
- 都忽略
null
值 - 可以搭配
distinct
使用
1. 各函數的簡單使用
獲取平均工資和工資總和:
SELECT SUM(salary) FROM employees;
SELECT AVG(salary) FROM employees;
SELECT SUM(salary) 總工資, ROUND(AVG(salary),2) 平均工資, MIN(salary) 最低工資,
MAX(salary) 最高工資, COUNT(salary) 總數
FROM employees;
2. 搭配distinct的使用
SELECT COUNT(DISTINCT job_id) AS 工種數量, COUNT(job_id)
FROM employees;
3. COUNT 統計行數
SELECT COUNT(*) FROM employees;
加入常量值1
,相當於加入一列的常量值后統計個數
SELECT COUNT(1) FROM employees;
4. 和分組函數一同查詢的字段要求是group by后的字段
SELECT AVG(salary),salary
FROM employees;#(×)
二、分組查詢
SELECT xxx字段,分組函數 <--
FROM 表
[WHERE condition]
GROUP BY xxx字段 <-- 按xxx字段分組(相同值為一組)
[ORDER BY xx]
分組查詢中,SELECT
的字段需要和GROUP BY后的字段對應
實際執行流程:
- 按照
xxx字段(或函數等)
進行分組 - 對每個分組進行按分組函數進行特定的統計
- 返回每個組的統計結果
1. 簡單應用
查詢每個工種
的最高工資
SELECT job_id, MAX(salary)
FROM employees
GROUP BY job_id;

統計每個位置(城市)的部門個數
SELECT location_id, COUNT(1)
FROM departments
GROUP BY location_id;

2. 添加篩選條件
數據源 | 位置 | |
---|---|---|
分組前篩選 | 原始表 | GROUP BY 前 |
分組后篩選 | 分組后的結果集 | GROUP BY 后 |
① 分組前的篩選
統計各個上級的下屬有獎金
的員工的最高工資
SELECT manager_id, MAX(salary)
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;

② 分組后的篩選
使用HAVING
語句:
SELECT xxx字段,分組函數
FROM 表
[WHERE condition]
GROUP BY xxx字段
[ORDER BY xx]
HAVING xxx條件 <--在最后添加
查詢哪個部門的員工個數>2
- 查詢每個部門的員工個數
SELECT department_id, COUNT(1) AS cnt
FROM employees
GROUP BY department_id;
- 由
1
的結果進行篩選(員工個數>2)
SELECT department_id, COUNT(1) AS cnt
FROM employees
GROUP BY department_id
HAVING cnt>2;

查詢領導編號>102
的,每個其手下員工的最低工資>5000
,滿足條件的領導
的對應編號
SELECT manager_id, MIN(salary) AS 手下員工最低工資
FROM employees
WHERE manager_id > 102
GROUP BY manager_id
HAVING MIN(salary) > 5000

3. 按表達式或函數分組
按員工姓名的長度
分組,查詢每一組員工個數
,篩選員工個數>5
的有哪些
SELECT LENGTH(last_name) as NameLength, COUNT(1) as cnt
FROM employees
GROUP BY NameLength
HAVING cnt > 5
ORDER BY NameLength

4. 按多個字段分組
查詢每個(部門,工種)
的員工的平均工資
SELECT CONCAT( "(", department_id, ", ", job_id,")" ), AVG(salary)
FROM employees
GROUP BY department_id, job_id;

添加排序和篩選:
SELECT CONCAT( "(", department_id, ", ", job_id,")" ), AVG(salary)
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id, job_id
HAVING AVG(salary)>10000
ORDER BY AVG(salary) DESC;
