語法:
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子句支援多個欄位分組(多個欄位之間用逗號隔開,沒有順序要求),還支援表示式和分組函數(用的較少)