Step 14:データの削除(DELETE)

🗑️ Step 14: データの削除(DELETE)

不要なデータを安全に削除しよう!

📋 このステップで学ぶこと
  • DELETE文でデータを削除する基本
  • WHERE句で削除対象を指定する(超重要!)
  • 全削除の危険性と防止策
  • 安全に削除する手順
  • 物理削除と論理削除の違い
  • 実務でよく使う削除パターン

🎯 1. DELETE文とは?

1-1. データベースからデータを削除する

これまで、データを追加(INSERT)更新(UPDATE)してきました。

最後に学ぶのは、データを削除(DELETE)する方法です。

💡 DELETE文が必要な場面
  • 退会した顧客を削除する
  • 販売終了した商品を削除する
  • 古い注文データを削除する
  • テストデータを削除する
  • 間違って入力したデータを削除する

そんなときに使うのがDELETE文です!

🚨 DELETE文は最も危険!

DELETE文は、データを完全に削除します。

一度削除したデータは元に戻せません(バックアップがない場合)。

UPDATE文以上に慎重に使いましょう!

1-2. DELETE文の基本構文

📝 DELETE文の基本構文
DELETE FROM テーブル名
WHERE 条件;
📌 構文の各部分の意味
部分 意味 なぜ必要?
DELETE FROM テーブル名 どのテーブルからデータを削除するか 削除先を指定するため
WHERE 条件 どの行を削除するか 削除対象を絞り込むため(超重要!)
⚠️ UPDATE文との違い

UPDATE文にはSET句がありましたが、DELETE文にはありません。

DELETE文は行ごと削除するので、「どの列を」という指定は不要です。

1-3. 練習用データの確認

Step 13で使ったテーブルをそのまま使います。

📋 顧客テーブル(5人)
顧客ID 顧客名 メール 都道府県
1 田中太郎 tanaka_new@example.com 東京都
2 佐藤花子 sato_new@example.com 京都府
3 鈴木次郎 suzuki@example.com 神奈川県
4 高橋美咲 takahashi@example.com 福岡県
5 山田三郎 yamada@example.com 東京都
📋 商品テーブル(5件)
商品ID 商品名 価格 カテゴリ 在庫数
101 りんご 180 果物 50
102 みかん 130 高級果物 100
103 バナナ 120 果物 50
104 オレンジジュース 160 飲料 25
105 お茶 120 飲料 5

練習用にテストデータを追加しましょう。

※横にスクロールできます

INSERT INTO 顧客 (顧客ID, 顧客名, メール, 都道府県) VALUES (6, ‘テスト太郎’, ‘test1@example.com’, ‘テスト県’), (7, ‘テスト花子’, ‘test2@example.com’, ‘テスト県’), (8, ‘サンプル次郎’, NULL, ‘東京都’); INSERT INTO 商品 (商品ID, 商品名, 価格, カテゴリ, 在庫数) VALUES (106, ‘テスト商品A’, 50, ‘テスト’, 0), (107, ‘テスト商品B’, 30, ‘テスト’, 0), (108, ‘サンプル商品’, 80, ‘サンプル’, 10);

🗑️ 2. 基本的なDELETE

2-1. 1行だけ削除する

テスト太郎さん(顧客ID: 6)を削除してみましょう。

安全な手順1:まずSELECTで確認

※横にスクロールできます

SELECT * FROM 顧客 WHERE 顧客ID = 6;
📋 削除前の状態
顧客ID 顧客名 メール 都道府県
6 テスト太郎 test1@example.com テスト県

✅ 対象が1人だけであることを確認!

安全な手順2:DELETEを実行

※横にスクロールできます

DELETE FROM 顧客 WHERE 顧客ID = 6;
📌 このSQLの意味
部分 意味
DELETE FROM 顧客 顧客テーブルからデータを削除する
WHERE 顧客ID = 6 顧客IDが6の人だけ(テスト太郎さん)

安全な手順3:削除後を確認

※横にスクロールできます

SELECT * FROM 顧客 WHERE 顧客ID = 6;
📋 削除後の状態

結果:(0件)

✅ データが完全に削除されました!

2-2. 商品を削除する

テスト商品A(商品ID: 106)を削除してみましょう。

※横にスクロールできます

DELETE FROM 商品 WHERE 商品ID = 106;

確認してみましょう。

