分組查詢
/*
語法:
select 查詢列表
from 表
【where 篩選條件】
group by 分組的字段
【order by 排序的字段】;
特點:
1、和分組函數一同查詢的字段必須是group by后出現的字段
2、篩選分為兩類:分組前篩選和分組后篩選
針對的表 位置 連接的關鍵字
分組前篩選 原始表 group by前 where
分組后篩選 group by后的結果集 group by后 having
問題1:分組函數做篩選能不能放在where后面
答:不能
問題2:where——group by——having
一般來講,能用分組前篩選的,盡量使用分組前篩選,提高效率
3、分組可以按單個字段也可以按多個字段
4、可以搭配着排序使用
*/
#引入:查詢每個部門的員工個數
SELECT COUNT(*) FROM employees WHERE department_id=90;
#1.簡單的分組
#案例1:查詢每個工種的員工平均工資
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id;
#案例2:查詢每個位置的部門個數
SELECT COUNT(*),location_id
FROM departments
GROUP BY location_id;
#2、可以實現分組前的篩選
#案例1:查詢郵箱中包含a字符的 每個部門的最高工資
SELECT MAX(salary),department_id
FROM employees
WHERE email LIKE '%a%'
GROUP BY department_id;
#案例2:查詢有獎金的每個領導手下員工的平均工資
SELECT AVG(salary),manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;
#3、分組后篩選
#案例:查詢哪個部門的員工個數>5
#①查詢每個部門的員工個數
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id;
#② 篩選剛才①結果
SELECT COUNT(*),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 MAX(salary)>12000;
#案例3:領導編號>102的每個領導手下的最低工資大於5000的領導編號和最低工資manager_id>102
SELECT manager_id,MIN(salary)
FROM employees
GROUP BY manager_id
HAVING MIN(salary)>5000;
#4.添加排序
#案例:每個工種有獎金的員工的最高工資>6000的工種編號和最高工資,按最高工資升序
SELECT job_id,MAX(salary) m
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING m>6000
ORDER BY m ;
#5.按多個字段分組
#案例:查詢每個工種每個部門的最低工資,並按最低工資降序
SELECT MIN(salary),job_id,department_id
FROM employees
GROUP BY department_id,job_id
ORDER BY MIN(salary) DESC;