SQLを記述する際、たびたびWHERE句の中で複数条件を指定したいケースが訪れます。
そんな時に利用出来るのが今回ご紹介する「IN」句です。
本記事では、MySQL環境を使用して「IN」句の基本的な使い方をサンプルコードを交えながらご紹介していきたいと思います。
目次
MySQLのIN句について基本的な使い方を理解しよう
MySQLでも利用可能なIN句についてまずは基本的な使い方をご紹介していきたいと思います。
IN句を使ってWHERE句に複数条件を指定しよう
IN句の使い方はWHERE句で指定したカラムに対し、複数の値の中から一致するデータを抽出します。
下記はIN句を利用したSQLの基本構文です。
SELECT カラム名, [カラム名] FROM テーブル名 WHERE カラム名 IN (値, 値, ...)
サンプルSQLはOR演算子を使っても記述することが可能です。
SELECT カラム名, [カラム名] FROM テーブル名 WHERE カラム名 = 値 OR カラム名 = 値 OR ....
WHERE句でOR演算子を使う場合、指定する値が多くなるほどSQLが長く読みにくくなりますので、IN句を用いて複数の値を指定する方法がおすすめです。
サンプルSQLでIN句の使い方を確認しよう
上記の説明を実際にテーブルから値を取得するサンプルSQLで確認してみましょう。
サンプル用のテーブルとして「sample_user」というテーブルを用意しました。
格納されているデータは下記の通りとなります。
+------+---------------+ | id | name | +------+---------------+ | 1 | ポテパン1 | | 2 | ポテパン2 | | 3 | ポテパン3 | +------+---------------+
では、実際にIN句を使用してデータを取得してみます。
今回はidが「1」と「3」のデータを取得したいと思います。
select * from sample_user where id in (1, 3);
サンプルSQLを実行した結果が下記の通りとなります。
+------+---------------+ | id | name | +------+---------------+ | 1 | ポテパン1 | | 3 | ポテパン3 | +------+---------------+
指定した値と一致するデータが抽出されていることがご確認頂けます。
IN句を使用したサンプルSQLをOR演算子を使って書き換えてみよう
次にサンプルSQLをOR演算子を使って書き換えてみたいと思います。
サンプルSQLでは指定している値が2つだけのため、大きな負担にはなりませんが指定する値が増えるほどSQLも長くなり煩雑で読みにくいSQLになってしまうため注意が必要です。
select * from sample_user where id = 1 OR id = 3;
MySQLのIN句でサブクエリを使ってみよう
IN句は複数の値をリスト形式で条件として設定可能なため、SELECT句で取得した複数の値を条件として指定することも可能です。
IN句でサブクエリを利用する際の基本構文
IN句にサブクエリで取得した値を設定する際の基本構文は、FROM句でサブクエリを使用する場合とほとんど同じです。
SELECT カラム名, [カラム名] FROM テーブル名 WHERE カラム名 IN (SELECT カラム名 FROM テーブル名 [WHERE ...])
注意すべき点としてサブクエリのSELECT句で取得するカラムは1つに限定する必要があります。
サンプルSQLでサブクエリを利用したIN句の処理内容を確認しよう
今回のサンプルでは上記で利用していた「sample_user」に加えて「sample_order」というテーブルを使用します。
テーブルに格納されているデータは下記の通りとなります。
+----------+--------------+---------------------+---------+ | order_id | product_name | order_date | user_id | +----------+--------------+---------------------+---------+ | 1 | ラーメン | 2020-01-15 13:08:41 | 1 | | 2 | カレー | 2020-01-15 13:09:26 | 1 | | 3 | 寿司 | 2020-01-15 13:09:45 | 2 | | 4 | ラーメン | 2020-01-15 13:10:33 | 4 | +----------+--------------+---------------------+---------+
では実際にサンプルSQLを作成してみましょう。
今回は「ラーメン」を注文したお客さんの中で「sample_user」テーブルに登録されているユーザーを抽出するSQLを作成しました。
select * from sample_user where id in (select user_id from sample_order where product_name = 'ラーメン');
実行した結果が下記の通りとなります。
+------+---------------+ | id | name | +------+---------------+ | 1 | ポテパン1 | +------+---------------+
サブクエリでは「ラーメン」を注文したお客さんとして「user_id」が「1」と「4」のデータが取得出来ますが、メインクエリのテーブル「sample_user」には「id=4」のデータは存在しないため、結果として「id=1」のデータのみが表示されていることがご確認頂けます。
MySQLでもNOT IN句は利用可能
IN句とセットで説明されるNOT IN句についても触れておきたいと思います。
IN句ではカラムに指定した複数の値の「いずれかが一致する」データを抽出していました。
反対にNOT IN句ではカラムに指定した複数の値の「いずれも一致しない」データが抽出されます。
NOT IN句の基本構文を確認しよう
NOT IN句の基本構文はIN句と全く同じで取得する内容が正反対のデータとなります。
SELECT カラム名, [カラム名] FROM テーブル名 WHERE カラム名 NOT IN (値, 値, ...)
WHERE句のカラムに指定した「値」が存在しないデータのみが抽出されます。
サンプルSQLでNOT IN句の使い方を確認しよう
では実際にIN句のサンプルSQLをNOT IN句に記述し直して実行してみたいと思います。
select * from sample_user where id not in (1, 3);
実行した結果が下記の通りとなります。
+------+---------------+ | id | name | +------+---------------+ | 2 | ポテパン2 | +------+---------------+
NOT IN句で指定した値以外のデータが抽出されていることがご確認頂けます。
さいごに:MySQL以外でも利用できるIN句の使い方をきちんと理解しておこう
本記事ではMySQL環境でのサンプルSQLを交えてIN句の使い方をご紹介してきました。
IN句はSQL構文としてMySQL以外のデータベースでも利用することが可能です。
IN句を利用することでSQL文をコンパクトで読みやすく記述することが可能となりますので、積極的に活用してみてください。
「*」を利用して複数カラムを取得することも出来ないため注意が必要です。