MySQL分組查詢

2020-10-09 17:00:12

語法:
select 分組函數,列(要求出現在group by的後面)
from 表名
[where 篩選條件]
group by分組的列表
[order by子句]

注意:查詢列表比較特殊,要求是分組函數和group by後出現的欄位
一、分組前加篩選條件
案例1:查詢每個工種的最高工資

select max(salary),job_id
from employees
group by job_id;

案例2:查詢每個位置上的部門個數

select count(*),location_id
from employees
group by location_id;

案例3:查詢郵箱中包含a字元的,每個部門的平均工資

select avg(salary),department_id
from employees
where eamil like '%a%'
group by department_id;

案例4:查詢有獎金的每個領到手下員工的最高工資

select max(salary),manager_id
from employees
where commision 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 job_id,max(salary)
from employees
where commision is not null
group by job_id
having max(salary)>12000;

案例3:查詢領導編號>102的每個領導手下的最低工資>5000的領導編號是哪個,以及其最低工資

select manager_id,min(salary)
from employees
where manager_id>102
group by manager_id
having min(salary)>5000;

三、分組前後篩選的區別

資料來源位置關鍵字
分組前篩選原始表group by子句的前面where
分組後篩選分組後的結果集group by子句的後面having

大招:分組函數作為條件 肯定是放在having子句中,因為分組函數本身就是在原始表的基礎上查詢出的一個結果集

考慮到查詢效能的原因,如果能放在分組前篩選的就優先放在分組前篩選。

四、按表示式或函數分組
案例1:按員工姓名的長度分組,查詢每一組的員工個數,篩選員工個數>5的有哪些

select length(last_name),count(*)
from employees
group by length(last_name)
having count(*)>5;

where後面不支援別名,group by和having都支援別名

案例2:查詢每個部門每個工種的員工的平均工資

select avg(salary),department_id,job_id
from employees
group by department_id,job_id;

新增排序
案例3:查詢每個部門每個工種的平均工資,並且按平均工資的高低顯示

select avg(salary),department_id,job_id
from employees
group by department_id,job_id
order by avg(salary) desc;

group by子句支援多個欄位分組(多個欄位之間用逗號隔開,沒有順序要求),還支援表示式和分組函數(用的較少)