述語を使用してデータをフィルター処理する
SELECT 句と FROM 句だけの最もシンプルな SELECT ステートメントでは、テーブル内のすべての行が評価されます。 WHERE 句を使用することにより、処理される行を決定する条件を定義します。さらに、結果セットを減らせる可能性もあります。
WHERE 句の構造
WHERE 句は 1 つ以上の検索条件で構成され、そのそれぞれがテーブルの各行について TRUE、FALSE、または 'unknown' と評価される必要があります。 WHERE 句が TRUE と評価された場合にのみ、行が返されます。 個々の条件はデータのフィルターとして機能し、"述語" と呼ばれます。 各述語にはテストされる条件が含まれ、通常は基本的な比較演算子が使用されます。
- = (等しい)
- <> (等しくない)
- > (より大きい)
- >= (以上)
- < (より小さい)
- <= (以下)
たとえば、次のクエリを実行すると、ProductCategoryID の値が 2 であるすべての製品が返されます。
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2;
同様に、次のクエリでは ListPrice が 10.00 未満のすべての製品が返されます。
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice < 10.00;
IS NULL / IS NOT NULL
IS NULL または IS NOT NULL を使用して、'unknown' 値や NULL 値を許可または除外するようにフィルター処理することも簡単にできます。
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductName IS NOT NULL;
複数の条件
AND と OR 演算子、およびかっこを使用して、複数の述語を組み合わせることができます。 ただし、SQL Server で一度に処理されるのは 2 つの条件のみです。 AND 演算子を使用して複数の条件を接続する場合は、すべての条件が TRUE である必要があります。 OR 演算子を使用して 2 つの条件を接続する場合、一方か両方が結果セットに対して TRUE であれば十分です。
たとえば、次のクエリでは、カテゴリ 2 に含まれる価格が 10.00 未満の製品が返されます。
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
AND ListPrice < 10.00;
かっこが使用されていない限り、AND 演算子は OR 演算子よりも先に処理されます。 ベスト プラクティスとして、3 つ以上の述語を使用する場合はかっこを使用します。 次のクエリは、カテゴリ 2 または 3 で、かつコストが 10.00 未満の製品を返します。
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE (ProductCategoryID = 2 OR ProductCategoryID = 3)
AND (ListPrice < 10.00);
比較演算子
Transact-SQL には、WHERE 句を簡略化するのに役立つ比較演算子が含まれます。
IN
IN 演算子は、OR で連結されている同じ列に対する複数の等値条件用のショートカットです。 次の例のように、クエリで複数の OR 条件を使用しても何も問題はありません。
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
OR ProductCategoryID = 3
OR ProductCategoryID = 4;
ただし、IN を使うと明瞭かつ簡潔で、クエリのパフォーマンスに影響しません。
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID IN (2, 3, 4);
BETWEEN
BETWEEN は、AND 演算子で 2 つの条件を使用する代わりに、値の上限と下限をフィルター処理するときに使用できるもう 1 つのショートカットです。 次の 2 つのクエリは等価です。
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice >= 1.00
AND ListPrice <= 10.00;
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice BETWEEN 1.00 AND 10.00;
BETWEEN 演算子では、包括的境界値が使用されます。 価格が 1.00 または 10.00 の製品は、結果に含まれます。 BETWEEN は、日付フィールドに対してクエリを実行する場合にも役立ちます。 たとえば、次のクエリには、2012 年 1 月 1 日から 2012 年 12 月 31 日までの間に変更されたすべての製品名が含まれます。
SELECT ProductName, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01' AND '2012-12-31';
ProductName
ModifiedDate
Mountain Bike Socks, M
2012-01-01 00:00:00.000
HL Mountain Frame - Silver, 42
2012-03-05 00:00:00.000
HL Mountain Frame - Silver, 38
2012-08-29 00:00:00.000
Mountain-100 Silver, 38
2012-12-31 00:00:00.000
ただし、時間の範囲を指定していないため、2012-12-31 00:00:00.000 以降の結果は返されません。 日付と時刻を正確に含めるには、述語に時刻を含める必要があります。
SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01 00:00:00.000' AND '2012-12-31 23:59:59.999';
"より大きい" (>) や "等しい" (=) などの基本的な比較演算子も、日付でフィルター処理するだけの場合は正確です。
SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate >= '2012-01-01'
AND ModifiedDate < '2013-01-01';
LIKE
最後の比較演算子は文字データに対してのみ使用でき、ワイルドカード文字と正規表現パターンを使用できます。 ワイルドカードを使用すると、部分文字列を指定できます。 たとえば、次のクエリを使用して、名前に "mountain" という単語が含まれるすべての製品を返すことができます。
SELECT Name, ListPrice
FROM SalesLT.Product
WHERE Name LIKE '%mountain%';
% ワイルドカードは、0 個以上の文字からなる文字列を表します。そのため、結果には、次のように "mountain" という単語が名前のどこかに含まれる製品が含まれます。
名前
ListPrice
Mountain Bike Socks, M
9.50
Mountain Bike Socks, L
9.50
HL Mountain Frame - Silver, 42
1364.0
HL Mountain Frame - Black, 42
1349.60
HL Mountain Frame - Silver, 38
1364.50
Mountain-100 Silver, 38
3399.99
_ (アンダースコア) ワイルドカードを使用すると、次のように、単一の文字を表すことができます。
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain Bike Socks, _';
次の結果には、"Mountain Bike Socks, " で始まり、その後に 1 文字が続く製品のみが含まれます。
ProductName
ListPrice
Mountain Bike Socks, M
9.50
Mountain Bike Socks, L
9.50
検索したい文字列に対して、複雑なパターンを定義することもできます。 たとえば、次のクエリでは、名前が "Mountain-" で始まり、その後に次のものが続く製品が検索されました。
- 0 から 9 の間の 3 文字
- 1 つのスペース
- 任意の文字列
- 1 つのコンマ
- 1 つのスペース
- 0 から 9 の間の 2 文字
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';
このクエリの結果は次のようになります。
ProductName
ListPrice
Mountain-100 Silver, 38
3399.99
Mountain-100 Silver, 42
3399.99
Mountain-100 Black, 38
3399.99
Mountain-100 Black, 42
3399.99
Mountain-200 Silver, 38
2319.99
Mountain-200 Silver, 42
2319.99
Mountain-200 Black, 38
2319.99
Mountain-200 Black, 42
2319.99