MySQL基礎之分組函數

功能:用做統計使用,又稱爲聚合函數或統計函數,組函數
分類:
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;
相關文章
相關標籤/搜索