※横にスクロールできます

SELECT * FROM 商品 WHERE 商品ID = 106;
📋 削除後の状態

結果:(0件)

テスト商品Aは削除されました。

💡 DELETE文の3ステップ
  1. SELECTで削除対象を確認
  2. DELETEを実行
  3. もう一度SELECTで削除を確認

この手順を必ず守りましょう!

🎯 3. WHERE句で削除対象を絞り込む

3-1. 様々な条件で絞り込む

WHERE句を使って、削除する行を細かく指定できます。SELECTやUPDATEのWHERE句と同じ書き方です。

3-2. 都道府県で絞り込む

「テスト県」の顧客を全て削除してみましょう。

まずSELECTで確認:

※横にスクロールできます

SELECT * FROM 顧客 WHERE 都道府県 = ‘テスト県’;
📋 対象となる顧客
顧客ID 顧客名 メール 都道府県
7 テスト花子 test2@example.com テスト県

✅ 1人が対象であることを確認(テスト太郎は既に削除済み)

DELETEを実行:

※横にスクロールできます

DELETE FROM 顧客 WHERE 都道府県 = ‘テスト県’;

3-3. 価格で絞り込む

50円未満の商品を削除してみましょう。

まずSELECTで確認:

※横にスクロールできます

SELECT * FROM 商品 WHERE 価格 < 50;
📋 対象となる商品
商品ID 商品名 価格 カテゴリ 在庫数
107 テスト商品B 30 テスト 0

✅ 1件が対象

DELETEを実行:

※横にスクロールできます

DELETE FROM 商品 WHERE 価格 < 50;

3-4. NULLを条件にする

メールアドレスが未登録(NULL)の顧客を削除してみましょう。

※横にスクロールできます

DELETE FROM 顧客 WHERE メール IS NULL;
📌 IS NULLの使い方

NULLかどうかを確認するには= NULLではなくIS NULLを使います。

これはSELECT文やUPDATE文と同じルールです。

3-5. 複数条件での絞り込み(AND)

「テスト」カテゴリで、在庫が0の商品を削除してみましょう。

※横にスクロールできます

DELETE FROM 商品 WHERE カテゴリ = ‘テスト’ AND 在庫数 = 0;
📌 AND条件のポイント

両方の条件を満たす行だけが削除されます。

「テスト」カテゴリだけど在庫が1以上 → 削除されない

在庫が0だけど「果物」カテゴリ → 削除されない

3-6. IN演算子を使った削除

特定の商品IDを一括で削除できます。

※横にスクロールできます

DELETE FROM 商品 WHERE 商品ID IN (106, 107, 108);
📌 IN演算子のメリット

複数の値を一度に指定できます。

WHERE 商品ID = 106 OR 商品ID = 107 OR 商品ID = 108と同じ意味ですが、INの方が簡潔です。

🚨 4. 全削除の危険性

4-1. WHERE句なし = 全データ削除!

WHERE句を書かないと、テーブルの全てのデータが削除されてしまいます。

🚨 絶対にやってはいけない例

※横にスクロールできます

— 危険!全顧客が削除される! DELETE FROM 顧客;

WHERE句がないので、全ての顧客データが削除されます!

田中さんも、佐藤さんも、鈴木さんも、全員消えてしまいます…

4-2. UPDATE文との危険度の比較

⚠️ UPDATE vs DELETE の危険度
操作 WHERE句なしの結果 復旧の可能性
UPDATE 全行が同じ値に更新される 元の値が分かれば復旧可能
DELETE 全データが消える バックアップがないと復旧不可能

DELETE文の方がはるかに危険です!

4-3. 全削除を防ぐ5つの対策

✅ 安全対策チェックリスト
  1. 必ずWHERE句を書く習慣をつける
  2. 削除前にSELECT文で確認する
  3. COUNT(*)で件数を確認する
  4. 重要な操作はバックアップを取ってから行う
  5. 本番環境では権限を制限する

4-4. 削除前の件数確認

削除前に「何件削除されるか」を確認しましょう。

ステップ1:件数を確認

※横にスクロールできます

SELECT COUNT(*) FROM 商品 WHERE カテゴリ = ‘テスト’;
📋 件数確認結果

結果:2

2件が削除対象であることを確認

ステップ2:対象データを確認

※横にスクロールできます

