🗑️ Step 14: データの削除(DELETE)
不要なデータを安全に削除しよう!
- DELETE文でデータを削除する基本
- WHERE句で削除対象を指定する(超重要!)
- 全削除の危険性と防止策
- 安全に削除する手順
- 物理削除と論理削除の違い
- 実務でよく使う削除パターン
🎯 1. DELETE文とは?
1-1. データベースからデータを削除する
これまで、データを追加(INSERT)、更新(UPDATE)してきました。
最後に学ぶのは、データを削除(DELETE)する方法です。
- 退会した顧客を削除する
- 販売終了した商品を削除する
- 古い注文データを削除する
- テストデータを削除する
- 間違って入力したデータを削除する
そんなときに使うのがDELETE文です!
DELETE文は、データを完全に削除します。
一度削除したデータは元に戻せません(バックアップがない場合)。
UPDATE文以上に慎重に使いましょう!
1-2. DELETE文の基本構文
DELETE FROM テーブル名 WHERE 条件;
| 部分 | 意味 | なぜ必要? |
|---|---|---|
DELETE FROM テーブル名 |
どのテーブルからデータを削除するか | 削除先を指定するため |
WHERE 条件 |
どの行を削除するか | 削除対象を絞り込むため(超重要!) |
UPDATE文にはSET句がありましたが、DELETE文にはありません。
DELETE文は行ごと削除するので、「どの列を」という指定は不要です。
1-3. 練習用データの確認
Step 13で使ったテーブルをそのまま使います。
| 顧客ID | 顧客名 | メール | 都道府県 |
|---|---|---|---|
| 1 | 田中太郎 | tanaka_new@example.com | 東京都 |
| 2 | 佐藤花子 | sato_new@example.com | 京都府 |
| 3 | 鈴木次郎 | suzuki@example.com | 神奈川県 |
| 4 | 高橋美咲 | takahashi@example.com | 福岡県 |
| 5 | 山田三郎 | yamada@example.com | 東京都 |
| 商品ID | 商品名 | 価格 | カテゴリ | 在庫数 |
|---|---|---|---|---|
| 101 | りんご | 180 | 果物 | 50 |
| 102 | みかん | 130 | 高級果物 | 100 |
| 103 | バナナ | 120 | 果物 | 50 |
| 104 | オレンジジュース | 160 | 飲料 | 25 |
| 105 | お茶 | 120 | 飲料 | 5 |
練習用にテストデータを追加しましょう。
※横にスクロールできます
🗑️ 2. 基本的なDELETE
2-1. 1行だけ削除する
テスト太郎さん(顧客ID: 6)を削除してみましょう。
安全な手順1:まずSELECTで確認
※横にスクロールできます
| 顧客ID | 顧客名 | メール | 都道府県 |
|---|---|---|---|
| 6 | テスト太郎 | test1@example.com | テスト県 |
✅ 対象が1人だけであることを確認!
安全な手順2:DELETEを実行
※横にスクロールできます
| 部分 | 意味 |
|---|---|
DELETE FROM 顧客 |
顧客テーブルからデータを削除する |
WHERE 顧客ID = 6 |
顧客IDが6の人だけ(テスト太郎さん) |
安全な手順3:削除後を確認
※横にスクロールできます
結果:(0件)
✅ データが完全に削除されました!
2-2. 商品を削除する
テスト商品A(商品ID: 106)を削除してみましょう。
※横にスクロールできます
確認してみましょう。
※横にスクロールできます
結果:(0件)
テスト商品Aは削除されました。
- SELECTで削除対象を確認
- DELETEを実行
- もう一度SELECTで削除を確認
この手順を必ず守りましょう!
🎯 3. WHERE句で削除対象を絞り込む
3-1. 様々な条件で絞り込む
WHERE句を使って、削除する行を細かく指定できます。SELECTやUPDATEのWHERE句と同じ書き方です。
3-2. 都道府県で絞り込む
「テスト県」の顧客を全て削除してみましょう。
まずSELECTで確認:
※横にスクロールできます
| 顧客ID | 顧客名 | メール | 都道府県 |
|---|---|---|---|
| 7 | テスト花子 | test2@example.com | テスト県 |
✅ 1人が対象であることを確認(テスト太郎は既に削除済み)
DELETEを実行:
※横にスクロールできます
3-3. 価格で絞り込む
50円未満の商品を削除してみましょう。
まずSELECTで確認:
※横にスクロールできます
| 商品ID | 商品名 | 価格 | カテゴリ | 在庫数 |
|---|---|---|---|---|
| 107 | テスト商品B | 30 | テスト | 0 |
✅ 1件が対象
DELETEを実行:
※横にスクロールできます
3-4. NULLを条件にする
メールアドレスが未登録(NULL)の顧客を削除してみましょう。
※横にスクロールできます
NULLかどうかを確認するには= NULLではなくIS NULLを使います。
これはSELECT文やUPDATE文と同じルールです。
3-5. 複数条件での絞り込み(AND)
「テスト」カテゴリで、在庫が0の商品を削除してみましょう。
※横にスクロールできます
両方の条件を満たす行だけが削除されます。
「テスト」カテゴリだけど在庫が1以上 → 削除されない
在庫が0だけど「果物」カテゴリ → 削除されない
3-6. IN演算子を使った削除
特定の商品IDを一括で削除できます。
※横にスクロールできます
複数の値を一度に指定できます。
WHERE 商品ID = 106 OR 商品ID = 107 OR 商品ID = 108と同じ意味ですが、INの方が簡潔です。
🚨 4. 全削除の危険性
4-1. WHERE句なし = 全データ削除!
WHERE句を書かないと、テーブルの全てのデータが削除されてしまいます。
※横にスクロールできます
WHERE句がないので、全ての顧客データが削除されます!
田中さんも、佐藤さんも、鈴木さんも、全員消えてしまいます…
4-2. UPDATE文との危険度の比較
| 操作 | WHERE句なしの結果 | 復旧の可能性 |
|---|---|---|
| UPDATE | 全行が同じ値に更新される | 元の値が分かれば復旧可能 |
| DELETE | 全データが消える | バックアップがないと復旧不可能 |
DELETE文の方がはるかに危険です!
4-3. 全削除を防ぐ5つの対策
- 必ずWHERE句を書く習慣をつける
- 削除前にSELECT文で確認する
- COUNT(*)で件数を確認する
- 重要な操作はバックアップを取ってから行う
- 本番環境では権限を制限する
4-4. 削除前の件数確認
削除前に「何件削除されるか」を確認しましょう。
ステップ1:件数を確認
※横にスクロールできます
結果:2
2件が削除対象であることを確認
ステップ2:対象データを確認
※横にスクロールできます
ステップ3:問題なければDELETEを実行
※横にスクロールできます
SQLiteでは、削除した件数を以下のSQLで確認できます。
※横にスクロールできます
このSQLは、直前のDELETE(またはUPDATE、INSERT)で影響を受けた行数を返します。
🛡️ 5. 安全な削除の手順
5-1. 5ステップで安全に削除
DELETE文は危険なので、以下の手順を必ず守りましょう。
- SELECT文で対象を確認する
- COUNT(*)で件数を確認する
- 件数が想定と合っているか確認する
- DELETE文を実行する
- 再度SELECT文で削除を確認する
5-2. 実践例:安全な削除手順
「サンプル」カテゴリの商品を削除する例を見てみましょう。
ステップ1:SELECTで対象を確認
※横にスクロールできます
| 商品ID | 商品名 | 価格 | カテゴリ | 在庫数 |
|---|---|---|---|---|
| 108 | サンプル商品 | 80 | サンプル | 10 |
✅ 削除対象の内容を確認
ステップ2:件数を確認
※横にスクロールできます
結果:1
✅ 1件だけが対象であることを確認
ステップ3:想定と合っているか確認
「サンプルカテゴリの商品は1件だけ」→ 想定通り!
ステップ4:DELETEを実行
※横にスクロールできます
ステップ5:削除を確認
※横にスクロールできます
結果:(0件)
✅ 正しく削除されました!
📋 6. 物理削除と論理削除
6-1. 2つの削除方法
実務では、データを完全に削除せず、「削除済み」フラグをつける方法がよく使われます。
| 方法 | 説明 | 使うSQL |
|---|---|---|
| 物理削除 | データを完全に削除する | DELETE文 |
| 論理削除 | 削除フラグを立てる(データは残る) | UPDATE文 |
6-2. 物理削除(DELETE)
データベースからデータを完全に削除します。
※横にスクロールできます
データベースから完全に消えます。
SELECTで検索しても、何も表示されません。
6-3. 論理削除(UPDATE)
「削除フラグ」を立てるだけで、データは残します。
まず、削除フラグ用の列を追加したテーブルを想定します。
| 列名 | 型 | 説明 |
|---|---|---|
| 顧客ID | INTEGER | 主キー |
| 顧客名 | TEXT | 顧客の名前 |
| 削除フラグ | INTEGER | 0=有効、1=削除済み |
| 削除日時 | TEXT | 削除した日時 |
※横にスクロールできます
データは残っていますが、「削除フラグ = 1」になります。
通常の検索では表示しないようにします。
論理削除されていないデータだけを取得するには:
※横にスクロールできます
6-4. 物理削除と論理削除の比較
- 復元可能:誤削除しても元に戻せる
- 履歴保持:過去のデータを参照できる
- 監査対応:いつ誰が削除したか記録できる
- 安全:データが消えるリスクが低い
- 容量増加:データが増え続ける
- 複雑化:クエリに常に条件が必要
- パフォーマンス:データ量が多いと遅くなる
- 一意制約:同じメールアドレスで再登録できない問題
6-5. どちらを使うべき?
| データの種類 | 推奨 | 理由 |
|---|---|---|
| 顧客データ | 論理削除 | 注文履歴との整合性、復元の可能性 |
| 注文データ | 論理削除 | 売上分析、監査対応 |
| テストデータ | 物理削除 | 不要なデータは完全に消す |
| 古いログ | 物理削除 | 容量節約 |
| 一時データ | 物理削除 | 不要になったら完全削除 |
💼 7. 実務でよく使う削除パターン
7-1. 古いデータの削除
1年以上前のログデータを削除する例です。
※横にスクロールできます
| 部分 | 意味 |
|---|---|
date('now', '-1 year') |
今日から1年前の日付 |
作成日 < ... |
それより前(古い)データ |
7-2. テストデータの一括削除
メールアドレスに「@test.example.com」を含む顧客を削除する例です。
※横にスクロールできます
商品名が「テスト」で始まる商品を削除する例です。
※横にスクロールできます
7-3. 在庫切れ商品の削除
在庫が0で、30日以上更新がない商品を削除する例です。
※横にスクロールできます
7-4. IN演算子を使った一括削除
特定のIDリストに含まれるデータを一括削除する例です。
※横にスクロールできます
7-5. 条件に合わないデータの削除(NOT IN)
一度も注文されていない商品を削除する例です(注文テーブルがある前提)。
※横にスクロールできます
SELECT DISTINCT 商品ID FROM 注文:注文されたことがある商品IDの一覧NOT IN (...):その一覧に含まれない商品ID- つまり、一度も注文されていない商品を削除
- 定期クリーンアップ:古いログ、一時データの削除
- テスト後の掃除:テストデータの削除
- 在庫管理:販売終了商品の削除
- 顧客管理:退会顧客の削除(または論理削除)
📝 Step 14 のまとめ
| 学んだこと | 内容 |
|---|---|
| DELETE文 | データを完全に削除する |
| WHERE句 | 削除対象を絞り込む(超重要!) |
| 全削除の危険性 | WHERE句なしは全データ削除 |
| 安全な削除手順 | SELECT確認→COUNT確認→DELETE→再確認 |
| 物理削除と論理削除 | 完全削除 vs フラグで削除済みにする |
-- 基本形 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件の削除
顧客テーブルから、顧客IDが999の顧客を削除してください。
※横にスクロールできます
解説:WHERE句で対象を1人に絞り込んでから削除します。
商品の削除
商品テーブルから、商品IDが999の商品を削除してください。
※横にスクロールできます
解説:主キーで1件だけを削除します。
条件での削除
商品テーブルから、価格が100円未満の商品を全て削除してください。
※横にスクロールできます
解説:WHERE句で条件を指定して、複数行を削除できます。
NULLのデータ削除
顧客テーブルから、メールがNULLの顧客を全て削除してください。
※横にスクロールできます
解説:NULLのチェックはIS NULLを使います。= NULLではありません。
複数条件での削除
商品テーブルから、カテゴリが'テスト'で、かつ在庫数が0の商品を削除してください。
※横にスクロールできます
解説:ANDで複数の条件を組み合わせます。両方の条件を満たす行だけが削除されます。
IN演算子での削除
商品テーブルから、商品IDが901, 902, 903の商品を一括で削除してください。
※横にスクロールできます
解説:IN演算子で複数の値を指定できます。
LIKE演算子での削除
商品テーブルから、商品名が「テスト」で始まる商品を全て削除してください。
※横にスクロールできます
解説:LIKE演算子の%は「任意の文字列」を意味します。テスト%は「テストで始まる」という意味です。
削除前の確認手順
顧客テーブルから都道府県が'テスト県'の顧客を削除する前に、対象件数を確認するSQLを書いてください。
※横にスクロールできます
解説:削除前にSELECTで対象を確認し、COUNT(*)で件数を確認します。これが安全な削除の手順です。
論理削除のSQL
顧客テーブルに削除フラグ列があると仮定して、顧客IDが999の顧客を論理削除するSQLを書いてください(削除フラグを1に設定)。
※横にスクロールできます
解説:論理削除はDELETEではなくUPDATEを使います。データは残りますが、削除済みとして扱われます。
有効なデータだけを取得
削除フラグが0(有効)の顧客だけを取得するSQLを書いてください。
※横にスクロールできます
解説:論理削除を使う場合、SELECTに常にこの条件を追加する必要があります。
❓ よくある質問
Q1: WHERE句を書き忘れたらどうなりますか?
全てのデータが削除されます!これは非常に危険で、元に戻すことはできません(バックアップがない場合)。必ずWHERE句を書きましょう。
Q2: 削除したデータを復元できますか?
通常は復元できません。バックアップがあれば復元可能です。重要なデータを削除する前には、必ずバックアップを取りましょう。
Q3: 物理削除と論理削除のどちらを使うべきですか?
重要なデータは論理削除をおすすめします。顧客情報や注文履歴など、後で参照する可能性があるデータは論理削除にして、テストデータや古いログは物理削除で問題ありません。
Q4: DELETEとDROPの違いは?
DELETEはデータを削除、DROPはテーブル自体を削除します。
- DELETE:テーブルは残り、データだけ削除
- DROP:テーブルごと削除(非常に危険!)
Q5: 削除したデータの件数を確認できますか?
はい。SQLiteではSELECT changes();で確認できます。削除前にSELECTでCOUNTしておくのも良い方法です。
Q6: 削除する前にバックアップを取る方法は?
SQLiteでは、データベースファイルをコピーするのが最も簡単です。また、削除対象のデータを別テーブルに退避する方法もあります:
※横にスクロールできます
学習メモ
SQL基礎 - Step 14