MySQLの条件指定を行うWHERE句について、サンプルを交えて解説しています。
以下、サンプルデータベースとしてEmployeesを、MySQLのバージョンは5.7.28を前提としています。
MySQLのWHEREの構文
WHERE句は、select文やdelete文などで条件指定する際に使います。
基本的な構文は以下の通りです。
select カラム名 from テーブル名 where 条件
複数の条件を指定する場合は、ANDもしくはORを使います。
ANDは2つの条件が同時に成り立つことを条件にする演算子。
下記SQLは、employees(社員)テーブルから、emp_no(社員番号)が10020以下で、gender(性別)がF(女性)のデータのみ抽出します。
mysql> select * from employees where emp_no < 10020 and gender = 'F'; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 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 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | | 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 | +--------+------------+------------+-----------+--------+------------+
ORは、少なくともどちらか一方の条件が成り立つことを条件にする演算子。
下記SQLは、employees(社員)テーブルから、first_name(姓名の名)がBezalel、またはlast_name(姓名の姓)がSluisのデータを抽出します。
mysql> select * from employees where first_name = 'Bezalel' or last_name = 'Sluis'; +--------+------------+-------------+----------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+-------------+----------------+--------+------------+ | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10011 | 1953-11-07 | Mary | Sluis | F | 1990-01-22 | | 10630 | 1954-08-10 | Bezalel | Katzenelson | F | 1993-06-26 | | 10775 | 1956-03-12 | Xiaoheng | Sluis | M | 1988-12-09 | | 11251 | 1955-10-16 | Bezalel | Chinal | M | 1985-11-26 | | 12415 | 1952-06-05 | Uri | Sluis | M | 1986-10-25 | : :
ANDとORを同時に使うことも可能。ANDとORが混在した場合は、ANDの方が優先順位が高くなります。場合によっては、括弧を使って正しく条件を指定しましょう。
以下のSQLは、employees(社員)テーブルから、「first_nameがBezalelまたは、last_nameがSluis」かつ、emp_no(社員番号)が11000以下のデータを抽出します。
mysql> select * from employees where (first_name = 'Bezalel' or last_name = 'Sluis') and emp_no < 11000; +--------+------------+------------+-------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-------------+--------+------------+ | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10011 | 1953-11-07 | Mary | Sluis | F | 1990-01-22 | | 10630 | 1954-08-10 | Bezalel | Katzenelson | F | 1993-06-26 | | 10775 | 1956-03-12 | Xiaoheng | Sluis | M | 1988-12-09 | +--------+------------+------------+-------------+--------+------------+
演算子を使った条件指定
ANDやOR以外にも、以下の演算子を使って条件の指定が可能です。
IN リストに含まれる値を指定する
INはリストに含まれるかどうかを条件に指定する演算子です。
以下のSQLは、departments(部署)テーブルから、「dept_no(部署番号)、dept_name(部署名)」の組み合わせが、(「d001,Marketing」、「d004,Production」)のデータを抽出します。
mysql> SELECT * FROM `departments` -> where (dept_no,dept_name) in ( ("d001","Marketing"), ("d004","Production") ); +---------+------------+ | dept_no | dept_name | +---------+------------+ | d001 | Marketing | | d004 | Production | +---------+------------+
【関連記事】
▶SQL in句のサンプルコード集 複数カラムの指定方法とは?
BETWEEN 指定した区間の値を指定する
BETWEENは、指定した2つの値の区間を条件指定する演算子です。
以下のSQLは、employees(社員)テーブルから、emp_no(社員番号)が20000~20005のデータを抽出します。
mysql> SELECT * FROM employees -> where emp_no between 20000 and 20005; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 20000 | 1961-09-14 | Jenwei | Matzke | F | 1990-11-29 | | 20001 | 1962-05-16 | Atreye | Eppinger | M | 1990-04-18 | | 20002 | 1955-12-25 | Jaber | Brender | M | 1988-01-26 | | 20003 | 1953-04-11 | Munehiko | Coors | F | 1991-02-07 | | 20004 | 1952-03-07 | Radoslaw | Pfau | M | 1995-11-24 | | 20005 | 1956-02-20 | Licheng | Przulj | M | 1992-07-17 | +--------+------------+------------+-----------+--------+------------+
【関連記事】
▶SQL betweenで範囲指定するサンプルコード 速度アップにもつながる?
LIKE ワイルドカードを使ったあいまいな文字列を指定する
likeはあいまい指定が可能な演算子です。
以下のSQLは、employees(社員テーブル)から、first_name(姓名の名)の2文字と3文字目が「or」のデータを抽出します。
mysql> SELECT * FROM `employees` WHERE first_name like '_or%' limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10182 | 1961-02-04 | Moriyoshi | Merey | F | 1990-09-02 | | 10366 | 1960-01-25 | Morrie | Piazza | M | 1994-04-11 | | 10530 | 1956-07-19 | Boriana | Coors | F | 1987-09-23 | | 10572 | 1960-10-10 | Cordelia | Axelband | M | 1988-02-16 | | 10633 | 1957-02-09 | Sorina | Herber | M | 1985-06-17 | | 10695 | 1962-08-30 | Zorica | Acton | M | 1989-08-05 | | 10710 | 1962-12-25 | Sorina | Kermarrec | M | 1992-01-10 | | 10732 | 1962-04-22 | Morris | Andreotta | F | 1991-03-10 | | 10735 | 1964-09-12 | Morrie | Gewali | M | 1985-10-29 | | 10739 | 1961-02-11 | Gor | Iacovou | F | 1985-03-12 | +--------+------------+------------+-----------+--------+------------+
【関連記事】
▶MySQL likeのサンプルコード集 複数のパターンマッチングをするには?
まとめ
- WHERE句で複数条件を指定する場合は、ANDまたはORで接続する。
- INでリスト内に値を含むかどうかの条件指定が可能。
- BETWEENで、区間内に値を含むかどうかの条件指定が可能。
- LIKEでワイルドカードを使ったあいまい指定が可能。