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とサブクエリを組み合わせた、複雑な条件も記述できる