SQL - HAVING 子句



SQL HAVING 子句

SQL 的HAVING 子句類似於 WHERE 子句;兩者都用於根據指定的條件過濾表中的行。但是,HAVING 子句用於過濾分組的行而不是單個行。這些行由 GROUP BY 子句組合在一起,因此 HAVING 子句必須始終在 GROUP BY 子句之後。

此外,HAVING 子句可以與 COUNT()、SUM()、AVG() 等聚合函式一起使用,而 WHERE 子句不能與它們一起使用。

語法

以下是 SQL HAVING 子句的基本語法:

SELECT column1, column2, aggregate_function(column)
FROM table_name
GROUP BY column1, column2
HAVING condition;

以下程式碼塊顯示了 HAVING 子句在查詢中的位置:

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

HAVING 與 GROUP BY 子句

我們可以將 HAVING 子句與 GROUP BY 子句一起使用,以過濾滿足某些條件的行組。它用於在執行聚合後對結果集應用過濾器。

示例

假設我們建立了一個名為 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 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

現在,我們根據 ADDRESS 和 AGE 列對 CUSTOMERS 表的記錄進行分組,並過濾 AGE 值小於 25 的組。

SELECT ADDRESS, AGE, MIN(SALARY) AS MIN_SUM 
FROM CUSTOMERS 
GROUP BY ADDRESS, AGE HAVING AGE > 25;

輸出

產生的結果如下:

地址 年齡 最小總和
Ahmedabad 32 2000.00
Bhopal 27 8500.00

HAVING 與 ORDER BY 子句

ORDER BY 子句用於根據特定列(升序或降序)排列/排序 SELECT 查詢結果的記錄。如果我們將 ORDER BY 子句與 HAVING 子句一起使用,我們可以按所需順序排序過濾後的組。

示例

以下查詢根據 AGE 和 ADDRESS 列對 CUSTOMERS 表的記錄進行分組,過濾 SALARY 值小於 5000 的組,並根據每個組的總薪水以降序排列剩餘的組。

SELECT ADDRESS, AGE, SUM(SALARY) AS TOTAL_SALARY 
FROM CUSTOMERS 
GROUP BY ADDRESS, AGE HAVING TOTAL_SALARY >=5000 
ORDER BY TOTAL_SALARY DESC;

輸出

產生的結果如下:

地址 年齡 總薪水
Indore 24 10000.00
Bhopal 27 8500.00
Mumbai 25 6500.00

HAVING 子句與 COUNT() 函式

HAVING 子句可以與 COUNT() 函式一起使用,以根據組包含的行數過濾組。

示例

以下查詢根據 AGE 列對 CUSTOMERS 表的記錄進行分組,並檢索包含兩個以上實體的組的詳細資訊:

SELECT AGE, COUNT(AGE) 
FROM CUSTOMERS GROUP BY AGE HAVING COUNT(age) > 2;

輸出

這將產生以下結果:

Query OK, 0 rows affected (0.02 sec)

HAVING 子句與 AVG() 函式

HAVING 子句還可以與 AVG() 函式一起使用,以根據指定列的平均值過濾組。

示例

現在,我們檢索平均薪水大於 5240 的客戶的城市:

SELECT ADDRESS, AVG(SALARY) as AVG_SALARY 
FROM CUSTOMERS 
GROUP BY ADDRESS HAVING AVG(SALARY) > 5240;

輸出

以下是上述查詢的輸出:

地址 平均薪水
Mumbai 6500.000000
Bhopal 8500.000000
Indore 10000.000000

HAVING 子句與 MAX() 函式

我們還可以將 HAVING 子句與 MAX() 函式一起使用,以根據指定列的最大值過濾組。

示例

現在,我們檢索最大薪水大於 5240 的客戶的城市:

SELECT ADDRESS, MAX(SALARY) as MAX_SALARY 
FROM CUSTOMERS 
GROUP BY ADDRESS HAVING MAX(SALARY) > 5240;

輸出

獲得的結果如下:

地址 最大薪水
Mumbai 6500.00
Bhopal 8500.00
Indore 10000.00
廣告