DQL 語言 --分組查詢
阿新 • • 發佈:2020-07-30
一、語法
select 分組函式,分組後的欄位 from 表 【where 篩選條件】 group by 分組的欄位 【having 分組後的篩選】 【order by 排序列表】
二、特點
1、和分組函式一同查詢的欄位必須是group by後出現的欄位2、篩選分為兩類:分組前篩選和分組後篩選 針對的表 位置 連線的關鍵字 分組前篩選 原始表 group by前 where
分組後篩選 group by後的結果集 group by後 having 問題1:分組函式做篩選能不能放在where後面
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 分解: #①查詢每個部門的員工個數SELECTCOUNT(*),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;