テーブルやビューからデータを取得する際にWHERE句で使える演算子 [SQLServer]

SQL WHERE句で使用できる演算子

SQLでデータベースのテーブルやビューからデータを取得する際は、SELECTステートメントを使用します。

テーブルやビューなどからデータを取得(選択)する SELECT FROM [SQLServer]
SQLでデータベースのテーブルやビューなどからデータ(行)を取得する際には、SELECTステートメントを使用します。 本記事で...

取得するデータを条件を指定して絞り込みたい場合はWHERE句を使用します。

テーブルやビューから取得するデータの条件を指定する WHERE [SQLServer]
前回の記事では、データベースのテーブルからデータを取得する際に使用するSELECTステートメントを紹介しました。 SE...

WHERE句では、比較演算子や論理演算子を使用して条件式を記述することができます。

今回は、WHERE句で使用できる様々な演算子について紹介します。

記事内で使用するテーブル

本記事では、SQLの記述例に以下のテーブルを使用します。
使用するテーブルは「顧客」「注文」「優待顧客」の3つになります。

テーブル定義

顧客テーブル

列名 データ型 NULLを許容 主キー
顧客ID int no ○
顧客名 nvarchar(50) no
契約日 date no
電話番号 varchar(20) no

注文テーブル

列名 データ型 NULLを許容 主キー
注文ID int no ○
注文日 date no
顧客ID int no
商品 nvarchar(50) no
金額 decimal(18, 0) no

優待顧客テーブル

列名 データ型 NULLを許容 主キー
顧客ID int no ○

テーブルのCREATE文(SQL)

顧客テーブル

注文テーブル

優待顧客テーブル

テーブルのINSERT文(SQL)

顧客テーブル

注文テーブル

優待顧客テーブル

WHERE句で使用できる演算子

SELECTステートメントのWHERE句では、等号や不等号などの比較演算子や、ANDやORなどの論理演算子を使用することで、複雑な条件式を記述することができます。

WHERE句では、演算子を使用した条件式を評価した結果がTrue(真)になる場合に結果(行)を取得することができます。

WHERE句で使用する比較演算子

WHERE句で使用できる比較演算子には、以下のものがあります。

  • A = B(左辺Aと右辺Bが等しい)
  • A <> B(左辺Aと右辺Bが等しくない)
  • A != B(<>と同じく左辺Aと右辺Bが等しくない)
  • A < B(左辺Aが右辺Bより小さい)
  • A > B(左辺Aが右辺Bより大きい)
  • A <= B(左辺Aが右辺B以下)
  • A >= B(左辺Aが右辺B以上)

以下に「顧客」テーブルと「注文」テーブルのデータを取得するSQLの例をいくつか示します。

例1 「顧客」テーブルの「性別」が「男性」のデータを取得

【実行結果】

顧客ID 氏名 性別 契約日 電話番号
2 中村 一郎 男性 2009-05-19 000-000-0001
3 佐藤 太郎 男性 2009-11-04 000-000-0002
5 西田 次郎 男性 2010-07-11 000-000-0004
7 ピエール 梅原 男性 2012-10-29 000-000-0006

例2 「顧客」テーブルの「契約日」の年が「2010」年のデータを取得

【実行結果】

顧客ID 氏名 性別 契約日 電話番号
4 上野 京子 女性 2010-03-20 000-000-0003
5 西田 次郎 男性 2010-07-11 000-000-0004

例3 「注文」テーブルの「金額」が「5000」円より小さいデータを取得

【実行結果】

注文ID 注文日 顧客ID 商品 金額
1 2015-12-25 2 Tシャツ 1000
2 2016-05-19 5 カッターシャツ 2000
3 2017-11-04 6 ブラウス 3000
4 2018-03-20 1 トレーナー 4000

例4 「注文」テーブルの「注文日」が「2020-03-15」以降のデータを取得

【実行結果】

注文ID 注文日 顧客ID 商品 金額
5 2019-07-11 3 セーター 5000
6 2020-02-17 4 スーツ 6000

WHERE句で使用する論理演算子

WHERE句で使用できる論理演算子には、以下のものがあります。

  • AND(論理積)
  • OR(論理和)
  • BETWEEN(範囲内に収まっているかどうか)
  • LIKE(パターンマッチング)
  • IN(入っているかどうか)
  • EXISTS(存在するかどうか)
  • NOT(否定)
  • ANY(いずれかを表す比較演算子の修飾子)
  • SOME(ANYと同じくいずれかを表す比較演算子の修飾子)
  • ALL(すべてを表す比較演算子の修飾子)