SELECT * FROM 商品 WHERE カテゴリ = ‘テスト’;

ステップ3:問題なければDELETEを実行

※横にスクロールできます

DELETE FROM 商品 WHERE カテゴリ = ‘テスト’;
📌 削除した件数の確認

SQLiteでは、削除した件数を以下のSQLで確認できます。

※横にスクロールできます

SELECT changes();

このSQLは、直前のDELETE(またはUPDATE、INSERT)で影響を受けた行数を返します。

🛡️ 5. 安全な削除の手順

5-1. 5ステップで安全に削除

DELETE文は危険なので、以下の手順を必ず守りましょう。

📌 安全な削除の5ステップ
  1. SELECT文で対象を確認する
  2. COUNT(*)で件数を確認する
  3. 件数が想定と合っているか確認する
  4. DELETE文を実行する
  5. 再度SELECT文で削除を確認する

5-2. 実践例:安全な削除手順

「サンプル」カテゴリの商品を削除する例を見てみましょう。

ステップ1:SELECTで対象を確認

※横にスクロールできます

SELECT * FROM 商品 WHERE カテゴリ = ‘サンプル’;
📋 確認結果
商品ID 商品名 価格 カテゴリ 在庫数
108 サンプル商品 80 サンプル 10

✅ 削除対象の内容を確認

ステップ2:件数を確認

※横にスクロールできます

SELECT COUNT(*) FROM 商品 WHERE カテゴリ = ‘サンプル’;
📋 件数確認

結果:1

✅ 1件だけが対象であることを確認

ステップ3:想定と合っているか確認

「サンプルカテゴリの商品は1件だけ」→ 想定通り!

ステップ4:DELETEを実行

※横にスクロールできます

DELETE FROM 商品 WHERE カテゴリ = ‘サンプル’;

ステップ5:削除を確認

※横にスクロールできます

SELECT * FROM 商品 WHERE カテゴリ = ‘サンプル’;
📋 削除後の確認

結果:(0件)

✅ 正しく削除されました!

📋 6. 物理削除と論理削除

6-1. 2つの削除方法

実務では、データを完全に削除せず、「削除済み」フラグをつける方法がよく使われます。

📌 2つの削除方法
方法 説明 使うSQL
物理削除 データを完全に削除する DELETE文
論理削除 削除フラグを立てる(データは残る) UPDATE文

6-2. 物理削除(DELETE)

データベースからデータを完全に削除します。

※横にスクロールできます

— 物理削除:データが完全に消える DELETE FROM 顧客 WHERE 顧客ID = 999;
📋 物理削除後

データベースから完全に消えます。

SELECTで検索しても、何も表示されません。

6-3. 論理削除(UPDATE)

「削除フラグ」を立てるだけで、データは残します

まず、削除フラグ用の列を追加したテーブルを想定します。

📋 論理削除用のテーブル構造
列名 説明
顧客ID INTEGER 主キー
顧客名 TEXT 顧客の名前
削除フラグ INTEGER 0=有効、1=削除済み
削除日時 TEXT 削除した日時

※横にスクロールできます

— 論理削除:削除フラグを立てるだけ UPDATE 顧客 SET 削除フラグ = 1, 削除日時 = datetime(‘now’) WHERE 顧客ID = 999;
📋 論理削除後

データは残っていますが、「削除フラグ = 1」になります。

通常の検索では表示しないようにします。

論理削除されていないデータだけを取得するには:

※横にスクロールできます

— 削除されていない(有効な)顧客だけを取得 SELECT * FROM 顧客 WHERE 削除フラグ = 0;

6-4. 物理削除と論理削除の比較

✅ 論理削除のメリット
  • 復元可能:誤削除しても元に戻せる
  • 履歴保持:過去のデータを参照できる
  • 監査対応:いつ誰が削除したか記録できる
  • 安全:データが消えるリスクが低い
❌ 論理削除のデメリット
  • 容量増加:データが増え続ける
  • 複雑化:クエリに常に条件が必要
  • パフォーマンス:データ量が多いと遅くなる
  • 一意制約:同じメールアドレスで再登録できない問題

6-5. どちらを使うべき?

📌 使い分けの目安
データの種類 推奨 理由
顧客データ 論理削除 注文履歴との整合性、復元の可能性
注文データ 論理削除 売上分析、監査対応
テストデータ 物理削除 不要なデータは完全に消す
古いログ 物理削除 容量節約
一時データ 物理削除 不要になったら完全削除

