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);