從0到1學資料庫:分組函式
技術標籤:0-1資料庫
點選上方“羅曉勝”,馬上關注,您的支援對我幫助很大
上期文章
/ 前言 /
一張表中的資料肯定會有重複的,如果我們想每組只取一條結果,或以組為單位進行操作,就需要用到分組函式
/ 正文 /
本章要點
• 分組函式的目的
• 分組函式基本概念
• SUM、AVG、MIN、MAX、COUNT函式使用
• GROUP BY子句
• HAVING子句
分組函式
• 分組函式是對錶中一組記錄進行操作,每組只返回一個結果。即首先要對錶記錄進行分組,然後再進行操作彙總,每組返回 一個結果。分組時可能是整個表分為一組,也可能根據條件分 成多組。
• 分組函式常用到以下的五個函式:– MIN – MAX – SUM – AVG – COUNT
MIN函式和MAX函式
• MIN和MAX函式主要是返回每組的最小值和最大值。
– MIN([DISTINCT|ALL]表示式) – MAX([DISTINCT|ALL]表示式)
• 例 使用者最低和最高分數的示例。
SELECT MIN(c_score), MAX(c_score) FROM student;
SUM函式和AVG函式
• SUM和AVG函式分別返回總和及平均值。
– SUM([DISTINCT|ALL]n)
– AVG([DISTINCT|ALL]n)
• SUM和AVG函式都是隻能夠對數字型別的列或表示式操作。
• 例 使用者總分數和平均分數。
SELECT SUM(c_score), AVG(c_score) FROM student;
COUNT函式
• COUNT函式的主要功能是返回每組記錄的條數。– COUNT({*|[DISTINCT|ALL]表示式})
• 例 使用者總數。
SELECT COUNT(*) FROM student;
組函式中DISTINCT
• DISTINCT會消除重複記錄後再使用組函式
• 例 班級總數。
SELECT COUNT(DISTINCT c_class) FROM student;
組函式中空值處理
• 所有組函式對空值都是忽略的。
• 例 獲取平均分數——忽略空值。
SELECT AVG(c_score) FROM student;
分組函式
GROUP BY子句
SELECT FROM [WHERE [GROUP BY [ORDER BY
列名, 組函式(列名) 表名 條件] 分組列] 列名];
• 組函式忽略空值 • 結果集隱式按升序排列,如果需要改變排序方式可以使用 Order by 子句
• 例 每個班級的總分數。SELECT c_class, SUM(c_score) FROM student GROUP BY c_class ;
• 在GROUP BY子句使用中,有兩點需要注意:– GROUP BY子句後的列可以不在SELECT語句中出現。– SELECT子句中出現的非分組函式列必須在GROUP BY子句 中出現。
• 例 查詢每個班級平均分數,班級列不顯示,同時結果按照平均分數排序。SELECT AVG(c_score) FROM student GROUP BY c_class ORDER BY AVG(c_score);
• 例 分組彙總錯誤示例 SELECT c_class, age, AVG(c_score) FROM student GROUP BY c_class;
• 例 分組彙總正確示例 SELECT c_class, age, AVG(c_score) FROM student GROUP BY c_class,age;
HAVING子句
• 例 組函式篩選示例。SELECT c_class, MAX(c_score) FROM student WHERE c_score>=80 GROUP BY c_class;
錯誤示例
SELECT c_class, MAX(c_score) FROM student WHERE MAX(c_score)>=80 GROUP BY c_class;
錯誤原因
WHERE子句中使用集函式。
• 查詢語句的執行順序是:– FROM WHERE GROUP BY SELECT ORDER BY
• 語法結構如下:
SELECT FROM [WHERE [GROUP BY [HAVING [ORDER BY 列名, 組函式 表名 條件] 分組列] 組函式表示式] 列名];
• 例6-16 組函式篩選示例。
SELECT c_class, MAX(c_score)
FROM student
GROUP BY c_class HAVING MAX(c_score)>=80;
總結SELECT語句執行過程
– 通過FROM子句中找到需要查詢的表;– 通過WHERE子句進行非分組函式篩選判斷;– 通過GROUP BY子句完成分組操作;– 通過HAVING子句完成組函式篩選判斷;– 通過SELECT子句選擇顯示的列或表示式及組函式;– 通過ORDER BY子句進行排序操作。
SELECT [DISTINCT|DISINCTROW|ALL] select_expression,... -- 查詢結果 [ FROM table_references -- 指定查詢的表 [WHERE where_definition] -- where子句,查詢資料的過濾條件 [GROUP BY col_name,...] -- 對[匹配where子句的]查詢結果進行分組 [HAVING where_definition] -- 對分組後的結果進行條件限制 [ORDER BY{unsigned_integer | col_name | formula} [ASC | DESC],...] -- 對查詢結果進行排序 [LIMIT [offset,] rows] -- 對查詢的顯示結果進行條數限制 [PROCEDURE procedure_name] --查詢儲存過程返回的結果集資料 ]
• 例 組函式演示。
SELECT c_class, MAX(c_score)
FROM student
WHERE c_score>=80
GROUP BY c_class;
HAVING MAX(c_score)>=80
ORDER BY MAX(c_score);
組函式的巢狀
• 組函式可以實現巢狀操作,巢狀級數是2級(select)。
• 例 組函式巢狀演示。獲取使用者表中,班級最多的班級
聚合函式不可以直接巢狀使用,比如:max(count(*))
錯誤示例:SELECT MAX(COUNT(id)) FROM student GROUP BY c_class;
這裡會報錯:Invalid use of group function
思路:可以巢狀子查詢使用(先分組取出count值, 再將count值倒序排列,取第一個值就是最大的)
select max(total) from ( select count(*) as total from student group by c_class) as aa;
/ 總結 /
本文主要講了分組函式的用法,分組函式在我們分析組與組資料關係時會用到。
往期推薦:
關注我的公眾號,學習技術或投稿
長按上圖,識別圖中二維碼即可關注