SQLのand演算子についてまとめてます。
以下、サンプルデータベースとしてEmployeesを、MySQLのバージョンは8.0.18を前提としています。
SQLのandを使ったサンプルコード
employees(社員)テーブルをandを使って条件指定でselectしてみます。employeesテーブルの構造と、条件なしで10件抽出した結果は以下の通りです。
mysql> desc employees; +------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------+------+-----+---------+-------+ | emp_no | int | NO | PRI | NULL | | | birth_date | date | NO | | NULL | | | first_name | varchar(14) | NO | | NULL | | | last_name | varchar(16) | NO | | NULL | | | gender | enum('M','F') | NO | | NULL | | | hire_date | date | NO | | NULL | | +------------+---------------+------+-----+---------+-------+ 6 rows in set (0.06 sec) mysql> select * from employees limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | +--------+------------+------------+-----------+--------+------------+
where句にて、条件をandで記述することで複数の条件指定が可能です。
mysql> select * from employees where first_name = 'Georgi' and hire_date < '1986-06-26'; +--------+------------+------------+-------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-------------+--------+------------+ | 10909 | 1954-11-11 | Georgi | Atchley | M | 1985-04-21 | | 12157 | 1960-03-30 | Georgi | Barinka | M | 1985-06-04 | | 16672 | 1955-04-25 | Georgi | Peris | M | 1986-03-13 | | 38079 | 1964-12-05 | Georgi | Constantine | M | 1985-08-26 | | 38691 | 1956-12-14 | Georgi | Denos | F | 1986-05-30 | | 72521 | 1953-03-13 | Georgi | Daescu | F | 1986-02-06 | | 85237 | 1957-04-05 | Georgi | Chartres | M | 1985-08-30 | | 104315 | 1952-06-14 | Georgi | Woycyznski | M | 1985-08-29 | | 107682 | 1954-10-06 | Georgi | Leonhardt | M | 1986-06-20 |
上記の例は、employees(社員)テーブルから、first_name(姓名の名)がGorgi、hire_date(雇用日)が1986年6月26日以前のデータを抽出します。
where句で、複数の条件を指定するサンプル
複数の条件は、andとorで接続することで条件を多数列挙することが可能です。and、or演算子には優先順位があります。
mysql> select * from employees where first_name = 'Georgi' and hire_date < '1986-05-20' or hire_date > '1999-10-01' limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10684 | 1956-01-23 | Aimee | Tokunaga | F | 1999-10-28 | | 10909 | 1954-11-11 | Georgi | Atchley | M | 1985-04-21 | | 11697 | 1957-12-20 | JoAnne | Merey | F | 1999-11-06 | | 12157 | 1960-03-30 | Georgi | Barinka | M | 1985-06-04 | | 12389 | 1963-10-16 | Percy | Casperson | M | 1999-10-08 | | 13246 | 1952-06-09 | Adil | Siepmann | F | 1999-12-31 | | 13919 | 1952-04-22 | Brewster | Sinicrope | M | 1999-12-04 | | 16672 | 1955-04-25 | Georgi | Peris | M | 1986-03-13 | | 16772 | 1952-09-08 | Baruch | Giveon | F | 1999-10-27 | | 17789 | 1956-03-16 | Snehasis | Gilg | F | 1999-11-14 | +--------+------------+------------+-----------+--------+------------+
上記の例では、first_name=Georgiかつhire_dateが1986-05-20以前、または、hire_dateが1999年10月1日より後でその他の条件なしという条件になります。
andとorの混合した条件指定では、優先順位に気をつけましょう。括弧を使うことで、優先順位を指定できます。
mysql> select * from employees where first_name = 'Georgi' and ( hire_date < '1986-05-20' or hire_date > '1999-10-01' ) limit 10; +--------+------------+------------+-------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-------------+--------+------------+ | 10909 | 1954-11-11 | Georgi | Atchley | M | 1985-04-21 | | 12157 | 1960-03-30 | Georgi | Barinka | M | 1985-06-04 | | 16672 | 1955-04-25 | Georgi | Peris | M | 1986-03-13 | | 38079 | 1964-12-05 | Georgi | Constantine | M | 1985-08-26 | | 72521 | 1953-03-13 | Georgi | Daescu | F | 1986-02-06 | | 85237 | 1957-04-05 | Georgi | Chartres | M | 1985-08-30 | | 104315 | 1952-06-14 | Georgi | Woycyznski | M | 1985-08-29 | | 201627 | 1963-07-08 | Georgi | Calkin | F | 1985-06-18 | | 213744 | 1962-02-25 | Georgi | Bolsens | F | 1986-05-04 | | 214377 | 1959-12-14 | Georgi | Asmuth | F | 1985-12-20 | +--------+------------+------------+-------------+--------+------------+
上記の例では、「first_nameがGeorgiかつ、hire_dateが1986年5月20日より後か、1999年10月1日より前のデータを抽出します。
andとorを使った冗長な条件を記述する場合、inを使って簡潔に見やすく置き換えられるケースもあります。
【関連記事】
▶SQLでandとorを使った条件は、inを使って簡潔に置き換え可能
まとめ
- SQLで複数条件を記述するには、where句でandを使って条件を記述
- andとorでは、優先順位がありandが優先
- 優先順位を変更するにはカッコを使用。カッコ内が優先される