SQLのandとor演算子についてまとめてます。
以下、サンプルデータベースとしてEmployeesを、MySQLのバージョンは8.0.18を前提としています。
andとorを使った条件をinを使って置き換えるサンプル
同じカラムに対する条件をorで記述する場合、inで置き換えが可能です。以下は、employees(社員テーブル)から、first_name(姓名の名)がMaryまたはGeorgiのデータを最大10件抽出するSQLです。
mysql> select * from employees where first_name = 'Mary' or first_name = 'Georgi' limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | | 10011 | 1953-11-07 | Mary | Sluis | F | 1990-01-22 | | 10532 | 1959-08-31 | Mary | Wossner | F | 1986-05-18 | | 10909 | 1954-11-11 | Georgi | Atchley | M | 1985-04-21 | | 11029 | 1962-07-12 | Georgi | Itzfeldt | M | 1992-12-27 | | 11430 | 1957-01-23 | Georgi | Klassen | M | 1996-02-27 | | 11821 | 1954-10-18 | Mary | Piazza | F | 1995-12-13 | | 12157 | 1960-03-30 | Georgi | Barinka | M | 1985-06-04 | | 12334 | 1962-03-08 | Mary | Ertl | F | 1990-03-06 | | 13562 | 1960-02-15 | Mary | Cooley | M | 1986-02-24 | +--------+------------+------------+-----------+--------+------------+
inを使って、以下のように記述できます。
mysql> select * from employees where first_name in ('Georgi', 'Mary') limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | | 10011 | 1953-11-07 | Mary | Sluis | F | 1990-01-22 | | 10532 | 1959-08-31 | Mary | Wossner | F | 1986-05-18 | | 10909 | 1954-11-11 | Georgi | Atchley | M | 1985-04-21 | | 11029 | 1962-07-12 | Georgi | Itzfeldt | M | 1992-12-27 | | 11430 | 1957-01-23 | Georgi | Klassen | M | 1996-02-27 | | 11821 | 1954-10-18 | Mary | Piazza | F | 1995-12-13 | | 12157 | 1960-03-30 | Georgi | Barinka | M | 1985-06-04 | | 12334 | 1962-03-08 | Mary | Ertl | F | 1990-03-06 | | 13562 | 1960-02-15 | Mary | Cooley | M | 1986-02-24 | +--------+------------+------------+-----------+--------+------------+
同様に、andとorを使ったSQLもinで置き換えが可能です。
【関連記事】
▶SQL in句のサンプルコード集 複数カラムの指定方法とは?
以下のSQLは、employees(社員)テーブルから、「Georgi Peris」と「Mary Sluis」を抽出するSQLです。
mysql> select * from employees where first_name = 'Georgi' and last_name 'Peris' or first_name = 'Mary' and last_name 'Sluis'; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10011 | 1953-11-07 | Mary | Sluis | F | 1990-01-22 | | 16672 | 1955-04-25 | Georgi | Peris | M | 1986-03-13 | +--------+------------+------------+-----------+--------+------------+
以下のように書き換えが可能です。カッコを使うと見やすく置き換えができるんですね。
mysql> select * from employees where (first_name, last_name) = ('Georgi','Peris') or (first_name, last_name) = ('Mary','Sluis');
さらに、カッコとinを使って、andとorを使わず置き換えが可能です。
似たような条件を複数記述してSQLが長くなってしまう場合、可読性を良くするためにこのような置換えが有効なケースがあります。
mysql> select * from employees where (first_name, last_name) in (('Georgi','Peris'), ('Mary','Sluis')); +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10011 | 1953-11-07 | Mary | Sluis | F | 1990-01-22 | | 16672 | 1955-04-25 | Georgi | Peris | M | 1986-03-13 | +--------+------------+------------+-----------+--------+------------+
まとめ
- 同じカラムに対する複数のor条件は、inで置き換えが可能
- 同じカラムに対するandとorの複数の条件は、カッコでくくってorだけにすることが可能
- andとorの組み合わせによっては、inとカッコで簡潔に記述可能なケースがある