MySQL進階五:分組查詢

目錄

group by

語法

注意

特點

1、簡單分組查詢

2、添加分組前的篩選條件

3、添加分組後複雜的篩選條件

4、按表達式或者函數分組

5、按多個字段進行分組

6、添加排序


 文章涉及到的MySQL、SQLyog的配置安裝,請參考 MySQL配置+SQLyog安裝教程

group by

語法

select 分組函數,列(要求出現在group by的後面)
from 表
【where 篩選條件】
group by 分組的列表
【order by】

注意

查詢列表必須特殊,要求是分組函數和group by子句後出現的字段

特點

1) 分組查詢中的篩選條件分爲兩類

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

分組函數做條件肯定是放在having子句中

2) group by子句支持單個字段分組,多個字段分組(多個字段之間用逗號隔開沒有順序要求),表達式或函數(用的較少)

3) 也可以添加排序(排序放在整個分組查詢的最後)

1、簡單分組查詢

#案例1【簡單的分組查詢】:查詢每個工種的最高工資
SELECT MAX(salary), job_id
FROM employees
GROUP BY job_id;
#案例2【簡單的分組查詢】:查詢每個位置上的部門個數
SELECT COUNT(*), location_id
FROM departments
GROUP BY location_id;

2、添加分組前的篩選條件

#案例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;

3、添加分組後複雜的篩選條件

#案例1:查詢哪個部門的員工個數>2
#step1.查詢每個部門的員工個數
SELECT COUNT(*), department_id
FROM employees
GROUP BY department_id;
#step2.根據1的結果進行篩選,查詢哪個部門的員工數>2
SELECT COUNT(*), department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>2;
#案例2:查詢每個工種有獎金的員工的最高工資,且大於12000的工種編號和其最高工資
#1.查詢每個工種有獎金的員工的最高工資
#2.根據1的結果繼續篩選,最高工資>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的領導編號是哪個,以及其最低工資
#1.查詢每個領導手下的員工最低工資
#2.添加篩選條件
SELECT MIN(salary), manager_id
FROM employees
WHERE manager_id>102 #原始表就有,放在from後面
GROUP BY manager_id
HAVING MIN(salary)>5000; #原始表沒有,用having

4、按表達式或者函數分組

#案例:按員工姓名的長度分組,查詢每一組員工的個數,篩選員工數大於5的有哪些
SELECT COUNT(*), LENGTH(last_name) len_name
FROM employees
GROUP BY LENGTH(last_name) #使用別名len_name也是可以的
HAVING COUNT(*)>5; #使用別名c是可以的,但是where不支持

5、按多個字段進行分組

#案例:查詢每個部門每個工種的員工的平均工資
SELECT AVG(salary), department_id, job_id
FROM employees
GROUP BY department_id, job_id; #可以調換位置

6、添加排序

#案例:查詢每個部門每個工種的員工的平均工資,並且按平均工資的高低顯示出來
SELECT AVG(salary) a, department_id, job_id
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id, job_id
ORDER BY AVG(salary) DESC; #可以使用別名a

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章