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 句と共に使用するのが一般的です。ただし、HAVING 句は GROUP BY 句がなくても指定できます。HAVING 句で指定するフィルターは、WHERE 句のフィルターの後に適用されます。そのフィルターは SELECT リストで使用する集計関数に適用できます。次の例では、単価が $100 を超える製品の受注のみが WHERE 句で選択され、さらにその中で受注数が 100 を超える注文のみが HAVING 句で選択されます。

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 テーブルから顧客の販売員 ID が 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 クラスのどの製品よりも出荷数が多い製品の注文 ID と製品 ID が取得されます。

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