SQL - GROUP BY 與 ORDER BY



在 SQL 中,我們有兩個常用的子句可以幫助我們操作資料:GROUP BY 子句和 ORDER BY 子句。

GROUP BY 子句用於將相同的資料/記錄排列成組,而 ORDER BY 子句用於按升序或降序對資料進行排序。

SQL GROUP BY 子句

使用GROUP BY 子句,我們可以將表中的資料組織成組(基於某一列),並在其上執行所需的計算。

此子句通常與聚合函式一起使用,例如 MIN()、MAX()、SUM()、AVG() 和 COUNT() 等。

它通常與 SELECT 語句一起使用,並位於 WHERE 子句之後或 HAVING 子句之前。如果我們使用 ORDER BY 子句,則 GROUP BY 子句應該放在 ORDER BY 子句之前。

語法

以下是 SQL GROUP BY 子句的語法:

SELECT column_name, aggregate_function() FROM table_name
WHERE condition GROUP BY column_name;

上述語法中的aggregate_function()WHERE子句是可選的。

示例

假設我們已經建立了一個名為CUSTOMERS的表,其中包含客戶的記錄,例如 NAME、AGE、ADDRESS 和 SALARY 等,使用以下 CREATE 語句:

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

CUSTOMERS 表將建立為:

ID 姓名 (NAME) 年齡 (AGE) 地址 (ADDRESS) 薪水 (SALARY)
1 Ramesh 32 32 2000.00
2 Ahmedabad 25 20000 1500.00
3 Khilan 23 25 2000.00
4 Delhi 25 15000 6500.00
5 Kaushik 27 23 8500.00
6 Kota 22 20000 4500.00
7 Chaitali 24 28 10000.00

在下面的 SQL 查詢中,我們使用 Group by 子句根據 CUSTOMERS 表中的薪水對行進行分組,並計算每個組中的記錄數:

SELECT SALARY, COUNT(SALARY) from CUSTOMERS GROUP BY SALARY;

輸出

當我們執行上述查詢時,將顯示以下結果:

薪水 (SALARY) 最大薪水 (MAX(SALARY))
2000.00 2
1500.00 1
6500.00 1
8500.00 1
4500.00 1
10000.00 1

SQL ORDER BY 子句

ORDER BY 子句用於對查詢結果進行排序。此子句用於 SELECT 語句的末尾,位於 WHERE、HAVING 和 GROUP BY 子句之後。我們可以透過指定排序順序為 ASC 和 DESC 分別按升序或降序對錶列進行排序。如果我們沒有指定任何順序,則預設為升序。

語法

以下是使用 SQL ORDER BY 子句按升序/降序對列值進行排序的語法:

SELECT column_name FROM table_name ORDER BY ASC/DSC;

示例

在下面的查詢中,我們從 CUSTOMERS 表中檢索 ID 和 NAME,並使用 ORDER BY 子句按升序對名稱進行排序。

SELECT ID, NAME FROM CUSTOMERS ORDER BY NAME;

輸出

當我們執行上述查詢時,我們可以看到結果表按名稱升序排序。

ID 姓名 (NAME)
4 Delhi
5 Kaushik
3 Khilan
2 Ahmedabad
6 Kota
7 Chaitali
1 Ramesh

示例

在下面的示例中,我們檢索 NAME,計算 AVG SALARY,並使用 GROUP BY 子句按 NAME 對錶進行分組。

SELECT NAME, AVG(SALARY) FROM CUSTOMERS GROUP BY NAME;

輸出

當我們執行上述查詢時,我們將獲得姓名和平均薪水。平均薪水與實際薪水相同,因為沒有兩個或兩個以上的記錄具有相同的姓名。因此,平均薪水與實際薪水相同,並且表按名稱分組,如下表所示。

姓名 (NAME) 平均薪水 (AVG(SALARY))
Ramesh 2000.000000
Ahmedabad 1500.000000
Khilan 2000.000000
Delhi 6500.000000
Kaushik 8500.000000
Kota 4500.000000
Chaitali 10000.000000

示例

在下面的示例中,我們檢索 NAME、AGE 和 SALARY,並使用 ORDER BY 子句按 AGE 升序排序。

SELECT NAME, AGE, SALARY FROM customers ORDER BY AGE;

輸出

上述查詢生成的表如下所示:

姓名 (NAME) 年齡 (AGE) 薪水 (SALARY)
Kota 22 4500.00
Khilan 23 2000.00
Chaitali 24 10000.00
Ahmedabad 25 1500.00
Delhi 25 6500.00
Kaushik 27 8500.00
Ramesh 32 2000.00

GROUP BY vs ORDER BY

下表總結了 GROUP BY 子句和 ORDER BY 子句之間的區別:

序號 (S.No.) GROUP BY ORDER BY
1

它用於對具有相同值的行的分組。

它按升序或降序對列進行排序。

2

它可以在 create view 語句中使用。

它不允許在 create view 語句中使用。

3

在 GROUP BY 語句中,屬性不能分配給聚合函式。

在 ORDER BY 語句中,屬性可以分配給聚合函式。

4

在 select 語句中,它始終位於 ORDER BY 子句之前。

在 select 語句中,它始終位於 GROUP BY 子句之後。

5

此處基於行屬性值之間的相似性進行分組。

此處,結果集按列屬性值(升序或降序)排序。

6

它控制行的顯示。

它控制列的顯示。

7

我們可以在 GROUP BY 中使用聚合函式。

在 ORDER BY 中,不需要使用聚合函式。

廣告