MySQLのWHERE句の書き方

mysql-logo MySQL

whereはMySQLのレコード取得で何かとお世話になるやつ。指定の仕方やよくある組み合わせも忘れがちなので、簡単な用法とか用例をまとめる。

参考例にするテーブル

以下のような従業員テーブルを例に見ていく。

mysql> SELECT * FROM employee;
+----+--------+-----+---------------------+
| id | name   | age | created_at          |
+----+--------+-----+---------------------+
|  1 | 鈴木   |  42 | 2017-04-05 12:09:28 |
|  2 | 伊藤   |  32 | 2018-06-12 10:50:00 |
|  3 | 加藤   |  25 | 2019-09-01 11:04:16 |
|  4 | 山田   |  28 | 2020-04-05 13:10:39 |
|  5 | 斎藤   |  36 | 2020-07-01 11:32:44 |
+----+--------+-----+---------------------+

WHERE句の基本

書式

最もシンプルな書式は以下のようなかたち。

SELECT カラム名 FROM WHERE カラム名 = 値;

WHERE句を利用することで取得するレコードを特定の条件で絞り込むことができる。WHERE以降の部分に条件として絞り込む対象となるカラム名を書き、=でそのカラムに対応する値を記述する。

SELECT * FROM employee WHERE id = 1;
+----+--------+-----+---------------------+
| id | name   | age | created_at          |
+----+--------+-----+---------------------+
|  1 | 鈴木   |  42 | 2017-04-05 12:09:28 |
+----+--------+-----+---------------------+

注意すべき性質

  • カラム名にASでつけた別名を利用することはできない

ASを利用することでカラムに別の名前をつけることができるが、それをWHEREの指定に使うことはできない。これはWHERE句が実行されるときはまだカラム値が決定されていないため。

mysql> SELECT id AS employee_id,name FROM employee WHERE id = 1; #単に別名をつけるのはOK
+-------------+--------+
| employee_id | name   |
+-------------+--------+
|           1 | 鈴木   |
+-------------+--------+

mysql> SELECT id AS employee_id,name FROM employee WHERE employee_id = 1;#これはダメ
ERROR 1054 (42S22): Unknown column 'employee_id' in 'where clause

複数条件指定

ANDを利用しても複数条件は指定できるが、ANDで列挙するよりもINと組み合わせることでよりすっきりと書ける。1カラムを対象条件とする場合は以下のようなかたち。

mysql> SELECT * FROM employee WHERE age IN (28,42);
 # 年齢が28,42のレコードのみ取得
+----+--------+-----+---------------------+
| id | name   | age | created_at          |
+----+--------+-----+---------------------+
|  1 | 鈴木   |  42 | 2017-04-05 12:09:28 |
|  4 | 山田   |  28 | 2020-04-05 13:10:39 |
+----+--------+-----+---------------------+
2 rows in set (0.00 sec)

また、NOTも合わせて使うことができる。

mysql> SELECT * FROM employee WHERE age NOT IN (28,42);
+----+--------+-----+---------------------+
| id | name   | age | created_at          |
+----+--------+-----+---------------------+
|  2 | 伊藤   |  32 | 2018-06-12 10:50:00 |
|  3 | 加藤   |  25 | 2019-09-01 11:04:16 |
|  5 | 斎藤   |  36 | 2020-07-01 11:32:44 |
+----+--------+-----+---------------------+
3 rows in set (0.00 sec)

複数のカラムを条件とする場合ANDやORと組み合わせてINでまとめるような書き方もできる。

mysql> SELECT * FROM employee WHERE age IN (28,42,32) AND name IN ("鈴木","加藤");
+----+--------+-----+---------------------+
| id | name   | age | created_at          |
+----+--------+-----+---------------------+
|  1 | 鈴木   |  42 | 2017-04-05 12:09:28 |
+----+--------+-----+---------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM employee WHERE age IN (28,42,32) OR name IN ("鈴木","加藤");
+----+--------+-----+---------------------+
| id | name   | age | created_at          |
+----+--------+-----+---------------------+
|  1 | 鈴木   |  42 | 2017-04-05 12:09:28 |
|  2 | 伊藤   |  32 | 2018-06-12 10:50:00 |
|  3 | 加藤   |  25 | 2019-09-01 11:04:16 |
|  4 | 山田   |  28 | 2020-04-05 13:10:39 |
+----+--------+-----+---------------------+
4 rows in set (0.00 sec)

使用例のまとめ

使用例のメモ

SELECT * FROM employee WHERE name = '伊藤';
SELECT * FROM employee WHERE name = '伊藤' OR  name = '山田';
SELECT name FROM employee WHERE age > 30;
SELECT * FROM employee WHERE age < 30 ORDER BY age DESC;
SELECT * FROM employee WHERE age IN (28,42,32) AND id IN (1,3,5);

タイトルとURLをコピーしました