Share via


使用 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';