MySQL數(shù)據(jù)庫:第七章:分組查詢

回退至Mysql數(shù)據(jù)庫理論與實戰(zhàn)
#進階6:分組查詢

語法:
select 查詢列表 ④
from 表名——————————①
where 分組前條件—— ②
group by 分組的字段③
having 分組后條件 ⑤
order by 排序列表 ⑥
特點:
1、查詢列表往往是:分組函數(shù)和分組后的字段
換句話說,和分組函數(shù)一同查詢的字段,一般就是分組后的字段
2、分組查詢的篩選有兩種:分組前篩選和分組后篩選
連接關(guān)鍵字 位置 篩選的結(jié)果集
分組前篩選 where group by前面 原始表
分組后篩選 having group by后面 分組后的查詢結(jié)果(虛擬表)
結(jié)論:分組函數(shù)做條件 肯定是 分組后篩選條件!??!
3、分組查詢可以通過單個字段,也可以通過多個字段,中間用逗號隔開

#1)簡單的分組
#案例1:查詢每個工種的員工平均工資
SELECT AVG(salary) 平均工資,job_id
FROM employees
GROUP BY job_id;
#2)可以實現(xiàn)分組前的篩選
#案例1:查詢郵箱中包含a字符的 每個部門的最高工資
SELECT MAX(salary) ,department_id
FROM employees
WHERE  email LIKE '%a%'
GROUP BY department_id;
#案例2:查詢有獎金的每個領(lǐng)導(dǎo)手下員工的平均工資
SELECT AVG(salary) 平均工資,manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;
#3)可以實現(xiàn)分組后的篩選
#案例1:查詢哪個部門的員工個數(shù)>5
#①查詢每個部門的員工個數(shù)
SELECT COUNT(*) 員工個數(shù),department_id
FROM employees
GROUP BY department_id
#②查詢①結(jié)果集中,有哪個部門的員工個數(shù)>5
SELECT COUNT(*) 員工個數(shù),department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>5
#案例2:每個工種有獎金的員工的最高工資>12000的工種編號和最高工資
SELECT job_id,MAX(salary) 最高工資
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING 最高工資>12000;
#案例3:領(lǐng)導(dǎo)編號>102的每個領(lǐng)導(dǎo)手下的最低工資大于5000的領(lǐng)導(dǎo)編號和最低工資
SELECT manager_id,MIN(salary) 最低工資
FROM employees
WHERE manager_id > 102
GROUP BY manager_id
HAVING 最低工資>5000;
#4)可以實現(xiàn)排序
#案例:每個工種有獎金的員工的最高工資>6000的工種編號和最高工資,按最高工資升序
SELECT job_id,MAX(salary) 最高工資
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING 最高工資>6000
ORDER BY 最高工資 ASC;
#5)按多個字段分組
#案例:查詢每個工種每個部門的最低工資,并按最低工資降序
SELECT MIN(salary) 最低工資,job_id,department_id
FROM employees
GROUP BY job_id,department_id
ORDER BY 最低工資 DESC;
#1. 查詢各 job_id 的員工工資的最大值,最小值,平均值,總和,并按 job_id 升序
SELECT MAX(salary) 最大值,MIN(salary) 最小值,AVG(salary) 平均值,SUM(salary) 和
FROM employees
GROUP BY job_id
ORDER BY job_id;
#2. 查詢員工最高工資和最低工資的差距(DIFFERENCE)
SELECT MAX(salary)-MIN(salary) DIFFERENCE
FROM employees;
#3. 查詢各個管理者手下員工的最低工資,其中最低工資不能低于 6000,沒有管理者的員
#工不計算在內(nèi)
SELECT MIN(salary) 最低工資,manager_id
FROM employees
GROUP BY manager_id
HAVING 最低工資>=6000 AND manager_id IS NOT NULL;
#4. 查詢所有部門的編號,員工數(shù)量和工資平均值,并按平均工資降序
SELECT department_id,COUNT(*) 個數(shù),AVG(salary) 平均工資
FROM employees
GROUP BY department_id
ORDER BY 平均工資 DESC;
#5. 選擇具有各個 job_id 的員工人數(shù)
SELECT COUNT(*) 人數(shù),job_id
FROM employees
GROUP BY job_id;