1. 程式人生 > 其它 >從0到1學資料庫:分組函式

從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;

/ 總結 /

本文主要講了分組函式的用法,分組函式在我們分析組與組資料關係時會用到。

往期推薦:

如何入門做軟體開發

為什麼我不推薦入行程式設計師

做全棧開發很難嗎

關注我的公眾號,學習技術或投稿

圖片

長按上圖,識別圖中二維碼即可關注