コース一覧
SQL実践:JOIN・サブクエリ・データ更新
DELETE 文でデータを削除する

SQL実践:JOIN・サブクエリ・データ更新

JOIN、集合演算、サブクエリ、CTE、DDL・DMLを学び、複数テーブルを組み合わせてデータベースを作成・更新する無料コースです。

1
テーブル結合
01. なぜ結合が必要か5分
02. INNER JOINの基本5分
03. LEFT/RIGHT OUTER JOIN5分
04. 複数テーブルの結合5分
05. 自己結合5分
06. 集合演算 UNION/INTERSECT/EXCEPT5分
07. 結合の実践演習5分
08. テーブル結合クイズ5分
2
サブクエリ活用
01. サブクエリとは5分
02. WHERE句のサブクエリ5分
03. FROM句のサブクエリ5分
04. SELECT句のサブクエリ5分
05. WITH句(CTE)の活用5分
06. サブクエリ実践クイズ5分
3
テーブル作成とデータ操作
01. CREATE DATABASE と CREATE TABLE5分
02. データ型の選び方5分
03. INSERT 文でデータを追加する5分
04. UPDATE 文でデータを更新する5分
05. DELETE 文でデータを削除する5分
06. 物理削除と論理削除5分
07. ALTER TABLE で構造を変更する5分
08. 制約 (NOT NULL / UNIQUE / DEFAULT)5分
09. TRUNCATE と DROP5分
10. DDL / DML 実践クイズ5分

DELETE 文でデータを削除する

どこまで消えるか

WHERE を忘れた DELETE は、テーブルを空にする

SQL クエリ

DELETE FROM session_logs;

1 行消すつもりで WHERE を書き忘れると、これで全行が消えます。UPDATE の書き忘れは「全行が同じ値になる」ですが、DELETE の書き忘れは「行そのものが無くなる」です。手がかりごと消えるので、気付いたときに残っているのはバックアップだけになります。

正しい形は次のとおりです。

SQL クエリ

DELETE FROM session_logs
WHERE  expires_at < '2026-01-01';

DELETE FROM テーブル名 に WHERE 条件 を続けます。条件に当たった行だけが消え、テーブルそのものと列の定義は残ります。「行を消す」と「表を消す」は別の命令です。

消す前に、同じ条件で件数を数える

UPDATE と同じで、先に SELECT を流します。DELETE の場合は、中身よりも件数を見るのが速いです。

SQL クエリ

-- 1. 何行消えるのかを先に数える
SELECT COUNT(*) AS target_rows
FROM   session_logs
WHERE  expires_at < '2026-01-01';

-- 2. 数が想定どおりなら、WHERE をそのままにして DELETE
DELETE FROM session_logs
WHERE  expires_at < '2026-01-01';

1,200 件のつもりが 480,000 件だった、と分かるのはこの段階です。桁が違えば、条件をどこかで書き落としています。数えるのに数秒しかかからないので、本番のデータを触るときは必ず挟んでください。

書く順番を逆にするのも効きます。先に SELECT COUNT(*) のほうを書いて条件を固め、数が合ってから頭だけを DELETE FROM に差し替える。この手順にしておけば、WHERE の無い DELETE はそもそも生まれません。

打ってから、戻せるようにしておく

もう 1 枚、安全網があります。トランザクションで囲むと、結果を見てから取り消せます。

SQL クエリ

BEGIN;

DELETE FROM session_logs WHERE expires_at < '2026-01-01';
SELECT COUNT(*) AS remaining FROM session_logs;

ROLLBACK;

BEGIN から COMMIT までの間は、変更がまだ確定していません。残った件数を見て、想定どおりなら COMMIT で確定し、おかしければ ROLLBACK で無かったことにできます。

数えてから打つ、囲んでから打つ。この 2 つを組み合わせておけば、DELETE はそれほど怖い命令ではなくなります。逆に、どちらもやらずに本番へ流すのが、いちばんよくある事故の形です。

テーブル構造

CREATE TABLE products (
  id INT PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  price INT NOT NULL,
  stock INT NOT NULL,
  is_discontinued INT NOT NULL DEFAULT 0
);

INSERT INTO products (id, name, price, stock, is_discontinued) VALUES
  (1, 'ノートPC',         100000, 10, 0),
  (2, 'ワイヤレスマウス',   3000,  0, 1),
  (3, '外付けSSD 1TB',    14000, 20, 0),
  (4, 'ボールペン',          150, 200, 0),
  (5, '古いキーボード',     2000,  0, 1);

期待される出力

idnamepricestock
1ノートPC10000010
3外付けSSD 1TB1400020
4ボールペン150200

ヒント

DELETE FROM テーブル WHERE 条件 の形

AND で 2 つの条件を組み合わせる

実行前に SELECT で対象件数を確認するクセを付ける

query.sql
学習モード
エディタを読み込んでいます
コードの実行結果
データベースを初期化中...