AND(論理積)

論理積を表す「AND」演算子は、左辺と右辺がともにTrue(真)の場合にTrue(真)になり、対象となる行を返します。

文法

式 AND 式

例 「注文」テーブルの「注文日」が「2020-01-01」~「2020-12-31」(「2020-01-01」以上、かつ「2020-12-31」以下)のデータを取得

【実行結果】

注文ID 注文日 顧客ID 商品 金額
6 2020-02-17 4 スーツ 6000

OR(論理和)

論理和を表す「OR」演算子は、左辺と右辺のいずれかがTrue(真)の場合にTrue(真)になり、対象となる行を返します。

文法

式 OR 式

例 「注文」テーブルの「注文日」が「2019-03-05」以降、または「2016-07-21」以前のデータを取得

【実行結果】

注文ID 注文日 顧客ID 商品 金額
1 2015-12-25 2 Tシャツ 1000
2 2016-05-19 5 カッターシャツ 2000
5 2019-07-11 3 セーター 5000
6 2020-02-17 4 スーツ 6000

BETWEEN(範囲内に収まっているかどうか)

「BETWEEN」演算子は、指定した範囲内にある行を返します。
「BETWEEN」演算子は「AND」演算子と共に使用します。

文法

式 BETWEEN 式 AND 式

例 「注文」テーブルの「注文日」が「2017-01-01」~「2018-12-31」のデータを取得

【実行結果】

注文ID 注文日 顧客ID 商品 金額
3 2017-11-04 6 ブラウス 3000
4 2018-03-20 1 トレーナー 4000

補足

BETWEEN ~ ANDで指定する条件は、AND演算子を使って以下のように書き換えることが可能です。

 ↓

LIKE(パターンマッチング)

「LIKE」演算子は、ワイルドカード文字を使用したパターンによるマッチング検索を行います。
パターンは、通常の文字とワイルドカード文字を含むことができます。

ワイルドカード文字には、以下のものがあります。

ワイルドカード文字 説明
% 任意の文字列です。
_ (アンダースコア) 任意の 1 文字です。
[] 指定した範囲 ([a-c]) またはセット ([abc]) 内にある任意の1文字です。
[^] 指定した範囲 ([^a-c]) またはセット ([^abc]) 内にない任意の1文字です。

文法

式 LIKE 文字列式
式 LIKE 文字列式 ESCAPE エスケープ文字

例1 「注文」テーブルの「商品」が「シャツ」で終わる(末尾が「シャツ」の)データを取得

【実行結果】

注文ID 注文日 顧客ID 商品 金額
1 2015-12-25 2 Tシャツ 1000
2 2016-05-19 5 カッターシャツ 2000

例2 「顧客」テーブルの「氏名」の先頭が任意の1文字で、2文字目が「田」で、その後が任意の文字列のデータを取得

【実行結果】

顧客ID 氏名 性別 契約日 電話番号
1 山田 花子 女性 2008-12-25 000-000-0000
5 西田 次郎 男性 2010-07-11 000-000-0004

ワイルドカード文字のリテラル表記
LIKE演算子を使用したパターンマッチング検索で、ワイルドカードに使用する文字を通常の文字(リテラル)として指定する場合は、ワイルドカード文字を括弧([])で囲みます。

