述語を使用してデータをフィルター処理する

完了

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