備忘録的プログラミングリファレンス

DELETE クエリ

 DELETE クエリは、記録されたテーブルの行データを削除するためのコマンドです。SQLの基本となるコマンドのひとつです。

 基本的には WHERE 句を使って特定の行を削除するようにします。WHERE 句で行を指定しないとすべて削除してしまうので十分に注意してください。

DELETE クエリ
DELETE FROM table_name WHERE id='001';

 間違って削除してしまわないように ROLLBACK といった対処方法があります。ただし、ROLLBACK するためにはポイントを設定しておく必要がありますので、やはり削除には十分に注意してください。
 バックアップなどの事前対処をしておいたほうが無難でしょう。

 この例は table_name というテーブルに記録されている WHERE で抽出した行を削除します。

 クエリとは、問い合わせを意味し、データベースではデータの検索( SELECT )入力( INSERT )更新( UPDATE )、削除( DELETE )といった命令をサーバーに送る行為を指します。
 クエリには、作成( CREATE )、変更( ALTER )、削除( DROP )も含みます。

構文(Syntax)

 DELETE 文はデータベースに記録されたデータを削除する SQL 文です。
 通常は WHERE によって特定のデータを削除するようにします。

DELETE 文の簡単な例
	DELETE FROM table_name
		WHERE id = 1;

 データベースによって DELETE の仕様は異なります。

MySQL

 MySQL での DELETE 文は以下のような仕様になっています。

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [[AS] tbl_alias]
    [PARTITION (partition_name [, partition_name] ...)]
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]
	

PostgreSQL

 PostgreSQL では以下のうような仕様になっています。

DELETE FROM [ ONLY ] table [ [ AS ] alias ]
    [ USING using_list ]
    [ WHERE condition | WHERE CURRENT OF cursor_name ]
    [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
	

句について

 DELETE 文はいくつかの句で構成されています。例えば以下のような句があります。

 はデータベースによって文節とも呼ばれます。Oracle では、MySQLやPostgreSQL ではと呼ばれることが多いようです。
 このサイトではと呼ぶようにしています。

DELETE 句

 簡単な DELETE 文は、以下のように削除するデータがあるテーブルを指定した SQL 文です。
 ただし、WHERE 句がないと全てのデータを削除してしまいますので十分に注意してください。

DELETE FROM table_name;

 特に既にデータがある場合は十分注意してください。すべてのデータを削除してしまいます。データが戻せるように、ロールバックポイントを作成しておいた方がよいでしょう。

 例えば、以下のような sales_slip テーブルの 指定した id の date_time を現在の日時に変更するには以下のようにします。

MySQL DELETE クエリ
DELETE FROM sales_slip
WHERE id = 1;

Query OK, 1 row affected (0.01 sec)

 DELETE されているかを確かめるには SELECT クエリを実行します。

DELETE の確認
SELECT * FROM sales_slip WHERE id = 1;

Empty set (0.00 sec)

 ここの例で主に使用しているデータはテーブルページの外部キー制約( FOREIGN KEY )の作成例です。

 以下のようなデータを使用しています。

SELECT * FROM goods;
+----+----------------+------------+
| id | name           | unit_price |
+----+----------------+------------+
|  1 | candy          |          3 |
|  2 | snack          |          5 |
|  3 | chocolate      |          8 |
|  4 | ice            |          8 |
|  5 | lollipop candy |         15 |
+----+----------------+------------+
...

select * from sales_slip;
+----+---------------------+----------+------------+--------+
| id | date_time           | goods_id | unit_price | amount |
+----+---------------------+----------+------------+--------+
|  1 | 2023-09-26 22:29:57 |        1 |          3 |    100 |
|  2 | 2023-09-26 22:29:58 |        2 |          8 |     50 |
|  3 | 2023-09-28 22:42:10 |        2 |          5 |     30 |
|  4 | 2023-09-28 22:42:10 |        1 |          5 |     80 |
|  5 | 2023-09-28 22:42:53 |        3 |         10 |     10 |
+----+---------------------+----------+------------+--------+
...

WHERE 句

 条件を指定して検索して取得する場合は WHERE 句を加えます。

DELETE FROM table_name WHERE id <= 100;

 上記の例は id が 100 以下のレコードを検索して削除します。

LIMIT 句

 LIMIT 句は、検索されたレコードから指定された数の行のみを削除します。

DELETE FROM table_name LIMIT 2;

 上記の例では、検索された順で 2 行までを削除対象とします。レコードが 2 行に満たない場合は検索されたすべての行を削除します。

 取得する行数の開始位置は OFFSET 句で指定します。例えば、2 行目から 4 行分を取得するには以下のようにします。

DELETE FROM table_name LIMIT 2 OFFSET 2;