【MySQL】DELETE文の書き方:サンプル多数あり
ここではMySQLデータベースで、表のデータを削除するSQL、DELETE文について紹介します。
DELETE文の基本構文に加えて、たくさんのサンプルを掲載していますのでぜひ参考にしてください。
DELETE文の基本構文
DELETE文ではテーブルに存在するレコードを削除するSQLコマンドです。
DELETE文の基本構文は次の通りです。
WHERE条件を付けることで、削除するデータを選択するし絞ることが出来ます。
DELETE FROM テーブル名 [WHERE 条件];
データベースやテーブル、カラムの削除について
DELETE文はテーブルに存在するデータを削除することしかできません。
データベースやテーブル、カラムの削除は別のコマンドを使います。
詳しくは↓で紹介していますので参考にしてください。
>>【MySQL】データベースを作成・削除するSQL
>>【MySQL】テーブルを作成・変更・削除するSQL
>>【MySQL】テーブルの属性を追加・変更・削除する方法
DELETE文のSQLサンプル
全件データを一括削除
DELETE文ではWHERE句で条件を指定しない場合は、全てのレコードを一括削除します。
DELETEの他にも、TRUNCATE文でテーブルのレコードを全て削除することができます。
DELETE FROM テーブル名;
次の例ではtab1テーブルのレコードを全て削除しています。
mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00001 | test | D0001 | 28 |
| 00002 | test | D0002 | 25 |
| 00003 | test | D0002 | 35 |
| 00004 | Tanaka | D0003 | 45 |
| 00005 | Kizaki | D0003 | 55 |
| 00006 | Nakata | D0003 | 35 |
+--------+----------+-------+------+
6 rows in set (0.00 sec)
mysql> DELETE FROM tab1;
Query OK, 6 rows affected (0.08 sec)
mysql> SELECT * FROM tab1;
Empty set (0.00 sec)
WHERE句で条件指定してDELETE
DELETE文では、WHERE句に条件を指定することで、条件に一致したレコードだけを削除することが出来ます。
DELETE FROM テーブル名 WHERE 条件;
次の例では、「WHERE emp_id = ‘00001’」としてemp_idが00001と一致するレコードだけを削除しています。
mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00001 | Suzuki | D0001 | 28 |
| 00002 | Tanaka | D0002 | 25 |
| 00003 | Kizaki | D0002 | 35 |
| 00004 | Tanaka | D0003 | 45 |
| 00005 | Kizaki | D0003 | 55 |
| 00006 | Nakata | D0003 | 35 |
+--------+----------+-------+------+
6 rows in set (0.00 sec)
mysql> DELETE FROM tab1 WHERE emp_id = '00001';
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00002 | Tanaka | D0002 | 25 |
| 00003 | Kizaki | D0002 | 35 |
| 00004 | Tanaka | D0003 | 45 |
| 00005 | Kizaki | D0003 | 55 |
| 00006 | Nakata | D0003 | 35 |
+--------+----------+-------+------+
5 rows in set (0.00 sec)
複数の条件を指定してDELETE
WHERE句には複数の条件を指定することで、複数レコードを同時に削除することが出来ます。
DELETE FROM テーブル名 WHERE 条件1 OR 条件2;
次の例では、「WHERE emp_id = ‘00001’ OR emp_id = ‘00002’」としてemp_idが00001または00002と一致するレコードだけを削除しています。
mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00001 | Suzuki | D0001 | 28 |
| 00002 | Tanaka | D0002 | 25 |
| 00003 | Kizaki | D0002 | 35 |
| 00004 | Tanaka | D0003 | 45 |
| 00005 | Kizaki | D0003 | 55 |
| 00006 | Nakata | D0003 | 35 |
+--------+----------+-------+------+
6 rows in set (0.00 sec)
mysql> DELETE FROM tab1 WHERE emp_id = '00001' OR emp_id = '00002';
Query OK, 2 rows affected (0.00 sec)
mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00003 | Kizaki | D0002 | 35 |
| 00004 | Tanaka | D0003 | 45 |
| 00005 | Kizaki | D0003 | 55 |
| 00006 | Nakata | D0003 | 35 |
+--------+----------+-------+------+
4 rows in set (0.00 sec)
IN句を指定してDELETE
WHERE句の条件に、IN句を指定することで、任意の値リストのいずれかと一致するレコードを削除することが出来ます。
DELETE FROM テーブル名 WHERE 列名 IN (値1,値2...);
次の例では「WHERE emp_id IN (‘00001′,’00002′,’00003′)」として、emp_id列の値が’00001′,’00002’,’00003’のいずれかと一致するレコードを削除しています。
mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00001 | Suzuki | D0001 | 28 |
| 00002 | Tanaka | D0002 | 25 |
| 00003 | Kizaki | D0002 | 35 |
| 00004 | Tanaka | D0003 | 45 |
| 00005 | Kizaki | D0003 | 55 |
| 00006 | Nakata | D0003 | 35 |
+--------+----------+-------+------+
6 rows in set (0.00 sec)
mysql> DELETE FROM tab1
-> WHERE emp_id IN ('00001','00002','00003');
Query OK, 3 rows affected (0.00 sec)
mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00004 | Tanaka | D0003 | 45 |
| 00005 | Kizaki | D0003 | 55 |
| 00006 | Nakata | D0003 | 35 |
+--------+----------+-------+------+
3 rows in set (0.00 sec)
LIMITで件数指定してDELETE
LIMIT句を使うことで、削除件数を指定することが出来ます。
このとき同時にORDER BY句を指定することで、データを並び替えした上から順にレコードを削除する。
DELETE FROM テーブル名 [ORDER BY 列名] LIMIT 削除件数;
次の例では、age列でソートした結果から上から1件を削除しています。
mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00001 | Suzuki | D0001 | 28 |
| 00002 | Tanaka | D0002 | 25 |
| 00003 | Kizaki | D0002 | 35 |
| 00004 | Tanaka | D0003 | 45 |
| 00005 | Kizaki | D0003 | 55 |
| 00006 | Nakata | D0003 | 35 |
+--------+----------+-------+------+
6 rows in set (0.00 sec)
mysql> DELETE FROM tab1 ORDER BY age LIMIT 1;
Query OK, 1 row affected (0.02 sec)
mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00001 | Suzuki | D0001 | 28 |
| 00003 | Kizaki | D0002 | 35 |
| 00004 | Tanaka | D0003 | 45 |
| 00005 | Kizaki | D0003 | 55 |
| 00006 | Nakata | D0003 | 35 |
+--------+----------+-------+------+
5 rows in set (0.00 sec)
JOINした結果をDELETE
FROM句でJOINを使うことで、複数のテーブルを結合したSELECT結果からレコードを削除することが出来ます。
DELETE 別名1 FROM テーブル名1 別名1
INNER JOIN テーブル名2 別名2 ON 条件;
次の例では、tab1とtab2テーブルを結合した結果からレコードを削除しています。
mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00001 | Suzuki | D0001 | 28 |
| 00002 | Tanaka | D0002 | 25 |
| 00003 | Kizaki | D0002 | 35 |
| 00004 | Tanaka | D0003 | 45 |
| 00005 | Kizaki | D0003 | 55 |
| 00006 | Nakata | D0003 | 35 |
+--------+----------+-------+------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM tab2;
+-------+-----------+
| dept | dept_name |
+-------+-----------+
| D0001 | HR |
| D0002 | SALES |
+-------+-----------+
2 rows in set (0.01 sec)
mysql> DELETE a FROM tab1 a
-> INNER JOIN tab2 b
-> ON a.dept = b.dept
-> WHERE b.dept = 'D0002';
Query OK, 2 rows affected (0.02 sec)
mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00001 | Suzuki | D0001 | 28 |
| 00004 | Tanaka | D0003 | 45 |
| 00005 | Kizaki | D0003 | 55 |
| 00006 | Nakata | D0003 | 35 |
+--------+----------+-------+------+
4 rows in set (0.00 sec)
複数テーブルを同時に削除
DELETE句の後に複数のテーブルを指定することで、1つのDELETE文で複数テーブルのレコードを同時に削除することが出きます。
DELETE 別名1,別名2 FROM テーブル名1 別名1,テーブル名2 別名2...
次の例では、tab1とtab2テーブルのdept列の値がD0002のレコードを同時に削除しています。
mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00001 | Suzuki | D0001 | 28 |
| 00002 | Tanaka | D0002 | 25 |
| 00003 | Kizaki | D0002 | 35 |
| 00004 | Tanaka | D0003 | 45 |
| 00005 | Kizaki | D0003 | 55 |
| 00006 | Nakata | D0003 | 35 |
+--------+----------+-------+------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM tab2;
+-------+-----------+
| dept | dept_name |
+-------+-----------+
| D0001 | HR |
| D0002 | SALES |
| D0003 | DEV |
+-------+-----------+
3 rows in set (0.00 sec)
mysql> DELETE a,b FROM tab1 a,tab2 b
-> WHERE a.dept = b.dept
-> AND b.dept = 'D0002';
Query OK, 3 rows affected (0.01 sec)
mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00001 | Suzuki | D0001 | 28 |
| 00004 | Tanaka | D0003 | 45 |
| 00005 | Kizaki | D0003 | 55 |
| 00006 | Nakata | D0003 | 35 |
+--------+----------+-------+------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM tab2;
+-------+-----------+
| dept | dept_name |
+-------+-----------+
| D0001 | HR |
| D0003 | DEV |
+-------+-----------+
2 rows in set (0.00 sec)
複数のDELETE文を1行で実行
DELETE文は;(セミコロン)で区切ることで複数のDELETE文を1行で実行することが出来ます。
DELETE FROM テーブル名1 [WHERE 条件1];DELETE FROM テーブル名2 [WHERE 条件2]
次の例では、tab1とtab2テーブルのDELETE文を1行で実行しています。
mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept | age |
+--------+----------+-------+------+
| 00001 | Suzuki | D0001 | 28 |
| 00002 | Tanaka | D0002 | 25 |
| 00003 | Kizaki | D0002 | 35 |
| 00004 | Tanaka | D0003 | 45 |
| 00005 | Kizaki | D0003 | 55 |
| 00006 | Nakata | D0003 | 35 |
+--------+----------+-------+------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM tab2;
+-------+-----------+
| dept | dept_name |
+-------+-----------+
| D0001 | HR |
| D0002 | SALES |
| D0003 | DEV |
+-------+-----------+
3 rows in set (0.00 sec)
mysql> DELETE FROM tab1;DELETE FROM tab2;
Query OK, 6 rows affected (0.01 sec)
Query OK, 3 rows affected (0.00 sec)
mysql> SELECT * FROM tab1;
Empty set (0.00 sec)
mysql> SELECT * FROM tab2;
Empty set (0.00 sec)