WHERE と HAVING を使ったフィルタによる行選択
SELECT ステートメントの WHERE 句および HAVING 句では、元のテーブルのどの行を使用して結果セットを作成するかを指定します。WHERE 句と HAVING 句はフィルタです。一連の検索条件を指定すると、検索条件を満たす行のみを使用して結果セットが作成されます。検索条件を満たす行が結果セットで使用されるということになります。たとえば、次の SELECT ステートメントの WHERE 句では、特定の販売区域に該当する行のみが選択されます。
USE AdventureWorks;
GO
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 句と共に使用するのが一般的です。ただし、HAVING 句は GROUP BY 句がなくても指定できます。HAVING 句で指定するフィルタは、WHERE 句のフィルタの後に適用されます。そのフィルタは SELECT リストで使用する集計関数に適用できます。次の例では、単価が $100 を超える製品の受注のみが WHERE 句で選択され、さらにその中で受注数が 100 を超える注文のみが HAVING 句で選択されます。
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 テーブルから顧客の販売員 ID が 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 クラスのどの製品よりも出荷数が多い製品の注文 ID と製品 ID が取得されます。
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'