1. 程式人生 > 實用技巧 >DQL 語言 --分組查詢

DQL 語言 --分組查詢

一、語法

select 分組函式,分組後的欄位
from 表
【where 篩選條件】
group by 分組的欄位
【having 分組後的篩選】
【order by 排序列表】

二、特點

  1、和分組函式一同查詢的欄位必須是group by後出現的欄位
  2、篩選分為兩類:分組前篩選和分組後篩選             針對的表        位置        連線的關鍵字     分組前篩選 原始表 group by前 where

    分組後篩選 group by後的結果集 group by後 having   問題1:分組函式做篩選能不能放在where後面
    答:不能   問題2:where——group by——having     一般來講,能用分組前篩選的,儘量使用分組前篩選,提高效率   3、分組可以按單個欄位也可以按多個欄位
  4、可以搭配著排序使用 #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

# where Count(*) > 5   錯誤寫法,where後不能跟分組函式

GROUP BY department_id

HAVING COUNT(*)>5;      #應該用having

#案例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
WHERE manager_id>102
GROUP BY manager_id
HAVING MIN(salary)>5000;

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

#①查詢每個長度的員工個數

SELECT COUNT(*),LENGTH(last_name) len_name
FROM employees
GROUP BY LENGTH(last_name);

#②新增篩選條件

SELECT COUNT(*) c,LENGTH(last_name) len_name
FROM employees
GROUP BY len_name      #別名
HAVING c>5;