Developer

【SQL基礎】IN演算子による条件指定
2020.12.28
Lv1

【SQL基礎】IN演算子による条件指定

本項では、IN演算子について説明していきます。


INの基本構文

IN演算子は、引数として渡した値のリストのいずれかと一致すればいいときに使用します。
リストとの比較なので、前回に説明したBETWEEN演算子と違い連続した値である必要はありません。
また、ここでは説明しませんが、後述します副問い合わせと組み合わせても使用できます。
構文は下記になります。

対象 IN (値1, 値2, 値3, … , 値n)

否定形の場合は下記になります。

対象 NOT IN (値1, 値2, 値3, … , 値n)

また、IN演算子は以下のように置き換えることもできます。

対象 = 値1 OR 対象 = 値2 OR 対象 = 値3 OR … OR 対象 = 値n

同じく、否定形の場合は下記になります。

対象 != 値1 OR 対象 != 値2 OR 対象 != 値3 OR … OR 対象 != 値n

補足として、MySQLではINに渡す値の数に制限はありませんが(SQL文自体のサイズ上限の影響は受ける)
ほかのDBでは、最大数が決まっているものがあるので大量な値を渡すときは注意が必要になります。
例えば、Oracleは1000個が最大です。

では、実際にやってみましょう。
使用するテーブルは引き続き下記になります。

まずは、IN演算子で住所が埼玉県と神奈川県の人のデータを抽出してみましょう。

SELECT *
FROM teachers
WHERE address IN ("埼玉県", "神奈川県");

住所が埼玉県と神奈川県の人のデータが抽出できました。

次に、NOTを付けて否定形でやってみます。

SELECT *
FROM teachers
WHERE address NOT IN ("埼玉県", "神奈川県");

住所が、埼玉県と神奈川県以外の人のデータが抽出できたことが確認できました

最後にNULLを渡すとどうなるか見てみましょう。

SELECT *
FROM teachers
WHERE age IN (25,NULL, 29);

25歳と29歳の人のデータが抽出されて、NULLの人のデータは抽出されませんでした。
このように、NULLの判定は、前々回にやった「IS NULL」「IS NOT NULL」でしか比較でないので注意しましょう。


今回の学習ポイント

・IN演算子は、引数で渡した値のいずれかと一致するかを比較できる。
・IN演算子ではNULLは比較できない。


練習問題

問題として使用するデータは「SQL練習問題」のものを使用しています。
以下からダウンロード可能です。
また、ダウンロードしたら以下のようにしてworldcup2014データベースを作成し、インポートしてください。
※worldcup2014.zip解凍してできるworldcup2014.sqlファイルをCドライブ直下に配置した場合。

worldcup2014.zip

[sql] CREATE DATABASE worldcup2014;

use worldcup2014

source C:\worldcup2014.sql
[/sql]

1.IN演算子のみを使用して、体重(players.weight)が62、92、100kgの選手のデータを抽出してください。

答え
[sql] SELECT *
FROM players
WHERE weight IN (62, 92,100);
[/sql]

選手の体重を比較しないといけないので、weightカラムに対してIN演算子を使用して比較しています。

2.IN演算子と算術演算子%(剰余)のみを使用して、身長(players.height)もしくは体重(players.weight)が偶数(値 % 2 = 0)の選手のデータのみ抽出してください。

答え
[sql] SELECT *
FROM players
WHERE 0 IN (height % 2, weight % 2);
[/sql]


※画像はSELECT結果の一部のみ表示しています。

ある値が偶数かどうかは、2で割った値が0であるかどうかで判断できます。
割った余りの値を算出するには算術演算子の「%」を使用します。
ということで、身長と体重はそれぞれ「height % 2 = 0」「weight % 2 = 0」で偶数かどうか判断できます。
あとは、WHERE句で「height % 2 = 0 OR weight % 2 = 0」としてもいいですが
今回は「IN演算子と算術演算子%(剰余)のみを使用して」とのことなので、ORで記述するのではなく上記のようにINに置き換えています。

 

 

連載目次リンク

SQL基礎 連載目次

関連する連載リンク

SQL練習問題 一覧まとめ