使用 WHERE 和 HAVING 篩選資料列
SELECT 陳述式中的 WHERE 與 HAVING 子句控制了用來建立結果集之來源資料表的資料列。WHERE 與 HAVING 都是篩選。它們指定了一系列的搜尋條件,並且只有符合搜尋條件規定的資料列才能用來建立結果集。符合搜尋條件的資料列會被認為有資格參與結果集。例如,下列 SELECT 陳述式中的 WHERE 子句只會將特定銷售領域的資料列視為符合資格。
USE AdventureWorks2008R2;
GO
SELECT c.CustomerID, s.Name
FROM AdventureWorks2008R2.Sales.Customer c
JOIN AdventureWorks2008R2.Sales.Store s
ON s.BusinessEntityID = c.CustomerID
WHERE c.TerritoryID = 1;
HAVING 子句通常會與 GROUP BY 子句一起使用,以篩選彙總值的結果。不過,即使沒有 GROUP BY,也可以指定 HAVING。HAVING 子句指定在 WHERE 子句篩選之後套用的其他篩選。這些篩選可以套用到選取清單中使用的彙總函式。在下列範例中,WHERE 子句只會將銷售單價超過 $100 的產品訂單視為符合資格,而 HAVING 子句會更進一步地將結果限制在包含 100 個單位以上的訂單。
USE AdventureWorks2008R2;
GO
SELECT OrdD1.SalesOrderID AS OrderID,
SUM(OrdD1.OrderQty) AS "Units Sold",
SUM(OrdD1.UnitPrice * OrdD1.OrderQty) AS Revenue
FROM Sales.SalesOrderDetail AS OrdD1
WHERE OrdD1.SalesOrderID in (SELECT OrdD2.SalesOrderID
FROM Sales.SalesOrderDetail AS OrdD2
WHERE OrdD2.UnitPrice > $100)
GROUP BY OrdD1.SalesOrderID
HAVING SUM(OrdD1.OrderQty) > 100;
WHERE 和 HAVING 子句中的搜尋條件
在 WHERE 和 HAVING 子句中的搜尋條件,也就是識別資格,可包含下列各項:
比較運算子,例如 =、< >、< 和 >
例如,下列查詢可從 Product 資料表中擷取產品屬於 H 類別的資料列:
SELECT ProductID, Name FROM AdventureWorks2008R2.Production.Product WHERE Class = 'H' ORDER BY ProductID;
範圍 (BETWEEN 和 NOT BETWEEN)
例如,下列查詢會從 Product 資料表中擷取定價為 $100 到 $500 的資料列。
SELECT ProductID, Name FROM AdventureWorks2008R2.Production.Product WHERE ListPrice BETWEEN 100 and 500 ORDER BY ListPrice;
清單 (IN、NOT IN)
例如,下列查詢會擷取以色彩清單排列的產品。
SELECT ProductID, Name FROM AdventureWorks2008R2.Production.Product WHERE Color IN ('Multi', 'Silver') ORDER BY ProductID;
模式比對 (LIKE 和 NOT LIKE)
例如,下列查詢可從 Product 資料表中擷取產品名稱以 Ch 字母開頭的資料列。
SELECT ProductID, Name FROM AdventureWorks2008R2.Production.Product WHERE Name LIKE 'Ch%' ORDER BY ProductID;
[!附註]
可用於 text 資料行的唯一 WHERE 條件是傳回另一個資料類型的函數,例如 PATINDEX(),或是運算子,例如 IS NULL、IS NOT NULL、LIKE 和 NOT LIKE。
Null 值 (IS NULL 和 IS NOT NULL)
例如,下列查詢可從 Customer 資料表中擷取客戶之銷售員識別碼不是 NULL 的資料列。
SELECT s.Name FROM AdventureWorks2008R2.Sales.Customer c JOIN AdventureWorks2008R2.Sales.Store s ON c.CustomerID = S.CustomerID WHERE c.CustomerID IS NOT NULL ORDER BY s.Name;
[!附註]
在比較 Null 值時要特別小心。例如,指定 = NULL 和指定 IS NULL 並不一樣。如需詳細資訊,請參閱<Null 值>。
所有記錄 (=ALL、>ALL、<= ALL、ANY)
例如,下列查詢可從 SalesOrderDetail 資料表中擷取運送之產品數量大於 H 類別中任何產品運送數量的訂單與產品識別碼。
USE AdventureWorks2008R2; GO SELECT OrdD1.SalesOrderID, OrdD1.ProductID FROM Sales.SalesOrderDetail OrdD1 WHERE OrdD1.OrderQty > ALL (SELECT OrdD2.OrderQty FROM Sales.SalesOrderDetail OrdD2 JOIN Production.Product Prd ON OrdD2.ProductID = Prd.ProductID WHERE Prd.Class = 'H'); GO
這些條件的組合 (AND、OR、NOT)
例如,下列查詢會擷取定價低於 $500,或是產品類別為 L 而產品線為 S 的所有產品。
SELECT ProductID, Name FROM AdventureWorks2008R2.Production.Product WHERE ListPrice < 500 OR (Class = 'L' AND ProductLine = 'S');
請注意,當您在 WHERE 子句中搜尋 Unicode 字串時,請將 N 字元放在搜尋字串之前:
SELECT BusinessEntityID FROM AdventureWorks2008R2.Sales.Store WHERE Name = N'Riders Company';