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 句と共に使用するのが一般的です。ただし、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'
参照
その他の技術情報
IS [NOT] NULL (Transact-SQL)
演算子 (Transact-SQL)
ISNULL (Transact-SQL)
WHERE (Transact-SQL)