
- 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 - INSERT 查詢
- SQL - SELECT 查詢
- SQL - SELECT INTO
- SQL - INSERT INTO SELECT
- SQL - UPDATE 查詢
- SQL - DELETE 查詢
- 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 - CHECK 約束
- SQL - DEFAULT 約束
- 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 - 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 |