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
廣告