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