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 句で良く使われる論理演算子をご紹介します。
一番よく使われる論理演算子は AND と OR で、複数の式を合わせて評価する時に使います。
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 を前につけることで、そうでないレコードを抽出することができます。
次は、クエリーの結果を並べ替えてみましょう。