SQL HAVING子句在GROUP BY中的條件篩選靈活運(yùn)用
SQL HAVING子句
HAVING子句被添加到SQL中,因?yàn)?code>WHERE關(guān)鍵字不能與聚合函數(shù)一起使用。
HAVING語法
SELECT column_name(s) FROM table_name WHERE condition GROUP BY column_name(s) HAVING condition ORDER BY column_name(s);
演示數(shù)據(jù)庫
以下是Northwind示例數(shù)據(jù)庫中“Customers”表的一部分選擇:
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
| 3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
| 4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
| 5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
SQL HAVING示例
以下SQL語句列出了每個(gè)國家的客戶數(shù)量。只包括擁有超過5名客戶的國家:
SELECT COUNT(CustomerID), Country FROM Customers GROUP BY Country HAVING COUNT(CustomerID) > 5;
以下SQL語句列出了每個(gè)國家的客戶數(shù)量,按高到低排序(只包括擁有超過5名客戶的國家):
SELECT COUNT(CustomerID), Country FROM Customers GROUP BY Country HAVING COUNT(CustomerID) > 5 ORDER BY COUNT(CustomerID) DESC;
演示數(shù)據(jù)庫
以下是Northwind示例數(shù)據(jù)庫中“Orders”表的一部分選擇:
| OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
|---|---|---|---|---|
| 10248 | 90 | 5 | 1996-07-04 | 3 |
| 10249 | 81 | 6 | 1996-07-05 | 1 |
| 10250 | 34 | 4 | 1996-07-08 | 2 |
以及“Employees”表的一部分選擇:
| EmployeeID | LastName | FirstName | BirthDate | Photo | Notes |
|---|---|---|---|---|---|
| 1 | Davolio | Nancy | 1968-12-08 | EmpID1.pic | Education includes a BA.... |
| 2 | Fuller | Andrew | 1952-02-19 | EmpID2.pic | Andrew received his BTS.... |
| 3 | Leverling | Janet | 1963-08-30 | EmpID3.pic | Janet has a BS degree.... |
更多HAVING示例
以下SQL語句列出了注冊超過10個(gè)訂單的員工:
SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders FROM (Orders INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID) GROUP BY LastName HAVING COUNT(Orders.OrderID) > 10;
以下SQL語句列出了是否員工“Davolio”或“Fuller”注冊了超過25個(gè)訂單:
SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID WHERE LastName = 'Davolio' OR LastName = 'Fuller' GROUP BY LastName HAVING COUNT(Orders.OrderID) > 25;
SQL EXISTS 運(yùn)算符
EXISTS 運(yùn)算符用于測試子查詢中是否存在任何記錄。如果子查詢返回一個(gè)或多個(gè)記錄,EXISTS 運(yùn)算符將返回 TRUE。
EXISTS 語法
SELECT column_name(s) FROM table_name WHERE EXISTS (SELECT column_name FROM table_name WHERE condition);
演示數(shù)據(jù)庫
以下是 Northwind 示例數(shù)據(jù)庫中 "Products" 表的一部分選擇:
| ProductID | ProductName | SupplierID | CategoryID | Unit | Price |
|---|---|---|---|---|---|
| 1 | Chais | 1 | 1 | 10 boxes x 20 bags | 18 |
| 2 | Chang | 1 | 1 | 24 - 12 oz bottles | 19 |
| 3 | Aniseed Syrup | 1 | 2 | 12 - 550 ml bottles | 10 |
| 4 | Chef Anton's Cajun Seasoning | 2 | 2 | 48 - 6 oz jars | 22 |
| 5 | Chef Anton's Gumbo Mix | 2 | 2 | 36 boxes | 21.35 |
以及 "Suppliers" 表的一部分選擇:
| SupplierID | SupplierName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Exotic Liquid | Charlotte Cooper | 49 Gilbert St. | London | EC1 4SD | UK |
| 2 | New Orleans Cajun Delights | Shelley Burke | P.O. Box 78934 | New Orleans | 70117 | USA |
| 3 | Grandma Kelly's Homestead | Regina Murphy | 707 Oxford Rd. | Ann Arbor | 48104 | USA |
| 4 | Tokyo Traders | Yoshi Nagase | 9-8 Sekimai Musashino-shi | Tokyo | 100 | Japan |
SQL EXISTS 示例
以下 SQL 語句返回 TRUE 并列出產(chǎn)品價(jià)格低于 20 的供應(yīng)商:
SELECT SupplierName FROM Suppliers WHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID = Suppliers.SupplierID AND Price < 20);
以下 SQL 語句返回 TRUE 并列出產(chǎn)品價(jià)格等于 22 的供應(yīng)商:
SELECT SupplierName FROM Suppliers WHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID = Suppliers.SupplierID AND Price = 22);
SQL ANY 和 ALL 運(yùn)算符
ANY 和 ALL 運(yùn)算符允許您在單個(gè)列值和一系列其他值之間進(jìn)行比較。
SQL ANY 運(yùn)算符
ANY 運(yùn)算符返回布爾值作為結(jié)果,如果子查詢值中的任何一個(gè)滿足條件,則返回 TRUE。ANY 意味著如果對(duì)范圍內(nèi)的任何值進(jìn)行操作為真,則條件將為真。
ANY 語法
SELECT column_name(s) FROM table_name WHERE column_name operator ANY (SELECT column_name FROM table_name WHERE condition);
注意:operator 必須是標(biāo)準(zhǔn)比較運(yùn)算符(=、<>、!=、>、>=、< 或 <=)。
SQL ANY 示例
以下 SQL 語句列出了如果在 OrderDetails 表中找到任何記錄的話,具有 Quantity 等于 10 的 ProductName(這將返回 TRUE,因?yàn)?Quantity 列有一些值為 10):
SELECT ProductName FROM Products WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity = 10);
以下 SQL 語句列出了如果在 OrderDetails 表中找到任何記錄的話,具有 Quantity 大于 99 的 ProductName(這將返回 TRUE,因?yàn)?Quantity 列有一些值大于 99):
SELECT ProductName FROM Products WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity > 99);
以下 SQL 語句列出了如果在 OrderDetails 表中找到任何記錄的話,具有 Quantity 大于 1000 的 ProductName(這將返回 FALSE,因?yàn)?Quantity 列沒有任何值大于 1000):
SELECT ProductName FROM Products WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity > 1000);
SQL ALL 運(yùn)算符
ALL 運(yùn)算符返回布爾值作為結(jié)果,如果子查詢值中的所有值都滿足條件,則返回 TRUE。ALL 意味著只有當(dāng)范圍內(nèi)的所有值都為真時(shí),條件才為真。
使用 SELECT 的 ALL 語法
SELECT ALL column_name(s) FROM table_name WHERE condition;
使用 WHERE 或 HAVING 的 ALL 語法
SELECT column_name(s) FROM table_name WHERE column_name operator ALL (SELECT column_name FROM table_name WHERE condition);
注意:operator 必須是標(biāo)準(zhǔn)比較運(yùn)算符(=、<>、!=、>、>=、< 或 <=)。
SQL ALL 示例
以下 SQL 語句列出了所有的產(chǎn)品名稱:
SELECT ALL ProductName FROM Products WHERE TRUE;
以下 SQL 語句列出了如果在 OrderDetails 表中的所有記錄的話,具有 Quantity 等于 10 的 ProductName。這當(dāng)然將返回 FALSE,因?yàn)?Quantity 列有許多不同的值(不僅僅是值為 10):
SELECT ProductName FROM Products WHERE ProductID = ALL (SELECT ProductID FROM OrderDetails WHERE Quantity = 10);
以上就是SQL HAVING子句在GROUP BY中的條件篩選靈活運(yùn)用的詳細(xì)內(nèi)容,更多關(guān)于SQL HAVING條件篩選GROUP BY的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
一文深入理解MySQL中的UTF-8與UTF-8MB4字符集
在全球化的今天,數(shù)據(jù)的存儲(chǔ)與處理需要支持多種語言與字符集,對(duì)于 Web 應(yīng)用程序和數(shù)據(jù)庫系統(tǒng)來說,字符集的選擇尤為重要,特別是在處理包含多種語言字符(如中文、阿拉伯文、表情符號(hào)等)的系統(tǒng)中,本文將深入探討 MySQL 中的兩個(gè)常見字符集:UTF-8 和 UTF-8MB42024-11-11
mysql中的general_log(查詢?nèi)罩?開啟和關(guān)閉
這篇文章主要介紹了mysql中的general_log(查詢?nèi)罩?開啟和關(guān)閉問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Mysql創(chuàng)建通用設(shè)備管理信息系統(tǒng)數(shù)據(jù)庫
下面通過圖文并茂的方式給大家介紹通用設(shè)備管理信息系統(tǒng)數(shù)據(jù)庫的創(chuàng)建過程,感興趣的朋友一起學(xué)習(xí)2016-04-04
MySQL存儲(chǔ)數(shù)據(jù)亂碼的問題解析
這篇文章主要介紹了MySQL存儲(chǔ)數(shù)據(jù)亂碼的問題解析,作者從實(shí)際使用中的多個(gè)方面定位其原因然后解決,需要的朋友可以參考下2015-05-05
PostgreSQL與MySQL的完整對(duì)比教程(含遷移步驟)
MySQL和PostgreSQL都是強(qiáng)大的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),但它們適用于不同的用例和需求,這篇文章主要介紹了PostgreSQL與MySQL完整對(duì)比的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2026-05-05
mysql如何查詢兩個(gè)日期之間最大的連續(xù)登錄天數(shù)
在現(xiàn)在的很多網(wǎng)站中都有這樣一個(gè)功能。記錄用戶的連續(xù)登陸天數(shù),所謂的連續(xù)在線是指相鄰兩天都登錄過,不一定一直在線,但是只要有過登錄即可。這篇文章主要介紹的是利用sql語句如何查詢在兩個(gè)日期之間最大的連續(xù)登錄天數(shù),有需要的朋友們下面來一起看看吧。2016-10-10
ubuntu 15.04下mysql開放遠(yuǎn)程3306端口
這篇文章主要為大家詳細(xì)介紹了ubuntu 15.04開放mysql遠(yuǎn)程3306端口的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01

