
- SQL 教程
- SQL - 首頁
- SQL - 概述
- SQL - RDBMS 概念
- SQL - 資料庫
- SQL - 語法
- SQL - 資料型別
- SQL - 運算子
- SQL - 表示式
- SQL 資料庫
- SQL - 建立資料庫
- SQL - 刪除資料庫
- SQL - 選擇資料庫
- SQL - 重新命名資料庫
- SQL - 顯示資料庫
- SQL - 備份資料庫
- SQL 表格
- SQL - 建立表格
- SQL - 顯示錶格
- SQL - 重命名錶格
- SQL - 清空表格
- SQL - 克隆表格
- SQL - 臨時表格
- SQL - 修改表格
- SQL - 刪除表格
- SQL - 刪除表格
- SQL - 約束
- SQL 查詢
- SQL - 插入查詢
- SQL - 選擇查詢
- SQL - SELECT INTO
- SQL - INSERT INTO SELECT
- SQL - 更新查詢
- SQL - 刪除查詢
- SQL - 排序結果
- SQL 檢視
- SQL - 建立檢視
- SQL - 更新檢視
- SQL - 刪除檢視
- SQL - 重新命名檢視
- SQL 運算子和子句
- SQL - WHERE 子句
- SQL - TOP 子句
- SQL - DISTINCT 子句
- SQL - ORDER BY 子句
- SQL - GROUP BY 子句
- SQL - HAVING 子句
- SQL - AND & OR
- SQL - 布林 (BIT) 運算子
- SQL - LIKE 運算子
- SQL - IN 運算子
- SQL - ANY,ALL 運算子
- SQL - EXISTS 運算子
- SQL - CASE
- SQL - NOT 運算子
- SQL - 不等於
- SQL - IS NULL
- SQL - IS NOT NULL
- SQL - NOT NULL
- SQL - BETWEEN 運算子
- SQL - UNION 運算子
- SQL - UNION 與 UNION ALL
- SQL - INTERSECT 運算子
- SQL - EXCEPT 運算子
- SQL - 別名
- SQL 連線
- SQL - 使用連線
- SQL - 內連線
- SQL - 左連線
- SQL - 右連線
- SQL - 交叉連線
- SQL - 全連線
- SQL - 自連線
- SQL - 刪除連線
- SQL - 更新連線
- SQL - 左連線與右連線
- SQL - UNION 與 JOIN
- SQL 金鑰
- SQL - 唯一鍵
- SQL - 主鍵
- SQL - 外部索引鍵
- SQL - 複合鍵
- SQL - 備用鍵
- SQL 索引
- SQL - 索引
- SQL - 建立索引
- SQL - 刪除索引
- SQL - 顯示索引
- SQL - 唯一索引
- SQL - 聚簇索引
- SQL - 非聚簇索引
- 高階 SQL
- SQL - 萬用字元
- SQL - 註釋
- SQL - 注入
- SQL - 託管
- SQL - MIN & MAX
- SQL - NULL 函式
- SQL - 檢查約束
- SQL - 預設約束
- SQL - 儲存過程
- SQL - NULL 值
- SQL - 事務
- SQL - 子查詢
- SQL - 處理重複項
- SQL - 使用序列
- SQL - 自動遞增
- SQL - 日期和時間
- SQL - 遊標
- SQL - 公共表表達式
- SQL - GROUP BY 與 ORDER BY
- SQL - IN 與 EXISTS
- SQL - 資料庫調整
- SQL 函式參考
- SQL - 日期函式
- SQL - 字串函式
- SQL - 聚合函式
- SQL - 數值函式
- SQL - 文字和影像函式
- SQL - 統計函式
- SQL - 邏輯函式
- SQL - 遊標函式
- SQL - JSON 函式
- SQL - 轉換函式
- SQL - 資料型別函式
- SQL 有用資源
- SQL - 問答
- SQL - 快速指南
- SQL - 有用函式
- SQL - 有用資源
- SQL - 討論
SQL - GROUP BY 子句
SQL GROUP BY 子句
SQL 的GROUP BY 子句與 SELECT 語句一起使用,用於將相同的資料排列成組。此子句位於 SELECT 語句中的 WHERE 子句之後,並在 ORDER BY 和 HAVING 子句(如果存在)之前。
根據特定列對錶中的記錄進行分組的主要目的是對這些組執行計算。因此,GROUP BY 子句通常與聚合函式一起使用,例如 SUM()、COUNT()、AVG()、MAX() 或 MIN() 等。
例如,如果您有一個名為 SALES_DATA 的表,其中包含帶有 YEAR、PRODUCT 和 SALES 列的銷售資料。要計算一年中的總銷售額,可以使用 GROUP BY 子句根據年份對該表中的記錄進行分組,並使用 SUM() 函式計算每個組中的銷售額總和。
語法
以下是 SQL GROUP BY 子句的基本語法:
SELECT column_name(s) FROM table_name GROUP BY column_name(s);
其中,column_name(s) 指的是表中我們要根據其對資料進行分組的一個或多個列的名稱,而 table_name 指的是我們要從中檢索資料的表的名稱。
帶有聚合函式的 GROUP BY 子句
通常,我們對錶的記錄進行分組以對其執行計算。因此,SQL GROUP BY 子句通常與聚合函式一起使用,例如 SUM()、AVG()、MIN()、MAX()、COUNT() 等。
示例
假設我們建立了一個名為 CUSTOMERS 的表,其中包含客戶的個人詳細資訊,包括他們的姓名、年齡、地址和工資,使用以下查詢:
CREATE TABLE CUSTOMERS ( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25), SALARY DECIMAL (18, 2), PRIMARY KEY (ID) );
現在使用 INSERT 語句將值插入此表,如下所示:
INSERT INTO CUSTOMERS VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00), (2, 'Khilan', 25, 'Delhi', 1500.00), (3, 'Kaushik', 23, 'Kota', 2000.00), (4, 'Chaitali', 25, 'Mumbai', 6500.00), (5, 'Hardik', 27, 'Bhopal', 8500.00), (6, 'Komal', 22, 'Hyderabad', 4500.00), (7, 'Muffy', 24, 'Indore', 10000.00);
建立的表如下所示:
ID | 姓名 | 年齡 | 地址 | 工資 |
---|---|---|---|---|
1 | Ramesh | 32 | 艾哈邁達巴德 | 2000.00 |
2 | Khilan | 25 | 德里 | 1500.00 |
3 | Kaushik | 23 | 科塔 | 2000.00 |
4 | Chaitali | 25 | 孟買 | 6500.00 |
5 | Hardik | 27 | 博帕爾 | 8500.00 |
6 | Komal | 22 | 海得拉巴 | 4500.00 |
7 | Muffy | 24 | 因多爾 | 10000.00 |
以下 SQL 查詢根據 AGE 對 CUSTOMERS 表進行分組,並計算每個組中的記錄數:
SELECT AGE, COUNT(Name) FROM CUSTOMERS GROUP BY AGE;
輸出
以下是產生的結果:
年齡 | COUNT(Name) |
---|---|
32 | 1 |
25 | 2 |
23 | 1 |
27 | 1 |
22 | 1 |
24 | 1 |
示例
在以下查詢中,我們正在查詢每個年齡的最高工資:
SELECT AGE, MAX(salary) AS MAX_SALARY FROM CUSTOMERS GROUP BY AGE;
輸出
以下是上述查詢的輸出:
年齡 | MAX_SALARY |
---|---|
32 | 2000.00 |
25 | 6500.00 |
23 | 2000.00 |
27 | 8500.00 |
22 | 4500.00 |
24 | 10000.00 |
類似地,我們可以根據 AGE 列對 CUSTOMERS 表的記錄進行分組,並分別使用 MIN()、AVG() 和 SUM() 函式計算每個組中的 SALARY 值的最大值、平均值和總和。
單個列上的 GROUP BY 子句
當我們將 GROUP BY 子句與單個列一起使用時,表中在該特定列中具有相同值的全部行將合併為一條記錄。
示例
在以下示例中,我們根據 ADDRESS 列對上面建立的 CUSTOMERS 表進行分組,並計算每個城市的客戶的平均工資:
SELECT ADDRESS, AVG(SALARY) as AVG_SALARY FROM CUSTOMERS GROUP BY ADDRESS;
輸出
這將產生以下結果:
地址 | AVG_SALARY |
---|---|
艾哈邁達巴德 | 2000.000000 |
德里 | 1500.000000 |
科塔 | 2000.000000 |
孟買 | 6500.000000 |
博帕爾 | 8500.000000 |
海得拉巴 | 4500.000000 |
因多爾 | 10000.000000 |
具有多個列的 GROUP BY 子句
當我們將 GROUP BY 子句與多個列一起使用時,表中在所有指定列中具有相同值的全部行將合併為一個組。
示例
在以下查詢中,我們根據 ADDRESS 和 AGE 列對 CUSTOMERS 表的記錄進行分組,並:
SELECT ADDRESS, AGE, SUM(SALARY) AS TOTAL_SALARY FROM CUSTOMERS GROUP BY ADDRESS, AGE;
輸出
這將產生以下結果:
地址 | 年齡 | TOTAL_SALARY |
---|---|---|
艾哈邁達巴德 | 32 | 2000.00 |
德里 | 25 | 1500.00 |
科塔 | 23 | 2000.00 |
孟買 | 25 | 6500.00 |
博帕爾 | 27 | 8500.00 |
海得拉巴 | 22 | 4500.00 |
因多爾 | 24 | 10000.00 |
GROUP BY 與 ORDER BY 子句
我們可以在 SQL 中將 ORDER BY 子句與 GROUP BY 一起使用,以根據一個或多個列對分組資料進行排序。
語法
以下是 SQL 中使用 ORDER BY 子句與 GROUP BY 子句的語法:
SELECT column1, column2, ..., aggregate_function(columnX) AS alias FROM table GROUP BY column1, column2, ... ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;
示例
在這裡,我們正在查詢每個年齡的最高工資,並按從高到低排序:
SELECT AGE, MIN(SALARY) AS MIN_SALARY FROM CUSTOMERS GROUP BY AGE ORDER BY MIN_SALARY DESC;
輸出
以下是產生的結果:
年齡 | MIN_SALARY |
---|---|
24 | 10000.00 |
27 | 8500.00 |
22 | 4500.00 |
32 | 2000.00 |
23 | 2000.00 |
25 | 1500.00 |
GROUP BY 與 HAVING 子句
我們還可以將 GROUP BY 子句與 HAVING 子句一起使用,根據特定條件篩選表中的分組資料。
語法
以下是 SQL 中使用 ORDER BY 子句與 HAVING 子句的語法:
SELECT column1, column2, aggregate_function(column) FROM table_name GROUP BY column1, column2 HAVING condition;
示例
在以下查詢中,我們根據客戶的年齡對客戶進行分組,並計算每個組的最低工資。使用 HAVING 子句,我們正在篩選年齡大於 24 的組:
SELECT ADDRESS, AGE, MIN(SALARY) AS MIN_SUM FROM CUSTOMERS GROUP BY ADDRESS, AGE HAVING AGE>24;
輸出
產生的結果如下:
地址 | 年齡 | MIN_SUM |
---|---|---|
艾哈邁達巴德 | 32 | 2000.00 |
德里 | 25 | 1500.00 |
孟買 | 25 | 6500.00 |
博帕爾 | 27 | 8500.00 |