Webサイト制作コースのお申し込みはこちら

SQLのwhere句でinを使うサンプルについてまとめています。

MySQLのサンプルデータベースEmployeesを使用しています。

SQLのwhere句では、inを使って複数条件をスッキリ記述できる

where句にinを使うと、複数条件を簡潔に記述できるケースがあります。

例えば以下のサンプルは、employees(社員)テーブルから、first_name(名)がBezalelまたはGuoxiang、またはKazuhideのデータを10件抽出するSQLです。

mysql> select * from employees where first_name in ('Bezalel','Guoxiang','Kazuhide') limit 10;
+--------+------------+------------+-------------+--------+------------+
| emp_no | birth_date | first_name | last_name   | gender | hire_date  |
+--------+------------+------------+-------------+--------+------------+
|  10002 | 1964-06-02 | Bezalel    | Simmel      | F      | 1985-11-21 |
|  10015 | 1959-08-19 | Guoxiang   | Nooteboom   | M      | 1987-07-02 |
|  10018 | 1954-06-19 | Kazuhide   | Peha        | F      | 1987-04-03 |
|  10121 | 1962-07-14 | Guoxiang   | Ramsay      | M      | 1989-05-03 |
|  10477 | 1952-12-07 | Guoxiang   | Trogemann   | F      | 1989-03-04 |
|  10630 | 1954-08-10 | Bezalel    | Katzenelson | F      | 1993-06-26 |
|  11251 | 1955-10-16 | Bezalel    | Chinal      | M      | 1985-11-26 |
|  11549 | 1961-09-25 | Guoxiang   | Juneja      | M      | 1985-05-06 |
|  11651 | 1961-02-13 | Guoxiang   | Giveon      | M      | 1987-08-09 |
|  11967 | 1959-06-21 | Guoxiang   | Chinin      | M      | 1989-10-28 |
+--------+------------+------------+-------------+--------+------------+
10 rows in set (0.06 sec)

複数カラムを指定するには以下のようにします。first_name(名)とlast_name(姓)の組み合わせが「Mary Sluis」、「Guoxiang Trogemann」「Georgi Peris」のデータを抽出します。andとorを組み合わせて記述する方法に比べ、直感的にわかりやすく簡潔に記述することができました。

mysql> select * from employees 
where (first_name, last_name) in (('Georgi','Peris'), ('Mary','Sluis'),('Guoxiang','Trogemann'));
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  10011 | 1953-11-07 | Mary       | Sluis     | F      | 1990-01-22 |
|  10477 | 1952-12-07 | Guoxiang   | Trogemann | F      | 1989-03-04 |
|  16672 | 1955-04-25 | Georgi     | Peris     | M      | 1986-03-13 |
|  20035 | 1959-04-25 | Guoxiang   | Trogemann | M      | 1985-11-11 |
+--------+------------+------------+-----------+--------+------------+
4 rows in set (0.15 sec)

【関連記事】
SQLでandとorを使った条件をinで置き換えるサンプルコード 

where句の条件にinとサブクエリを組み合わせるサンプル

inとサブクエリを組み合わせることも可能です。以下のサンプルでは、dept_emp(部署・社員紐付けテーブル)の件数が30000件以上、つまり部員数が3万人以上の部署(departments)を抽出しています。

select * from departments 
where departments.dept_no in (
		SELECT dept_no
		from dept_emp 
		group by dept_no 
		having count(*) > 30000
	)

+---------+-------------+
| dept_no | dept_name   |
+---------+-------------+
| d005    | Development |
| d004    | Production  |
| d007    | Sales       |
+---------+-------------+
3 rows in set (2.22 sec)

上記SQLは実行に2.22秒かかるかなり遅いクエリです。サブクエリの条件次第ではクエリの実行速度が遅くなる点に注意しましょう。

【関連記事】
SQL in句のサンプルコード集 複数カラムの指定方法とは? 

where句に複数カラムとinを組み合わせるサンプル

以下のサンプルは、社員の最新の年収を抽出するSQLです。

select *  FROM 	salaries as a 
WHERE 	(emp_no, to_date) not in (
		select emp_no, 
			max(to_date) as to_date
		from salaries as b 
		where a.emp_no = b.emp_no
		group by emp_no
		having count(*) > 1
	)
limit 10;

+--------+--------+------------+------------+
| emp_no | salary | from_date  | to_date    |
+--------+--------+------------+------------+
|  10001 |  60117 | 1986-06-26 | 1987-06-26 |
|  10001 |  62102 | 1987-06-26 | 1988-06-25 |
|  10001 |  66074 | 1988-06-25 | 1989-06-25 |
|  10001 |  66596 | 1989-06-25 | 1990-06-25 |
|  10001 |  66961 | 1990-06-25 | 1991-06-25 |
|  10001 |  71046 | 1991-06-25 | 1992-06-24 |
|  10001 |  74333 | 1992-06-24 | 1993-06-24 |
|  10001 |  75286 | 1993-06-24 | 1994-06-24 |
|  10001 |  75994 | 1994-06-24 | 1995-06-24 |
|  10001 |  76884 | 1995-06-24 | 1996-06-23 |
+--------+--------+------------+------------+
10 rows in set (0.00 sec)

【関連記事】
SQLのas句で、同一テーブルに別名をつけセルフジョインするサンプルコード 

以下の形にすることで、複数カラムに対してサブクエリを使った条件を記述できます。

(カラム1,カラム2…) in (サブクエリ)

まとめ

ポテパンダの一言メモ
  • where句にinを使うと複数条件を簡潔に記述可能
  • (カラム1,カラム2…)の形で複数カラムの指定も可能
  • inとサブクエリを組み合わせた、複雑な条件も記述できる

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。