ワイルドカード文字 リテラル
% [%]
_ (アンダースコア) [_]
[ [[]

[%]と記述することで値に「%」を含むデータ(「100%」や「降水確率30%」など)にマッチングすることができるようになります。

IN(入っているかどうか)

「IN」演算子は、後に続く括弧内のいずれかの値と、INの前に指定した値が一致する場合にTrue(真)になり、対象となる行を返します。

文法

式 IN (式[, 式 …])
式 IN (サブクエリー)

例 「顧客」テーブルの「契約日」の年が「2009」「2010」「2011」のいずれかと一致するデータを取得

【実行結果】

顧客ID 氏名 性別 契約日 電話番号
2 中村 一郎 男性 2009-05-19 000-000-0001
3 佐藤 太郎 男性 2009-11-04 000-000-0002
4 上野 京子 女性 2010-03-20 000-000-0003
5 西田 次郎 男性 2010-07-11 000-000-0004
6 今井 真美 女性 2011-02-17 000-000-0005

EXISTS(存在するかどうか)

「EXISTS」演算子は、後に続くサブクエリーの中で1つ以上の行がある場合にTrue(真)になり、対象となる行を返します。

文法

EXISTS (サブクエリー)

例 「注文」テーブルの「顧客ID」の値が「顧客」テーブルに存在しているデータを取得

【実行結果】

注文ID 注文日 顧客ID 商品 金額
1 2015-12-25 2 Tシャツ 1000
2 2016-05-19 5 カッターシャツ 2000
3 2017-11-04 6 ブラウス 3000
4 2018-03-20 1 トレーナー 4000
5 2019-07-11 3 セーター 5000
6 2020-02-17 4 スーツ 6000

NOT(否定)

「NOT」演算子は、右辺がTrue(真)の場合にFalse(偽)を返します。逆に右辺がFalse(偽)であった場合にはTrue(真)を返します。
「NOT」演算子では、WHERE句で指定した条件を満たさない行が対象になります。

文法

NOT 式

例 「顧客」テーブルの「氏名」が「佐藤 太郎」でないデータを取得

【実行結果】

顧客ID 氏名 性別 契約日 電話番号
1 山田 花子 女性 2008-12-25 000-000-0000
2 中村 一郎 男性 2009-05-19 000-000-0001
4 上野 京子 女性 2010-03-20 000-000-0003
5 西田 次郎 男性 2010-07-11 000-000-0004
6 今井 真美 女性 2011-02-17 000-000-0005
7 ピエール 梅原 男性 2012-10-29 000-000-0006

ANY(いずれかを表す比較演算子の修飾子)

「ANY」演算子は比較演算子とサブクエリーで構成されます。
サブクエリーで取得される結果のいずれかの値と比較する場合に使用します。

文法

式 比較演算子 ANY(サブクエリー)

ANY演算子は指定する比較演算子によって動作が異なります。
比較演算子に「<」を指定した場合は、サブクエリーが返す結果のいずれかの値よりも小さいものが対象となります。

例えば、サブクエリー(SELECT 値 FROM テーブル)から得られる結果が「2, 4, 7」であれば、2、4、7のいずれかの値より小さいもの(行)がTrue(真)となります。(結果として7よりも小さいものが対象になります。)

比較演算子に「>」を指定した場合は、「<」とは逆に、サブクエリーが返す結果のいずれかの値よりも大きいものが対象となります。

サブクエリー(SELECT 値 FROM テーブル)から得られる結果が「2, 4, 7」であれば、2、4、7のいずれかの値より大きいもの(行)がTrue(真)となります。(結果として2よりも大きいものが対象になります。)

例 「顧客」テーブルの「顧客ID」が「優待顧客」テーブルの「顧客ID」のいずれかと一致するデータを取得

【実行結果】

顧客ID 氏名 性別 契約日 電話番号
2 中村 一郎 男性 2009-05-19 000-000-0001
5 西田 次郎 男性 2010-07-11 000-000-0004
6 今井 真美 女性 2011-02-17 000-000-0005

SOME(ANYと同じくいずれかを表す比較演算子の修飾子)

「SOME」は「ANY」と同様です。

文法

式 比較演算子 SOME(サブクエリー)

ALL(すべてを表す比較演算子の修飾子)

「ALL」演算子は比較演算子とサブクエリーで構成されます。
サブクエリーで取得される結果のすべての値と比較する場合に使用します。

文法

式 比較演算子 ALL (サブクエリー)

ALL演算子は指定する比較演算子によって動作が異なります。
比較演算子に「<」を指定した場合は、サブクエリーが返す結果のすべての値よりも小さいものが対象となります。

例えば、サブクエリー(SELECT 値 FROM テーブル)から得られる結果が「3, 5, 8」であれば、3よりも小さいもの(行)がTrue(真)となります。

比較演算子に「>」を指定した場合は、「<」とは逆に、サブクエリーが返す結果のすべての値よりも大きいものが対象となります。

サブクエリー(SELECT 値 FROM テーブル)から得られる結果が「3, 5, 8」であれば、8よりも大きいもの(行)がTrue(真)となります。

ちなみに、以下のような構文はエラーになりませんが、サブクエリが返す値が複数ある場合は、対象の行(レコード)を取得することができません。

サブクエリー(SELECT 値 FROM テーブル)から得られる結果が「3, 5, 8」の場合、3と5と8のすべてに一致するケースが存在しないためです。

例 「顧客」テーブルの「顧客ID」が「優待顧客」テーブルにないデータを取得

【実行結果】

1 山田 花子 女性 2008-12-25 000-000-0000
3 佐藤 太郎 男性 2009-11-04 000-000-0002
4 上野 京子 女性 2010-03-20 000-000-0003
7 ピエール 梅原 男性 2012-10-29 000-000-0006