SQL HAVING子句 HAVING子句被添加到SQL中,因為WHERE關鍵字不能與聚合函數一起使用。 HAVING語法 SELECT column_name(s) FROM table_name WHERE condition GROUP BY column_name(s) HAVING con ...
SQL HAVING子句
HAVING
子句被添加到SQL中,因為WHERE
關鍵字不能與聚合函數一起使用。
HAVING語法
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);
演示資料庫
以下是Northwind示例資料庫中“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語句列出了每個國家的客戶數量。只包括擁有超過5名客戶的國家:
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5;
以下SQL語句列出了每個國家的客戶數量,按高到低排序(只包括擁有超過5名客戶的國家):
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5
ORDER BY COUNT(CustomerID) DESC;
演示資料庫
以下是Northwind示例資料庫中“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個訂單的員工:
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個訂單:
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 運算符
EXISTS
運算符用於測試子查詢中是否存在任何記錄。如果子查詢返回一個或多個記錄,EXISTS
運算符將返回 TRUE
。
EXISTS 語法
SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);
演示資料庫
以下是 Northwind 示例資料庫中 "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
併列出產品價格低於 20 的供應商:
SELECT SupplierName
FROM Suppliers
WHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID = Suppliers.SupplierID AND Price < 20);
以下 SQL 語句返回 TRUE
併列出產品價格等於 22 的供應商:
SELECT SupplierName
FROM Suppliers
WHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID = Suppliers.SupplierID AND Price = 22);
SQL ANY 和 ALL 運算符
ANY
和 ALL
運算符允許您在單個列值和一系列其他值之間進行比較。
SQL ANY 運算符
ANY
運算符返回布爾值作為結果,如果子查詢值中的任何一個滿足條件,則返回 TRUE
。ANY
意味著如果對範圍內的任何值進行操作為真,則條件將為真。
ANY 語法
SELECT column_name(s)
FROM table_name
WHERE column_name operator ANY
(SELECT column_name
FROM table_name
WHERE condition);
註意:operator 必須是標準比較運算符(=、<>、!=、>、>=、< 或 <=)。
SQL ANY 示例
以下 SQL 語句列出瞭如果在 OrderDetails 表中找到任何記錄的話,具有 Quantity 等於 10 的 ProductName(這將返回 TRUE,因為 Quantity 列有一些值為 10):
SELECT ProductName
FROM Products
WHERE ProductID = ANY
(SELECT ProductID
FROM OrderDetails
WHERE Quantity = 10);
以下 SQL 語句列出瞭如果在 OrderDetails 表中找到任何記錄的話,具有 Quantity 大於 99 的 ProductName(這將返回 TRUE,因為 Quantity 列有一些值大於 99):
SELECT ProductName
FROM Products
WHERE ProductID = ANY
(SELECT ProductID
FROM OrderDetails
WHERE Quantity > 99);
以下 SQL 語句列出瞭如果在 OrderDetails 表中找到任何記錄的話,具有 Quantity 大於 1000 的 ProductName(這將返回 FALSE,因為 Quantity 列沒有任何值大於 1000):
SELECT ProductName
FROM Products
WHERE ProductID = ANY
(SELECT ProductID
FROM OrderDetails
WHERE Quantity > 1000);
SQL ALL 運算符
ALL
運算符返回布爾值作為結果,如果子查詢值中的所有值都滿足條件,則返回 TRUE
。ALL
意味著只有當範圍內的所有值都為真時,條件才為真。
使用 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 必須是標準比較運算符(=、<>、!=、>、>=、< 或 <=)。
SQL ALL 示例
以下 SQL 語句列出了所有的產品名稱:
SELECT ALL ProductName
FROM Products
WHERE TRUE;
以下 SQL 語句列出瞭如果在 OrderDetails 表中的所有記錄的話,具有 Quantity 等於 10 的 ProductName。這當然將返回 FALSE,因為 Quantity 列有許多不同的值(不僅僅是值為 10):
SELECT ProductName
FROM Products
WHERE ProductID = ALL
(SELECT ProductID
FROM OrderDetails
WHERE Quantity = 10);
最後
為了方便其他設備和平臺的小伙伴觀看往期文章:公眾號搜索Let us Coding
,或者掃描下方二維碼,關註公眾號,即可獲取最新文章。
看完如果覺得有幫助,歡迎點贊、收藏和關註