SQLのwhere句で複数の条件を指定する方法についてまとめています。
SQLのwhere句で複数の条件を指定するには、andとorで条件式を記述
where句に複数の条件を記述するには、条件式をandまたはorで接続します。
以下は、employees(社員テーブル)から、gender(性別)=’F’(女性)かつbirth_date(誕生日)が1960年12月31日以前もしくは、gender=’M’(男性)かつbirth_dateが1970年1月1日以降のレコードを抽出する例です。
mysql> select * from employees where gender = 'F' and birth_date < '1960-12-31' or gender = 'M' and birth_date > '1970-01-01' limit 10; +--------+------------+------------+------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+------------+--------+------------+ | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | | 10011 | 1953-11-07 | Mary | Sluis | F | 1990-01-22 | | 10017 | 1958-07-06 | Cristinel | Bouloucos | F | 1993-08-03 | | 10018 | 1954-06-19 | Kazuhide | Peha | F | 1987-04-03 | | 10023 | 1953-09-29 | Bojan | Montemayor | F | 1989-12-17 | | 10024 | 1958-09-05 | Suzette | Pettey | F | 1997-05-19 | | 10032 | 1960-08-09 | Jeong | Reistad | F | 1990-06-20 | | 10040 | 1959-09-13 | Weiyi | Meriste | F | 1993-02-14 | +--------+------------+------------+------------+--------+------------+ 10 rows in set (0.00 sec)
or演算子は、「どちらか一方を満たす」という意味になり、and演算子は「どちらも同時に満たす」という意味になります。
SQLのwhere句で複数の条件の優先順位
条件式の優先順位は以下の通りです。
- 括弧でくくられた条件式
- andで接続された条件式
- orで接続された条件式
括弧を使うと、複雑な条件を入れ子構造にして記述することが可能です。以下の例は、emp_no(社員番号)が10001もしくは、first_name(姓名の名)がMaryかJeongでhire_date(雇用日)が1980年1月1日以降のレコードを抽出するSQLです。
mysql> select * from employees where emp_no=10001 or (first_name = 'Mary' or first_name = 'Jeong' and hire_date > '1980-01-01' ) 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 | | 10032 | 1960-08-09 | Jeong | Reistad | F | 1990-06-20 | | 10337 | 1957-12-10 | Jeong | Sadowsky | M | 1995-08-06 | | 10532 | 1959-08-31 | Mary | Wossner | F | 1986-05-18 | | 10551 | 1963-10-07 | Jeong | Rijsenbrij | M | 1988-08-06 | | 11821 | 1954-10-18 | Mary | Piazza | F | 1995-12-13 | | 12334 | 1962-03-08 | Mary | Ertl | F | 1990-03-06 | | 13562 | 1960-02-15 | Mary | Cooley | M | 1986-02-24 | | 13881 | 1956-08-14 | Mary | Monarch | F | 1991-06-10 | +--------+------------+------------+------------+--------+------------+ 10 rows in set (0.00 sec)
【関連記事】
▶SQL andのサンプルSQL 複数条件の記述例と、優先順位
where句で複雑な条件式をinで記述する方法
where句の条件式が複雑な場合、inを使って記述するとすっきり見やすくできるケースがあります。
以下の例は、first_nameとlast_nameの組み合わせが「Georgi Facello」、「Mary Wossner」、「Guoxiang Cooley」のデータを抽出する例です。
mysql> select * from employees where (first_name, last_name) in ( ('Georgi','Facello'), ('Mary','Wossner'), ('Guoxiang','Cooley') ); +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | | 10532 | 1959-08-31 | Mary | Wossner | F | 1986-05-18 | | 55649 | 1956-01-23 | Georgi | Facello | M | 1988-05-04 | | 66142 | 1953-06-10 | Guoxiang | Cooley | M | 1993-01-23 | +--------+------------+------------+-----------+--------+------------+ 4 rows in set (0.14 sec)
【関連記事】
▶SQLのwhereはinで複数条件を簡潔に記述できる サブクエリの併用も可
絞り込み対象のカラムを同時に3つ、4つと多数指定したい場合に有効です。
まとめ
- SQLのwhere句で複数条件指定するにはandやorで条件式を接続する
- 条件式には優先順位があり、括弧でくくると最も優先順位が高くなる
- 複数カラムを対象にした条件式はinを使うと簡潔に記述できるケースあり