MySQL進階5:分組查詢

# 進階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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章