WHERE 句でよく使う比較・論理演算子

WHERE 句でよく使う演算子を知っておこう

前回は「テーブルから検索条件を指定してレコードを取得する」で、検索条件を指定して、その条件にあったレコードのみを取得しました。

ここでは、WHERE 句で検索条件を指定するのによく使う、演算子を確認しておきましょう。

WHERE 句でよく使う比較演算子

SELECT 文の WHERE 句では、評価した結果が True・False・Unknown になるようなブール式を指定し、結果が True の時のみ行が返ります。

数値や文字列を比較するのに WHERE 句でよく使われる比較演算子には、以下のものがあります。

  • A = B(A と B が等しい)
  • A <> B(A と B が等しくない。T-SQL では != も使えますが <> のほうが標準です。)
  • A > B(A より B が小さい)
  • A < B(A より B が大きい)
  • A >= B(A が B 以上)
  • A <= B(A が B 以下)

A または B が NULL の時は評価の結果が Unknown になり、False と同じく行が返りません。

NULL になる可能性がある値を比較する時は、気をつけてくださいね。


WHERE 句でよく使う論理演算子

続いて、WHERE 句で良く使われる論理演算子をご紹介します。

一番よく使われる論理演算子は ANDOR で、複数の式を合わせて評価する時に使います。

AND は左右のブール式が True の時に True を返し、OR は片方の式が True の時に True を返します。


SQL Server には、他にも次のような、よく使う論理演算子があります。

[A] BETWEEN [B] AND [C]

BETWEEN は [A] が [B] <= [A] <= [C] であった時に True を返す論理演算子です。

[B] か [C] かのどちらかが NULL の時は評価の結果が Unknown となり、片方の条件と合っていても、行を取得することができません。

例えば、ValidDateFrom: 2017-01-01 で ValidDateTo: NULL というレコードがあるとします。

終了日がなしという意味の NULL であっても、例えば WHERE '2020-01-01' BETWEEN ValidDateFrom AND ValidDateTo のように条件を指定した場合、このレコードはひっかかってきません。

NULL が入りそうな場合は、ISNULL などを使って NULL を値に置き換えるか、BETWEEN の変わりに比較演算子の <=, >= を使うなど、気をつけましょう。


[A] LIKE [パターン]

LIKE は [A] がパターンにマッチする時に True を返す論理演算子です。

パターンに良く使われるのは、ワイルドカードの % です。 例えば LastName に 「 yama 」 が含まれているお客さんのレコードを取得したい場合は以下のように指定することができます。。

SELECT  *
FROM    Customers
WHERE   LastName LIKE '%yama%';

他にも一文字用のワイルドカードや、レンジでパターンマッチングさせる方法もあります。

[A] IN ([B], [C], ..)

IN は [A] がカッコ内の要素のいずれかに等しければ True を返す論理演算子です。

[A] IN (SELECT [カラム名] FROM [テーブル名]) のように、他のテーブルのカラムに値が存在しているかチェックすることもできます。

例えば、過去、注文をしたことがあるお客さんを調べる為に Orders テーブルに CustomerID が存在している Customers のレコードを取得したい時は以下のように指定することができます。

SELECT  *
FROM    Customers
WHERE   CustomerID IN (SELECT CustomerID FROM Orders);

EXISTS (サブクエリー)

EXISTS は、続くサブクエリが行を含む場合に True を返す論理演算子です。

例えば、先ほど IN で取得しようとしたのと同等のデータを以下のように取得することができます。

SELECT  *
FROM    Customers AS C
WHERE   EXISTS
        (SELECT *
         FROM   Orders AS O
         WHERE  O.CustomerID = C.CustomerID);

IN では、ひとつのカラムでしか条件を指定できませんが、EXISTS を使うと複数のカラムが合致する行を取得することができます。

例えば、先ほどの条件に 「 注文したお店の市とお客さんの住所の市が同じ 」 という条件も追加したい場合は以下のようになります。

SELECT  *
FROM    Customers AS C
WHERE   EXISTS
        (SELECT *
         FROM   Orders AS O
         WHERE  O.CustomerID = C.CustomerID
            	AND O.StoreCity = C.AddressCity);

このように、複数の条件を指定したい時は AND を使います。 どちらかの条件に合う行を取得したい場合は OR を使います。

また、これらの BETWEEN, IN, EXISTS, LIKE は、NOT BETWEEN, NOT IN, NOT EXISTS, NOT LIKE のように NOT を前につけることで、そうでないレコードを抽出することができます。


次は、クエリーの結果を並べ替えてみましょう。

© 2010-2024 SQL Server 入門