💼 7. 実務でよく使う削除パターン

7-1. 古いデータの削除

1年以上前のログデータを削除する例です。

※横にスクロールできます

DELETE FROM ログ WHERE 作成日 < date('now', '-1 year');
📌 このSQLの意味
部分 意味
date('now', '-1 year') 今日から1年前の日付
作成日 < ... それより前(古い)データ

7-2. テストデータの一括削除

メールアドレスに「@test.example.com」を含む顧客を削除する例です。

※横にスクロールできます

DELETE FROM 顧客 WHERE メール LIKE '%@test.example.com';

商品名が「テスト」で始まる商品を削除する例です。

※横にスクロールできます

DELETE FROM 商品 WHERE 商品名 LIKE 'テスト%';

7-3. 在庫切れ商品の削除

在庫が0で、30日以上更新がない商品を削除する例です。

※横にスクロールできます

DELETE FROM 商品 WHERE 在庫数 = 0 AND 更新日 < date('now', '-30 days');

7-4. IN演算子を使った一括削除

特定のIDリストに含まれるデータを一括削除する例です。

※横にスクロールできます

DELETE FROM 商品 WHERE 商品ID IN (901, 902, 903, 904, 905);

7-5. 条件に合わないデータの削除(NOT IN)

一度も注文されていない商品を削除する例です(注文テーブルがある前提)。

※横にスクロールできます

DELETE FROM 商品 WHERE 商品ID NOT IN ( SELECT DISTINCT 商品ID FROM 注文 );
📌 このSQLの意味
  1. SELECT DISTINCT 商品ID FROM 注文:注文されたことがある商品IDの一覧
  2. NOT IN (...):その一覧に含まれない商品ID
  3. つまり、一度も注文されていない商品を削除
💡 実務での活用シーン
  • 定期クリーンアップ:古いログ、一時データの削除
  • テスト後の掃除:テストデータの削除
  • 在庫管理:販売終了商品の削除
  • 顧客管理:退会顧客の削除(または論理削除)

📝 Step 14 のまとめ

✅ このステップで学んだこと
学んだこと 内容
DELETE文 データを完全に削除する
WHERE句 削除対象を絞り込む(超重要!)
全削除の危険性 WHERE句なしは全データ削除
安全な削除手順 SELECT確認→COUNT確認→DELETE→再確認
物理削除と論理削除 完全削除 vs フラグで削除済みにする
📝 DELETE文の基本形
-- 基本形
DELETE FROM テーブル名
WHERE 条件;

-- 安全な削除の流れ
-- 1. 削除対象を確認
SELECT * FROM テーブル名 WHERE 条件;

-- 2. 件数を確認
SELECT COUNT(*) FROM テーブル名 WHERE 条件;

-- 3. 削除実行
DELETE FROM テーブル名 WHERE 条件;

-- 4. 結果を確認
SELECT * FROM テーブル名 WHERE 条件;
🚨 絶対に忘れてはいけないこと
  • WHERE句を必ず書く!
  • 削除前に必ずSELECT文で確認
  • COUNT(*)で件数を確認
  • 重要なデータはバックアップを取る!
🎯 次のステップへ

DELETE文でデータを削除できるようになりました!

これでデータ操作の基本(INSERT, UPDATE, DELETE)を全て学びました。

次のStep 15では、総合演習プロジェクトとして、これまで学んだ内容を実践的に使ってみます。

📝 練習問題

DELETE文を使いこなせるように練習しましょう!

問題 1 基本

1件の削除

顧客テーブルから、顧客IDが999の顧客を削除してください。

※横にスクロールできます

DELETE FROM 顧客 WHERE 顧客ID = 999;

解説:WHERE句で対象を1人に絞り込んでから削除します。

問題 2 基本

商品の削除

商品テーブルから、商品IDが999の商品を削除してください。

※横にスクロールできます

DELETE FROM 商品 WHERE 商品ID = 999;

解説:主キーで1件だけを削除します。

問題 3 基本

条件での削除

商品テーブルから、価格が100円未満の商品を全て削除してください。

※横にスクロールできます

DELETE FROM 商品 WHERE 価格 < 100;

