# 進階5:分組查詢
/*
語法:
select 分組函數,列(要求出現在group by的後面)
from 表
【where 篩選條件】
group by 分組的列表
【order by 子句】
注意:
查詢列表必須特殊,要求是分組函數和group by後出現的字段
特點:
1、分組查詢中的篩選條件分爲兩類
數據源 位置 關鍵字
分組前的篩選 原始表 group by子句的前面 where
分組後的篩選 分組後的結果集 group by子句的後面 having
①分組函數做條件肯定是放在having語句中
②能用分組前篩選的,就用分組前篩選
2、group by子句支持單個字段分組,多個字段分組(多個字段之間用逗號隔開,沒有順序要求)
表達式或函數(用的較少)
3、也可以添加排序(排序放在整個分組查詢的最後)
*/
# 案例1: 查詢每個工種的最高工資
SELECT MAX(salary),job_id
FROM employees
GROUP BY job_id;
# 案例2: 查詢每個位置上的部門個數
SELECT COUNT(*),location_id
FROM departments
GROUP BY location_id;
# 添加篩選條件
# 案例1:查詢郵箱中包含a字符的,每個部門的平均工資
SELECT AVG(salary),department_id
FROM employees
WHERE email LIKE '%a%'
GROUP BY department_id;
# 案例2: 查詢有獎金的每個領導手下員工的最高工資
SELECT MAX(salary),manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;
# 添加複雜的篩選條件
# 案例1:查詢哪個部門的員工人數>2
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>2;
# 案例2: 查詢每個工種有獎金的員工的最高工資>12000的工種編號和最高工資
SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
# 案例3:查詢領導編號>102的每個領導手下的最低工資>5000的領導編號是哪個,以及最低工資
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id>102
GROUP BY manager_id
HAVING MIN(salary)>5000;
# 按表達式或函數分組
# 案例:按員工姓名的長度分組,查詢每一組的員工個數篩選員工個數>5的有哪些
SELECT COUNT(*),LENGTH(last_name) AS len_name
FROM employees
GROUP BY LENGTH(last_name)
HAVING COUNT(*)>5; # 可以用改變後的列名
# 按多個字段分組
# 案例:查詢每個部門每個工種員工的平均工資
SELECT AVG(salary),department_id,job_id
FROM employees
GROUP BY department_id,job_id;
# 案例:查詢每個部門每個有獎金工種員工的平均工資>10000,並且按照平均工資的高低顯示
SELECT AVG(salary),department_id,job_id
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id,job_id
HAVING AVG(salary)>10000
ORDER BY AVG(salary) DESC;
MySQL進階5:分組查詢
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.