【SQL超入門講座】23.IN|複数のOR条件をすっきり記述して抽出する方法

sql23
SQL超入門講座

こんにちは。キノコードです。
以前のレッスンで解説した論理演算子を覚えていますでしょうか。
AまたはBというように複数の条件のいずれかに一致することを指定したいときは、OR演算子を使いました。
ではこのOR演算子で指定する条件の数が10個に増えたらいかがでしょうか?
10個の条件式をを全てOR演算子でつないで書いていくのは、考えただけでも大変ですよね。
このようなとき皆さんだったら、どのようにすれば良いと思いますか?

今回解説するIN句を使えば、今説明したような複数のOR条件を1つにまとめて記述できます。
条件の記述が楽になるだけでなく、コードの可読性も高くなりますので、是非使えるようになりましょう。

キノコードでは、この動画の他にも、たくさんのプログラミングのレッスンを配信しています。
チャンネル登録がまだの方は、チャンネルがどこにいったかわからなくならないように、チャンネル登録をお願いします。
それでは、レッスンスタートです。

この記事の執筆・監修

キノコード
キノコード

テクノロジーアンドデザインカンパニー株式会社のCEO。
日本最大級のプログラミング教育のYouTubeチャンネル「キノコード」や、プログラミング学習サービス「キノクエスト」を運営。
書籍「あなたの仕事が一瞬で片付くPythonによる自動化仕事術」の著者や、雑誌「日経ソフトウエア」の寄稿などの実績も多数。

IN句とは

IN句を使用することで、「カラムの値が指定した値のリストのいずれかに一致する」という条件を作ることができます。

IN句を追加したSELECT文は次の通りです。

SELECT * FROM テーブル
WHERE カラム IN (値1,値2,値3...)

WHERE句で条件を適用するカラムを書き、続いてIN句を書きます。
IN句ではカッコの中に値をカンマ区切りで書いていきます。
このように書くことで、カラムの値がカッコ内の値のいずれかに一致するという条件式が成立します。

この条件式をOR演算子を使って表現すると SQLは次のようになります。

SELECT * FROM テーブル
WHERE カラム = 値1 OR カラム = 値2 OR カラム = 値3...

ご覧の通り何度もカラム名を書かなければならず、条件式が長くなってしまいました。
IN句を使うことで、このような記述の手間を省き、判読しやすいSQLを書くことができます。
そのため複数の値のいずれかに一致することを条件として書きたい場合は、OR演算子ではなくIN句を使うとよいでしょう。

NOT IN句とは

またIN句の前にNOTを書くことでIN句の否定となり、続くカッコ内の値のいずれにも一致しないという条件になります。

SELECT * FROM テーブル
WHERE カラム NOT IN (値1,値2,値3...)

それではテーブルを用意して、IN句とNOT IN句の使い方を実際に確認していきましょう。

IN句、NOT IN句の使い方

今回はデモテーブルとしてtest01を作成します。
test01は氏名、出席番号、数学の3つのカラムを持ったテーブルです。

氏名 出席番号 数学
高橋 a001 1
伊藤 a002 2
鈴木 a003 3
佐藤 a004 4

まず氏名が高橋、伊藤、山田のいずれかであるレコードを抽出してみましょう。
SQLは次のように書くことができます。

SELECT * FROM test01
WHERE 氏名 IN ('高橋', '伊藤', '山田')

まずWHERE句で氏名のカラムを記述します。
そして続くIN句のカッコの中に高橋、伊藤、山田をカンマ区切りで書いていきます。

IN句で指定した値のうち、test01に存在する氏名は高橋、伊藤の2名です。
条件式が正しく書けていれば、この2名のレコードが抽出されるはずです。

それではSQLを実行してみましょう。
氏名 出席番号 数学
高橋 a001 1
伊藤 a002 2

正しく抽出を行うことができました。

今度は反対に、氏名が高橋、伊藤、山田のいずれにも当てはまらないレコードだけを抽出してみましょう。
IN句の否定はNOTをIN句の前に付ければよいので、先ほどの抽出で使用したSQLを使って、次のように書くことができます。

SELECT * FROM test_table02
WHERE 氏名 NOT IN ('高橋', '伊藤', '山田')

SQLを実行します。

氏名 出席番号 数学
鈴木 a003 3
佐藤 a004 4

IN句で指定した氏名のいずれにも当てはまらない、鈴木、佐藤のレコードだけを正しく抽出することができました。

IN句、NOT IN句でサブクエリを使用する

IN句で指定する値のリストに、別テーブルから抽出したカラムの値を用いることもできます。
これは前回のSQLのレッスンで解説したサブクエリを使います。
SQLはこのように書くことができます。

SELECT * FROM テーブルA
WHERE カラム1 IN (SELECT カラム2 FROM テーブルB WHERE 条件)

これまでの説明では、IN句で指定する値のリストをカッコ内にカンマ区切りで書いていました。
今回は代わりにサブクエリを書いて別テーブルからカラムを抽出し、値のリストとして使用しています。
こうすることで、サブクエリで抽出された値のいずれかに一致する という条件になります。

ここでの注意点はサブクエリで抽出するカラムが1つでなければいけないという点です。
複数のカラムを抽出してしまうとエラーになりますので気を付けましょう。

では実際にデモテーブルで使い方を確認していきます。
説明にあたりtest01に加え、追加のデモテーブルtest02を作成します。

氏名 出席番号 国語
高橋 a001 5
伊藤 a002 6
渡辺 a005 7
加藤 a006 8

それではtest01から、「氏名が、test02で国語の値が6以上の氏名のいずれかに一致する」という条件でレコードを抽出してみましょう。

SQLは次のように書くことができます。

SELECT * FROM test01
WHERE 氏名 IN (SELECT 氏名 FROM test02 WHERE 国語 >= 6)

まずWHERE句で氏名のカラムを選択します。
続いてIN句でサブクエリを書き、test02から氏名のカラムを抽出します。
そしてその際の条件として、サブクエリ内のWHERE句で国語の値が6以上であることを指定しています。

test02において国語の値が6以上である氏名は伊藤、渡辺、加藤の3名です。
このうちtest01に存在する氏名は伊藤だけになります。
そのため正しくSQLを書けていれば、test01から伊藤のレコードだけが抽出されることになります。

SQLを実行して、実行結果を確認してみましょう。
氏名 出席番号 数学
伊藤 a002 2

test01から氏名が伊藤のレコードのみ抽出できました。
このようにサブクエリを書くことで、別のテーブルのカラムの値をIN句で指定することができます。

レッスンは以上です。
IN句の使い方はご理解いただけましたでしょうか。

Kinocodeではわかりやすく飽きない動画づくりを意識しています。
今後はこのようなレッスン動画の配信を予定しています。
レッスンの新着通知が行きますので、是非チャンネル登録をお願いします。
それでは、次のレッスンでお会いしましょう。