1. 程式人生 > >Mysql 分組查詢(group by)

Mysql 分組查詢(group by)

分組查詢

1 語法

select 查詢列表 from 表 【where 篩選條件】 group by 分組的欄位【order by 排序的欄位】;

2 特點

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

    • 問題1:分組函式做篩選能不能放在where後面

      答:不能

    • 問題2:where——group by——having

      一般來講,能用分組前篩選的,儘量使用分組前篩選,提高效率

  • 3、分組可以按單個欄位也可以按多個欄位

  • 4、可以搭配著排序使用

3 案例

#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、分組後篩選 #案例1:查詢哪個部門的員工個數>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 WHERE manager_id>102 GROUP BY manager_id HAVING MIN(salary)>5000; #4.新增排序 #案例:每個工種有獎金的員工的最高工資>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 ; #5.按多個欄位分組 #案例:查詢每個工種每個部門的最低工資,並按最低工資降序 SELECT MIN(salary),job_id,department_id FROM employees GROUP BY department_id,job_id ORDER BY MIN(salary) DESC;