SQL語句(三)分組函數和分組查詢


一、分組函數

功能:統計信息
分類:

  • sum求和
  • avg平均值
  • max最大值
  • min最小值
  • count計算個數

特點

  1. 參數支持類型
函數 參數支持類型
sum avg 具有可加性的數據
max min 具有可比較性的數據
count 計數`非空的數據個數,都支持
  1. 都忽略null
  2. 可以搭配distinct使用

1. 各函數的簡單使用

獲取平均工資和工資總和:

SELECT SUM(salary) FROM employees;
SELECT AVG(salary) FROM employees;

在這里插入圖片描述
在這里插入圖片描述

SELECT  SUM(salary) 總工資, ROUND(AVG(salary),2) 平均工資, MIN(salary) 最低工資,
		MAX(salary) 最高工資, COUNT(salary) 總數
FROM 	employees;

在這里插入圖片描述

2. 搭配distinct的使用

SELECT	COUNT(DISTINCT job_id) AS 工種數量, COUNT(job_id)
FROM	employees;

在這里插入圖片描述

3. COUNT 統計行數

SELECT COUNT(*) FROM employees;

加入常量值1,相當於加入一列的常量值后統計個數

SELECT COUNT(1) FROM employees;

4. 和分組函數一同查詢的字段要求是group by后的字段

SELECT AVG(salary),salary
FROM employees;#(×)

在這里插入圖片描述

二、分組查詢

SELECT 	xxx字段,分組函數	<--
FROM	表
[WHERE	condition]
GROUP BY xxx字段			<-- 按xxx字段分組(相同值為一組)
[ORDER BY xx]

分組查詢中,SELECT的字段需要和GROUP BY后的字段對應

實際執行流程:

  1. 按照xxx字段(或函數等)進行分組
  2. 對每個分組進行按分組函數進行特定的統計
  3. 返回每個組的統計結果

1. 簡單應用

查詢每個工種最高工資

SELECT 	 job_id, MAX(salary)
FROM 	 employees
GROUP BY job_id;

統計每個位置(城市)的部門個數

SELECT 	 location_id, COUNT(1)
FROM 	 departments
GROUP BY location_id;

2. 添加篩選條件

數據源 位置
分組前篩選 原始表 GROUP BY
分組后篩選 分組后的結果集 GROUP BY

① 分組前的篩選

統計各個上級的下屬有獎金的員工的最高工資

SELECT 	 manager_id, MAX(salary)
FROM 	 employees
WHERE 	 commission_pct IS NOT NULL
GROUP BY manager_id;

② 分組后的篩選

使用HAVING語句:

SELECT 	xxx字段,分組函數
FROM 	表
[WHERE	condition]
GROUP BY xxx字段
[ORDER BY xx]
HAVING  xxx條件	<--在最后添加

查詢哪個部門的員工個數>2

  1. 查詢每個部門的員工個數
SELECT 		department_id, COUNT(1) AS cnt
FROM 		employees
GROUP BY	department_id;
  1. 1的結果進行篩選(員工個數>2)
SELECT 		department_id, COUNT(1) AS cnt
FROM 		employees
GROUP BY	department_id
HAVING 		cnt>2;

查詢領導編號>102的,每個其手下員工的最低工資>5000,滿足條件的領導的對應編號

SELECT 	 manager_id, MIN(salary) AS 手下員工最低工資
FROM 	 employees
WHERE 	 manager_id > 102
GROUP BY manager_id
HAVING 	 MIN(salary) > 5000

3. 按表達式或函數分組

員工姓名的長度分組,查詢每一組員工個數,篩選員工個數>5的有哪些

SELECT	LENGTH(last_name) as NameLength, COUNT(1) as cnt
FROM 	employees
GROUP BY NameLength
HAVING   cnt > 5
ORDER BY NameLength

4. 按多個字段分組

查詢每個(部門,工種)的員工的平均工資

SELECT CONCAT( "(", department_id, ", ", job_id,")" ), AVG(salary)
FROM employees
GROUP BY department_id, job_id;

添加排序和篩選:

SELECT	CONCAT( "(", department_id, ", ", job_id,")" ), AVG(salary)
FROM	employees
WHERE	department_id IS NOT NULL
GROUP BY	department_id, job_id
HAVING 		AVG(salary)>10000
ORDER BY 	AVG(salary) DESC;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM