Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

DELETE

テーブルから行を削除するSQL文です。WHERE句で削除対象を絞り込まないと全行が削除されるため、実行前に必ず確認が必要です。

構文
-- 条件に一致する行を削除します。
DELETE FROM テーブル名 WHERE 条件;

-- テーブルの全行を削除します(WHERE省略)。
DELETE FROM テーブル名;
構文一覧
構文概要
DELETE FROM テーブル名 WHERE 条件条件に一致する行を削除します。削除した行数が返されます。
DELETE FROM テーブル名テーブルの全行を削除します。WHEREを省略した場合の動作です。
DELETE ... LIMIT 件数MySQLの拡張構文です。削除する最大行数を制限できます。
サンプルコード
-- 社員ID=5の社員を削除します。
DELETE FROM employees WHERE id = 5;

-- 退職日が設定済みの社員をすべて削除します。
DELETE FROM employees WHERE retire_date IS NOT NULL;

-- 特定期間より古いログを削除します。
DELETE FROM access_logs WHERE created_at < '2023-01-01';

-- 誰も注文していない商品を削除します(サブクエリを使用)。
DELETE FROM products
WHERE product_id NOT IN (SELECT DISTINCT product_id FROM orders);

-- 削除前に対象件数を確認します(安全な手順)。
SELECT COUNT(*) FROM employees WHERE retire_date IS NOT NULL;
-- 件数を確認してからDELETEを実行します。
DELETE FROM employees WHERE retire_date IS NOT NULL;
実行結果
-- DELETE FROM employees WHERE retire_date IS NOT NULL; の実行結果例
-- Query OK, 3 rows affected (0.02 sec)
-- (3行が削除されたことを示します)
データベース別の書き方

『DELETE FROM ... WHERE』の基本構文は主要なデータベースで共通して使用できます。

DELETE FROM employees WHERE retire_date IS NOT NULL;

『DELETE ... LIMIT』で削除件数を制限できるのは MySQL のみです。PostgreSQL では『DELETE ... USING』でサブクエリの代わりにJOIN的な構文が使えます。

-- MySQL(削除件数を制限)
DELETE FROM access_logs WHERE created_at < '2023-01-01' LIMIT 1000;

-- PostgreSQL(USING句でJOIN的に削除対象を指定)
DELETE FROM order_items
USING orders
WHERE order_items.order_id = orders.order_id AND orders.status = 'cancelled';

PostgreSQL は『DELETE ... RETURNING』で削除した行のデータを取得できます。削除内容の確認やログ記録に便利です。

-- PostgreSQL(削除した行を返す)
DELETE FROM employees WHERE retire_date IS NOT NULL RETURNING id, name;
概要

『DELETE』は行を削除しますが、テーブル自体やその構造(列定義・インデックスなど)は残ります。また、削除した行はトランザクション内であれば『ROLLBACK』で元に戻すことができます。

『WHERE』句を省略すると全行が削除されます。必ず実行前に『SELECT COUNT(*)』などで対象件数を確認してください。本番環境での操作はトランザクション内で実行することを強く推奨します。

テーブルの全行を削除する場合は、ログを残さず高速に処理できる『TRUNCATE』の使用も検討してください。ただし、TRUNCATEはトランザクションで保護できない点に注意が必要です。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。