解説:WHERE句で条件を指定して、複数行を削除できます。

問題 4 応用

NULLのデータ削除

顧客テーブルから、メールがNULLの顧客を全て削除してください。

※横にスクロールできます

DELETE FROM 顧客 WHERE メール IS NULL;

解説:NULLのチェックはIS NULLを使います。= NULLではありません。

問題 5 応用

複数条件での削除

商品テーブルから、カテゴリが'テスト'で、かつ在庫数が0の商品を削除してください。

※横にスクロールできます

DELETE FROM 商品 WHERE カテゴリ = 'テスト' AND 在庫数 = 0;

解説:ANDで複数の条件を組み合わせます。両方の条件を満たす行だけが削除されます。

問題 6 応用

IN演算子での削除

商品テーブルから、商品IDが901, 902, 903の商品を一括で削除してください。

※横にスクロールできます

DELETE FROM 商品 WHERE 商品ID IN (901, 902, 903);

解説:IN演算子で複数の値を指定できます。

問題 7 応用

LIKE演算子での削除

商品テーブルから、商品名が「テスト」で始まる商品を全て削除してください。

※横にスクロールできます

DELETE FROM 商品 WHERE 商品名 LIKE 'テスト%';

解説:LIKE演算子の%は「任意の文字列」を意味します。テスト%は「テストで始まる」という意味です。

問題 8 チャレンジ

削除前の確認手順

顧客テーブルから都道府県が'テスト県'の顧客を削除する前に、対象件数を確認するSQLを書いてください。

※横にスクロールできます

-- 対象データを確認 SELECT * FROM 顧客 WHERE 都道府県 = 'テスト県'; -- 件数を確認 SELECT COUNT(*) FROM 顧客 WHERE 都道府県 = 'テスト県'; -- 問題なければ削除 DELETE FROM 顧客 WHERE 都道府県 = 'テスト県';

解説:削除前にSELECTで対象を確認し、COUNT(*)で件数を確認します。これが安全な削除の手順です。

問題 9 チャレンジ

論理削除のSQL

顧客テーブルに削除フラグ列があると仮定して、顧客IDが999の顧客を論理削除するSQLを書いてください(削除フラグを1に設定)。

※横にスクロールできます

UPDATE 顧客 SET 削除フラグ = 1 WHERE 顧客ID = 999;

解説:論理削除はDELETEではなくUPDATEを使います。データは残りますが、削除済みとして扱われます。

問題 10 チャレンジ

有効なデータだけを取得

削除フラグが0(有効)の顧客だけを取得するSQLを書いてください。

※横にスクロールできます

SELECT * FROM 顧客 WHERE 削除フラグ = 0;

解説:論理削除を使う場合、SELECTに常にこの条件を追加する必要があります。

❓ よくある質問

Q1: WHERE句を書き忘れたらどうなりますか?

全てのデータが削除されます!これは非常に危険で、元に戻すことはできません(バックアップがない場合)。必ずWHERE句を書きましょう。

Q2: 削除したデータを復元できますか?

通常は復元できません。バックアップがあれば復元可能です。重要なデータを削除する前には、必ずバックアップを取りましょう。

Q3: 物理削除と論理削除のどちらを使うべきですか?

重要なデータは論理削除をおすすめします。顧客情報や注文履歴など、後で参照する可能性があるデータは論理削除にして、テストデータや古いログは物理削除で問題ありません。

Q4: DELETEとDROPの違いは?

DELETEはデータを削除、DROPはテーブル自体を削除します。

  • DELETE:テーブルは残り、データだけ削除
  • DROP:テーブルごと削除(非常に危険!)

Q5: 削除したデータの件数を確認できますか?

はい。SQLiteではSELECT changes();で確認できます。削除前にSELECTでCOUNTしておくのも良い方法です。

Q6: 削除する前にバックアップを取る方法は?

SQLiteでは、データベースファイルをコピーするのが最も簡単です。また、削除対象のデータを別テーブルに退避する方法もあります:

※横にスクロールできます

-- 削除前にバックアップテーブルに退避 INSERT INTO 顧客バックアップ SELECT * FROM 顧客 WHERE 都道府県 = 'テスト県'; -- その後、削除 DELETE FROM 顧客 WHERE 都道府県 = 'テスト県';
📝

学習メモ

SQL基礎 - Step 14

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE