1. 程式人生 > 實用技巧 >lyt經典版MySQL基礎——進階2:分組函式

lyt經典版MySQL基礎——進階2:分組函式

  1 #二、分組函式
  2 /*
  3 功能:用作統計使用,又稱為聚合函式或統計函式或組函式
  4 
  5 分類:
  6 sum求和、avg平均值、 max最大值、min最小值、count計算個數
  7 
  8 特點:
  9 1、sum、avg一般用於處理數值型
 10    max、min、count可以處理任何型別
 11 2、以上分組函式都忽略null值
 12 3、可以和distinct搭配使用,實現去重的運算
 13 4、count函式的單獨介紹
 14 一般使用count(*)用作統計行數
 15 5、和分組函式一同查詢的欄位要求是group by後的欄位
 16 */
17 18 #1.簡單的使用 19 SELECT SUM(salary) FROM employees; 20 SELECT AVG(salary) FROM employees; 21 SELECT MIN(salary) FROM employees; 22 SELECT MAX(salary) FROM employees; 23 SELECT COUNT(salary) FROM employees; 24 25 SELECT SUM(salary) 和,AVG(salary) 平均,MAX(salary) 最高, 26 MIN(salary) 最低, COUNT
(salary) 個數 27 FROM employees; 28 29 SELECT SUM(salary) 和,ROUND(AVG(salary)) 平均,MAX(salary) 最高, 30 MIN(salary) 最低, COUNT(salary) 個數 31 FROM employees; 32 33 #2.引數支援哪些型別 34 SELECT MAX(last_name),MIN(last_name) FROM employees; 35 36 SELECT MAX(hiredate),MIN(hiredate) FROM employees; 37 38
SELECT COUNT(commission_pct) FROM employees; 39 SELECT COUNT(last_name) FROM employees; 40 41 #3.是否忽略null 42 SELECT SUM(commission_pct),AVG(commission_pct), 43 SUM(commission_pct)/35,SUM(commission_pct)/107 44 FROM employees; 45 46 SELECT MAX(commission_pct),MIN(commission_pct) FROM employees; 47 48 SELECT COUNT(commission_pct) FROM employees; 49 50 #4.和distinct搭配 51 SELECT SUM(DISTINCT salary),SUM(salary) FROM employees; 52 53 SELECT COUNT(DISTINCT salary),COUNT(salary) FROM employees; 54 55 #5.count函式的詳細介紹 56 SELECT COUNT(salary) FROM employees; 57 58 SELECT COUNT(*) FROM employees; -- 107 59 60 SELECT COUNT(1) FROM employees; -- 107 61 #效率: 62 /* 63 MYISAM儲存引擎下,count(*)的效率最高 64 INNODB儲存引擎下,count(*)和count(1)的效率差不多,比count(欄位)要高一些 65 */ 66 67 #6.和分組函式一同查詢的欄位有限制 68 -- select avg(salary),employee_id from employees; 69 70 #進階5:分組查詢 71 /* 72 引入:查詢每個部門的平均工資 73 SELECT AVG(salary) FROM employees; 74 語法: 75 select 分組函式,列(要求出現在group by的後面) 76 from 表 77 【where 篩選條件】 78 group by 分組的列表 79 【having 分組後的結果集】 80 【order by 子句】 81 注意: 82 查詢列表必須特殊,要求是分組函式和group by後出現的欄位 83 特點: 84 1、分組查詢中的篩選條件分為兩類 85 資料來源 位置 關鍵字 86 分組前篩選 原始表 group by子句的前面 where 87 分組後篩選 分組後的結果集 group by子句的後面 having 88 89 (1)分組函式做條件肯定是放在having子句中 90 (2)能用分組前篩選的,就優先考慮使用分組前篩選 91 92 2、group by子句支援單個欄位分組,多個欄位分組(多個欄位之間 93 用逗號隔開沒有順序要求),表示式或函式(用的較少) 94 95 3、也可以新增排序(排序放在整個分組查詢的最後) 96 執行順序: 97 from --> where --> group by --> having --> select --> order by 98 */ 99 100 #案例1:查詢每個工種的最高工資 101 SELECT MAX(salary),job_id FROM employees 102 GROUP BY job_id; 103 #案例2:查詢每個位置上的部門個數 104 SELECT COUNT(*),location_id FROM departments 105 GROUP BY location_id; 106 107 #新增篩選條件 108 #案例1:查詢郵箱中包含a字元的,每個部門的平均工資 109 SELECT AVG(salary),department_id FROM employees 110 WHERE email LIKE '%a%' 111 GROUP BY department_id; 112 #案例2:查詢有獎金的每個領導手下員工的最高工資 113 SELECT MAX(salary),manager_id 114 FROM employees 115 WHERE commission_pct IS NOT NULL 116 GROUP BY manager_id; 117 118 #新增複雜的篩選條件 119 #案例1:查詢哪個部門的員工個數>2 120 #(1)查詢每個部門的員工個數 121 SELECT COUNT(*),department_id 122 FROM employees 123 GROUP BY department_id; 124 #(2)根據(1)的結果進行篩選,查詢哪個部門的員工個數>2 125 SELECT COUNT(*),department_id 126 FROM employees 127 GROUP BY department_id 128 HAVING COUNT(*)>2; 129 130 #案例2:查詢每個工種有獎金的員工的最高工資>12000的工種編號和最高工資 131 #(1)查詢每個工種有獎金的員工的最高工資 132 SELECT MAX(salary),job_id FROM employees 133 WHERE commission_pct IS NOT NULL 134 GROUP BY job_id; 135 #(2)根據(1)結果繼續篩選,最高工資>12000 136 SELECT MAX(salary),job_id FROM employees 137 WHERE commission_pct IS NOT NULL 138 GROUP BY job_id 139 HAVING MAX(salary)>12000; 140 141 #案例3:查詢領導編號>102的每個領導手下的最低工資>5000的領導編號是哪個, 142 #以及其最低工資 143 #(1)查詢領導編號>102的每個領導手下的最低工資 144 SELECT MIN(salary),manager_id FROM employees 145 WHERE manager_id>102 146 GROUP BY manager_id; 147 #(2)最低工資>5000的領導編號是哪個 148 SELECT MIN(salary),manager_id FROM employees 149 WHERE manager_id>102 150 GROUP BY manager_id 151 HAVING MIN(salary)>5000; 152 153 #按表示式或函式分組 154 #案例:按員工姓名的長度分組,查詢每一組的員工個數,篩選員工個數>5的有哪些 155 #(1)查詢每個員工姓名長度的員工個數 156 SELECT COUNT(*),LENGTH(last_name) len_name FROM employees 157 GROUP BY len_name; 158 #(2)新增篩選條件 159 SELECT COUNT(*) c,LENGTH(last_name) len_name FROM employees 160 GROUP BY len_name 161 HAVING c>5; 162 163 #按多個欄位分組 164 #案例:查詢每個部門每個工種的員工的平均工資 165 SELECT AVG(salary),department_id,job_id FROM employees 166 GROUP BY department_id,job_id; 167 168 #新增排序 169 #案例:查詢每個部門每個工種的員工的平均工資, 170 #且平均工資>10000的,有獎金的,並且按平均工資的高低顯示 171 SELECT AVG(salary) a,department_id,job_id FROM employees 172 WHERE department_id IS NOT NULL 173 GROUP BY department_id,job_id 174 HAVING a>10000 175 ORDER BY a DESC;