1. 程式人生 > 實用技巧 >分組查詢知識點以及案例

分組查詢知識點以及案例

  1 #進階5:分組查詢
  2 /*
  3 語法:    SELECT 分組函式,列(要求出現在group by的後面)
  4           from 表
  5                     GROUP BY 分組的列表
  6                     [order by子句]
  7 注意:    查詢列表必須特殊,要求是分組函式和group by後出現的欄位
  8 特點:
  9           1、分組查詢中斷篩選條件為兩類
 10                        資料來源              位置                     關鍵字
11 分組前篩選 原始表 GROUP BY子句的前面 WHERE 12 分組後篩選 分組後的結果集 GROUP BY子句的後面 HAVING 13 ①分組函式做條件肯定是放在having子句中 14 ②能用分組前篩選的,就優先考慮使用分組. 15 2.GROUP BY子句支援單個欄位分組,多個欄位分組(多個欄位之間用逗號隔開沒有順序要求),表示式或函式(用得較少)
16 3、也可以新增排序(排序放在整個分組查詢的最後) 17 */ 18 #引入:查詢每個部門的平均工資 19 SELECT avg(salary ) FROM employees; 20 21 #簡單的分組查詢 22 #案例1:查詢每個工種的最高工資 23 SELECT MAX(salary),job_id 24 FROM employees 25 GROUP BY job_id; 26 27 #案例2、查詢每個位置上的部門個數 28 SELECT COUNT(*),location_id 29 FROM departments
30 GROUP BY location_id; 31 32 #新增篩選條件 33 #案例1:查詢有幸中包含a字元的,每個部門的平均工資 34 35 SELECT avg(salary),department_id 36 FROM employees 37 WHERE email LIKE '%a%' 38 GROUP BY department_id; 39 40 #案例2:查詢有獎金的每個領導手下員工的最高工資 41 SELECT MAX(salary),manager_id 42 FROM employees 43 WHERE commission_pct is not NULL 44 GROUP BY manager_id; 45 46 #新增複雜的篩選條件 47 48 #案例1:查詢那個部門的員工個數>2 49 #①查詢每個部門的員工個數 50 SELECT COUNT(*),department_id 51 FROM employees 52 GROUP BY department_id; 53 54 #②根據①的結果進行篩選,查詢那個部門的員工個數>2 55 SELECT COUNT(*),department_id 56 FROM employees 57 GROUP BY department_id 58 HAVING COUNT(*)>2; 59 60 #案例2:查詢每個工種有獎金的員工的最高工資>12000的工種變化 61 #① 查詢每個工種有獎金的員工的最高工資 62 63 SELECT MAX(salary),job_id 64 FROM employees 65 WHERE commission_pct is not NULL 66 GROUP BY job_id; 67 68 #②根據①結果繼續篩選,最高工資>12000 69 SELECT MAX(salary),job_id 70 FROM employees 71 WHERE commission_pct is not NULL 72 GROUP BY job_id 73 HAVING MAX(salary)>12000; 74 75 #案例3:查詢領導編號>102的每個領導手下的最低工資>5000的領導編號是哪個,以及最低工資 76 SELECT manager_id,MIN(salary) 77 FROM employees 78 WHERE manager_id>102 79 GROUP BY manager_id 80 HAVING MIN(salary)>5000; 81 82 #按表示式或函式分組 83 84 #案例:按員工姓名的長度分組,查詢每一組的員工個數,篩選員工個數>5的有哪些 85 SELECT COUNT(*) c,LENGTH(last_name) len_name 86 FROM employees 87 GROUP BY len_name 88 HAVING C>5; 89 90 #按多個欄位分組 91 92 #案例:查詢每個部門每個工種的員工的平均工資 93 SELECT avg(salary) ,department_id,job_id 94 FROM employees 95 GROUP BY job_id,department_id; 96 97 #新增排序 98 #案例:查詢每個部門每個工種的員工的平均工資,按平均工資的高低來排序 99 SELECT avg(salary) ,department_id,job_id 100 FROM employees 101 WHERE department_id is not NULL 102 GROUP BY job_id,department_id 103 HAVING avg(salary)>10000 104 ORDER BY avg(salary) desc; 105 106 #1.查詢各job_id的員工工資的最大值,最小值,平均值,總和,並按job_id升序 107 SELECT MAX(salary) a,MIN(salary) i,avg(salary) avg,SUM(salary) sum 108 FROM employees 109 GROUP BY job_id 110 ORDER BY job_id ; 111 112 113 #2.查詢員工最高工資和最低工資的差距( DIFFERENCE114 SELECT MAX(salary)-MIN(salary) difference 115 FROM employees; 116 117 118 #3.查詢各個管理者手下員工的最低工資,其中最低工資不能低於6000,沒有管理者的員工不計算在內 119 SELECT min(salary),manager_id 120 FROM employees 121 WHERE manager_id is not null 122 GROUP BY manager_id 123 HAVING MIN(salary)>=6000; 124 125 #4.查詢所有部門的編號,員工數量和工資平均值,並按平均工資降序 126 SELECT department_id, COUNT(*),avg(salary) a 127 FROM employees 128 GROUP BY department_id 129 ORDER BY a DESC; 130 131 132 #5.選擇具有各個job_id的員工人數 133 SELECT COUNT(*),job_id 134 FROM employees 135 WHERE job_id is not NULL 136 GROUP BY job_id;