1. 程式人生 > 實用技巧 >MySQL基礎-06DQL語言(資料查詢語言)-進階5分組查詢

MySQL基礎-06DQL語言(資料查詢語言)-進階5分組查詢

宣告:此MySQL基礎學習源自尚矽谷。(推薦)b站官方連結:https://www.bilibili.com/video/BV1xW411u7ax?p=1

進階5:分組查詢

語法:

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、可以搭配著排序使用
5、group by 和 having後面都支援別名,但是不常用,在mysql中支援,oracle等資料庫中不支援或比較麻煩,所以為了統一,在mysql中不常使用

引入:查詢每個部門的員工個數

SELECT 
  COUNT(*) 
FROM
  `employees` 
GROUP BY `department_id` ;

1.簡單的分組

案例1:查詢每個工種的員工平均工資

SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id;

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

SELECT COUNT(*),location_id # 和分組函式一同查詢的欄位,必須是group by後出現的欄位
FROM departments
GROUP BY location_id;

2.分組前篩選

案例1:查詢郵箱中包含a字元的 每個部門的最高工資

SELECT 
  MAX(salary),
  `department_id` # 和分組函式一同查詢的欄位,必須是group by後出現的欄位
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的領導編號和最低工資

SELECT manager_id,MIN(salary)
FROM employees
GROUP BY manager_id
HAVING MIN(salary)>5000;

4.按表示式或函式分組

案例:按員工姓名的長度分組,查詢每一組的員工個數,篩選員工個數>5的有哪些

# ①查詢每個長度的員工個數
SELECT 
  COUNT(*),
  LENGTH(last_name) len_name 
FROM
  `employees` 
GROUP BY LENGTH(`last_name`) ;

# ②新增篩選條件
SELECT 
  COUNT(*),
  LENGTH(last_name) len_name 
FROM
  `employees` 
GROUP BY LENGTH(`last_name`) 
HAVING COUNT(*) > 5 ;

5.新增排序

案例:每個工種有獎金的員工的最高工資>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 ;

6.按多個欄位分組

案例:查詢每個工種每個部門的最低工資,並按最低工資降序

SELECT MIN(salary),job_id,department_id
FROM employees
GROUP BY department_id,job_id
ORDER BY MIN(salary) DESC;