MySQLのよく使うコマンド・クエリをまとめる。データ操作に関係する構文だけでも改めて見ると多いので、今回はレコードの取得(SELECT)、更新(UPDATE)、追加(INSERT)、削除(DELETE)とそれに絡んでよく使う構文や関数などに限定する。
レコードを取得
SELECT文の基本
SELECT カラム名 FROM テーブル名;
mysql> SELECT * FROM users;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
| 1 | 佐藤 |
| 2 | 鈴木 |
| 3 | 伊藤 |
+---------+-----------+
3 rows in set (0.00 sec)
テーブルから全カラムを取得する場合は * を用いる。上記であれば、usersというテーブルのレコードを全カラムで全件取得することになる。
SELECTの使用例
レコード数が少なく、カラムも少ないテーブルであれば実行時間等もさほど気にすることがないかもしれないが、基本的には下記のように必要なカラムだけを取得するような指定を使う機会が多い。
SELECT user_name FROM users;
また、単純にどれぐらいのユーザー数があるのか、などを調べる目的で、レコードの件数だけわかれば良い場合もある。そんな時はCOUNT関数を利用すると良い。
SELECT COUNT(*) FROM users;
レコードを追加
INSERT文の基本
INSERT文の場合、基本的な書き方が2種類ある。
INSERT INTO テーブル名 VALUES(全カラムに対応する値);
INSERT INTO テーブル名 (指定するカラム名) VALUES(カラムに対応する値);
AUTO_INCREMENTやdefaultが設定されていれば、カラムを指定しなくても値は挿入される。カラムが多くなると入力も煩雑になるので、2番目の方の構文を用いて必須な部分だけ入力して済ますことも多いのではと思う。
mysql> INSERT INTO users (user_id,user_name) VALUES (4,'田中');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM users;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
| 1 | 佐藤 |
| 2 | 鈴木 |
| 3 | 伊藤 |
| 4 | 田中 |
+---------+-----------+
4 rows in set (0.00 sec)
INSERTの使用例
バルクインサートという方法で複数のレコードを同時挿入することも可能。INSERTクエリを複数発行するより実行速度も速く、効率が良い。
INSERT INTO users (user_name) VALUES ('原田'), ('松井');
レコードを更新
UPDATE文の基本
UPDATE テーブル名 SET カラム名=値;
何も条件を指定しないと全レコードの指定したカラムの値が置き換わる。
mysql> UPDATE users SET user_name='福井', created_at='2020-08-29 09:34:28';
Query OK, 7 rows affected (0.00 sec)
Rows matched: 7 Changed: 7 Warnings: 0
mysql> SELECT * FROM users;
+---------+-----------+---------------------+
| user_id | user_name | created_at |
+---------+-----------+---------------------+
| 1 | 福井 | 2020-08-29 09:34:28 |
| 2 | 福井 | 2020-08-29 09:34:28 |
| 3 | 福井 | 2020-08-29 09:34:28 |
| 4 | 福井 | 2020-08-29 09:34:28 |
| 5 | 福井 | 2020-08-29 09:34:28 |
| 6 | 福井 | 2020-08-29 09:34:28 |
| 7 | 福井 | 2020-08-29 09:34:28 |
+---------+-----------+---------------------+
7 rows in set (0.00 sec)
UPDATEの使用例
基本的にはWHERE句を用いて使用する機会が多い。
UPDATE users SET user_name='斎藤' WHERE user_id=5;
条件の指定の仕方次第で1レコードでも複数レコードでも更新可能。
UPDATE users SET user_name='織田' WHERE user_id < 3;
レコードを削除
DELETE文
DELETE FROM テーブル名;
上記の指定だと全レコードを一括で削除することになる。
DELETE FROM テーブル名 WHERE 削除対象の条件;
特定のレコードを指定して消す場合には、WHERE句を利用する。
DELETE FROM users WHERE user_id = 5;
DELETEの挙動とTRUNCATE文
例えば、下記のようなテーブルをDELETEで削除し、レコードを挿入するとどうなるか。
mysql> SELECT * FROM users;
+---------+-----------+---------------------+
| user_id | user_name | created_at |
+---------+-----------+---------------------+
| 1 | 福井 | 2020-08-29 09:34:28 |
| 2 | 福井 | 2020-08-29 09:34:28 |
| 3 | 福井 | 2020-08-29 09:34:28 |
| 4 | 福井 | 2020-08-29 09:34:28 |
| 5 | 福井 | 2020-08-29 09:34:28 |
| 6 | 福井 | 2020-08-29 09:34:28 |
| 7 | 福井 | 2020-08-29 09:34:28 |
+---------+-----------+---------------------+
mysql> DELETE FROM users;
Query OK, 7 rows affected (0.01 sec)
mysql> INSERT INTO users (user_name) VALUES ('田中');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM users;
+---------+-----------+---------------------+
| user_id | user_name | created_at |
+---------+-----------+---------------------+
| 8 | 田中 | 2020-08-29 09:51:11 |
+---------+-----------+---------------------+
1 row in set (0.00 sec)
DELETEの場合はレコードを消すだけなので、idの附番などリセットされず都合が悪いこともある。
レコードを削除とは微妙に異なるが、ただテーブルの中身をきれいに無くしたいという場合はTRUNCATEを使う方が良い。
TRUNCATE TABLE users;
上記でusersテーブルの中身をきれいに消すことができ、また1から開始できる。テーブルごと削除してまた作成するよりも手間がかからず、初期にテストする過程などで使えるのかなと思う。