功能:用做統計使用,又稱爲聚合函數或統計函數,組函數
分類:
sum 求和
avg 平均值
max 最大值
min 最小值
count 計算個數sql
特色: 一、sum、avg通常用於處理數值型;max、min、count能夠處理任何類型 二、以上分組函數都忽略null值 三、能夠和distinct搭配實現去重的運算 四、count函數詳細介紹:通常使用count(*)用做統計行數 五、和分組函數一同查詢的字符安要求是GROUP BY後的字段 #案例一、簡單使用 SELECT SUM(salary),AVG(salary),MAX(salary),MIN(salary),COUNT(salary) FROM employees; SELECT SUM(salary),ROUND(AVG(salary),2),MAX(salary),MIN(salary),COUNT(salary) FROM employees; #案例二、參數支持哪些類型 SELECT SUM(last_name),AVG(last_name) FROM employees; #3,是否忽略null SELECT SUM(commission_pct),AVG(commission_pct),SUM(commission_pct)/35,SUM(commission_pct)/107 FROM employees; SELECT MAX(commission_pct),MIN(commission_pct),COUNT(commission_pct) FROM employees; #四、和distinct搭配 SELECT SUM(DISTINCT salary),SUM(salary) FROM employees; SELECT COUNT(DISTINCT salary),COUNT(salary) FROM employees; #五、count函數詳細介紹 SELECT COUNT(*) FROM employees; SELECT COUNT(1) FROM employees; #效率 #MyISAM存儲引擎下 COUNT(*)的效率高 #INNODB存儲引擎下,count(*)和count(1)的效率差很少,比count(字段)要高 #六、和分組函數一同查詢的字段有限制 SELECT AVG(salary),employee_id FROM employees; #5.7版本不支持 報錯:1140 - In aggregated query without GROUP BY, expression #2 of SELECT list contains nonaggregated column 'myemployees.employees.employee_id'; this is incompatible with sql_mode=only_full_group_by, Time: 0.003000s 解釋:https://blog.csdn.net/qq_43279637/article/details/84842189 分組查詢:子句語法 SELECT 分組函數,列(要求出如今group by的後面) FROM 表 [WHERE 篩選條件] GROUP BY 分組的列表 [ORDER BY 子句]; 注意:查詢列表比較特殊,要求是分組函數和group by後出現的字段 特色: 一、分組查詢中的篩選條件分爲2類 數據源 位置 關鍵字 分組前篩選 原始表 group by子句的前面 where 分組後篩選 分組後的結果集 group by子句的後面 having 一、分組函數作條件確定放在having子句中 二、能用分組前篩選的,就優先考慮使用分組前篩選 二、group by子句支持單個字段分組,多個字段分組(多個字段之間用逗號隔開沒有順序要求),表達式或函數(用的較少) 三、也能夠添加排序(排序放在整個分組查詢的最後) */ #案例1:查詢每一個工種的最高工資 SELECT MAX(salary),job_id FROM employees GROUP BY job_id; #案例2:查詢每一個位置上的部門個數 SELECT COUNT(department_name),location_id FROM departments GROUP BY location_id; #添加分組前的篩選條件 #案例一、查詢郵箱中包含a字符的,每一個部門的平均工資 SELECT ROUND(AVG(salary),2),department_id FROM employees WHERE email LIKE '%a%' GROUP BY department_id; #案例二、查詢有獎金的每一個領導手下員工的最高工資 SELECT manager_id,MAX(salary) FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id; #添加分組後的篩選條件 #案例1:查詢哪一個部門的員工個數>2 #一、查詢每一個部門的員工個數 #二、根據1的結果進行篩選,查詢哪一個部門員工個數>2 SELECT COUNT(employee_id),department_id FROM employees GROUP BY department_id HAVING COUNT(employee_id)>2; #案例2:查詢每一個工種有獎金的員工的最高工資>12000的工種編號和最高工資 #一、查詢每一個工種有獎金的員工的最高工資 #二、根據1的結果繼續篩選,最高工資>12000 (表中有字段使用where判斷,沒有的用having) 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 MIN(salary),manager_id FROM employees WHERE manager_id>102 GROUP BY manager_id HAVING MIN(salary)>5000;
#案例1:按員工姓名的長度分組,查詢每一組的員工個數,篩選員工個數>5的有哪些 #查詢每一個長度的員工個數 SELECT COUNT(employee_id),LENGTH(last_name) FROM employees GROUP BY LENGTH(last_name); #添加篩選條件 SELECT COUNT(employee_id) AS c,LENGTH(last_name) AS FROM employees GROUP BY LENGTH(last_name) HAVING COUNT(employee_id)>5; #按多個字段分組 #案例2:查詢每一個部門每一個工種的員工的平均工資 SELECT AVG(salary),job_id,department_id FROM employees GROUP BY department_id,job_id; #添加排序 #案例3:查詢每一個部門每一個工種的員工的平均工資,並按平均工資高低顯示 SELECT AVG(salary),job_id,department_id FROM employees WHERE department_id IS NOT NULL GROUP BY department_id,job_id HAVING AVG(salary)>10000 ORDER BY AVG(salary) DESC;