対象試験と出題頻度
DELETE文は、基本情報技術者・応用情報技術者で出題されるテーマです。
SQLのDML(データ操作言語)に分類される命令で、SELECT・INSERT・UPDATEとの役割の違いを正確に区別できるかが問われます。
詳細をクリックして確認
基本情報技術者
応用情報技術者
★★★★☆
ランクA(重要)必ず覚えておくべき
用語の定義
情報処理試験を勉強していると、「DELETE文ってUPDATEやDROPとどう違うの?」と混乱しがちです。
DELETE文(DELETE statement)とは、一言で言うと
「テーブル(表)から、条件に合致する行(レコード)を削除するSQLのDML命令」
のことです。
イメージとしては、「名簿から特定の人の行を消しゴムで消す操作」です。
名簿そのもの(テーブル)は残りますが、指定した行だけが消えます。名簿ごと捨てるのではなく、中身の一部を消す。これがDELETE文の役割です。
📊 DELETE文の基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | DELETE statement |
| SQLの分類 | DML(Data Manipulation Language:データ操作言語) |
| 操作対象 | テーブル内の行(レコード) |
| 混同しやすい命令 | DROP TABLE(テーブルそのものを破棄するDDL命令) |
解説
データベースを運用していると、不要になったデータを取り除く場面が必ず発生します。
退会した会員のレコード、期限切れの注文履歴など、「テーブルは残したまま、特定の行だけ消したい」という要求に応えるのがDELETE文です。
基本構文
DELETE文の構文は非常にシンプルで、覚えるべきパーツは「DELETE FROM」と「WHERE」の2つだけです。
【構文】DELETE文の基本形
DELETE FROM テーブル名 WHERE 削除条件;
WHERE句で「どの行を消すか」を指定します。ここだけは確実に押さえてください。WHERE句を省略するとテーブル内の全行が削除されます。
【例1】商品コードが’B020’の行を削除
DELETE FROM 商品 WHERE 商品コード = 'B020';
【例2】WHERE句なし → 全行削除
DELETE FROM 商品; -- テーブル定義は残るが、中身は空になる
図解:DELETE文の実行前後
具体的にテーブルがどう変化するか、視覚的に確認します。
▼ 実行前:商品テーブル
| 商品コード | 商品名 | 単価 |
|---|---|---|
| A010 | ノートPC | 80000 |
| B020 | マウス | 1500 |
| C030 | キーボード | 3000 |
赤い行が削除対象(商品コード = ‘B020’)
▼ 実行後:商品テーブル
| 商品コード | 商品名 | 単価 |
|---|---|---|
| A010 | ノートPC | 80000 |
| C030 | キーボード | 3000 |
B020の行だけが消え、テーブル構造はそのまま
DELETE文とDROP TABLE・TRUNCATEの違い
「行を消す」と「テーブルを消す」は根本的に異なります。混同しやすい3つの操作を整理します。
| 操作 | SQLの分類 | 何が消えるか | ロールバック |
|---|---|---|---|
| DELETE | DML | WHERE句で指定した行だけ | 可能 |
| TRUNCATE | DDL | 全行(テーブル構造は残る) | 不可 |
| DROP TABLE | DDL | テーブルごと完全に破棄 | 不可 |
DELETE文はDMLなのでトランザクション制御の対象になり、排他制御やロールバックが効きます。
一方、DROP TABLEやTRUNCATEはDDLであり、実行した時点で変更が確定します。
参照制約とON DELETE
外部キーで他のテーブルから参照されている行をDELETE文で消そうとすると、参照整合性が壊れる可能性があります。
この問題に対処するのが「ON DELETE」句です。
ON DELETE句の5つの参照動作
子テーブル(外部キーで参照している側)はどうなる?
| 指定する動作 | 子テーブルに起きること | 日常の例え |
|---|---|---|
| CASCADE | 対応する行も自動的に削除される | 本社が閉鎖 → 所属する社員の記録も全て抹消 |
| RESTRICT | 参照している行が1つでもあれば削除を即座に拒否 | 社員が残っている本社は閉鎖させない |
| NO ACTION | 処理の完了時に整合性を確認し、違反があれば拒否 | 閉鎖処理を進めた後、最終チェックで差し戻し |
| SET NULL | 対応する外部キーの値をNULLに変更 | 本社が閉鎖 → 社員の所属欄が「未定」に変わる |
| SET DEFAULT | 対応する外部キーの値をデフォルト値に変更 | 本社が閉鎖 → 社員の所属が自動的に「本部付」に変わる |
※ IPA試験で正解になるのは圧倒的にCASCADE。RESTRICT・NO ACTIONはひっかけ選択肢として登場する。
では、この用語が試験でどのように出題されるか見ていきましょう。
💡 DELETE文の核心を3行で
・テーブルから条件に合う行だけを削除するDML命令(テーブル構造は残る)
・WHERE句を省略すると全行が消える。DROP TABLEはテーブルごと破棄するDDLで別物
・外部キーで参照されている行を消す際はON DELETE句(CASCADE等)で動作が決まる
試験ではこう出る!
DELETE文は、FE・APの午前問題でDML操作の理解を問う形と、参照制約のON DELETE句を問う形の2パターンで繰り返し出題されています。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| FE H25秋 午前 問31 |
DELETE FROM 商品 WHERE 商品コード=’B020′ を実行するトランザクションがデッドロックで異常終了した後の表の状態を選ぶ問題。 | ・ロールバックにより表は実行前の状態に戻る ・DELETE文そのものの構文理解+トランザクションの原子性の複合出題 |
| AP H25春 午前 問30 |
A表の行を削除した際、参照しているB表の行も同時に削除する参照動作を選ぶ問題。 | ・正解は「CASCADE」 ・CONSTRAINT、NO ACTION、REFERENCESがひっかけ |
| AP R1秋 午前 問27 |
注文表の行を削除すると注文明細表の行も自動削除したい場合のON DELETE句を選ぶ問題。 | ・AP H25春 問30と同一構成の流用問題 ・R5春 問30でも再出題 |
| AP R7春 午前 問27 |
商品表の行を削除した際、受注表の対応行を自動削除するSQL文の空欄補充。 | ・正解は「CASCADE」 ・RESTRICT、SET DEFAULT、SET NULLとの区別が必要 |
📝 IPA試験での出題パターン
パターン1:「DELETE文+トランザクション」の複合問題
DELETE文を含むトランザクションが障害やデッドロックで異常終了した場合の表の状態を問う形式。DMLであるDELETE文はロールバック可能なので、異常終了時は実行前の状態に戻る。「削除が中途半端に残る」選択肢はすべて不正解。
パターン2:「ON DELETE句の参照動作を選べ」
親テーブルの行を削除したときに子テーブルの行を自動削除する動作(CASCADE)を選ばせる形式。APでは同じ構成の問題が繰り返し出題されている定番中の定番。CASCADEとRESTRICTの違いを押さえておけば得点できる。
試験ではここまででOKです。SET NULLやSET DEFAULTが正解になるパターンはほぼ出ていないので、深追いは不要です。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. SQLのDELETE文に関する記述として、最も適切なものはどれでしょうか?
- A. DELETE文はDML(データ操作言語)に分類され、WHERE句で条件を指定して特定の行を削除する。WHERE句を省略した場合は全行が削除されるが、テーブル定義は残る。
- B. DELETE文はDDL(データ定義言語)に分類され、テーブルの構造定義ごと完全に削除する。実行後はテーブル名そのものが消滅する。
- C. DELETE文はDML(データ操作言語)に分類されるが、トランザクション制御の対象外であるため、一度実行するとロールバックで元に戻すことはできない。
正解と解説を見る
正解:A
解説:
DELETE文はDMLに属し、テーブル内の行を条件付きで削除する命令です。WHERE句を付けなければ全行が削除対象になりますが、テーブルの定義自体は残ります。
選択肢BはDROP TABLE文の説明です。DROP TABLEはDDLに分類され、テーブルの構造定義ごと破棄します。DELETE文とは操作の対象もSQLの分類も異なります。選択肢Cは「ロールバックできない」としている点が誤りです。DELETE文はDMLであり、トランザクション制御の対象です。デッドロック等で異常終了した場合はロールバックによって実行前の状態に復元されます。
よくある質問(FAQ)
Q. DELETE文とTRUNCATE文はどちらも行を消しますが、実務ではどう使い分けますか?
TRUNCATE文は全行を一括で高速に削除する代わりに、WHERE句による条件指定ができず、ロールバックも効きません(多くのRDBMSではDDLとして扱われるため)。「テストデータを全部消してやり直したい」場面ではTRUNCATE、「特定の条件に合うレコードだけ消したい」「失敗時にロールバックしたい」場面ではDELETE文を使います。
Q. DELETE文で副問合せ(サブクエリ)は使えますか?
使えます。WHERE句の条件に副問合せを書くことで、別テーブルの情報を参照しながら削除対象を絞り込めます。例えば「在庫テーブルに存在しない商品を商品テーブルから削除する」場合、「DELETE FROM 商品 WHERE 商品コード NOT IN (SELECT 商品コード FROM 在庫)」のように記述します。FEの過去問(H26春 問28)ではNOT IN・NOT EXISTSを使った副問合せの出題実績があり、DELETE文の応用形として押さえておくと有利です。
Q. ON DELETE CASCADEを設定すると危険ではないですか?
確かに、親テーブルの1行を消すだけで子テーブルの大量の行が連鎖的に消えるリスクがあります。実務では安全のためにON DELETE RESTRICTやNO ACTION(参照先があれば削除を拒否)を設定し、アプリケーション側で明示的に子テーブルの行を先に削除するケースが多いです。CASCADEは「マスタデータの廃止に伴い関連データもまとめて整理したい」場面に限って使われる傾向にあります。
Q. DELETE文を実行してもディスク容量はすぐに空きますか?
多くのRDBMS(MySQL、PostgreSQL、Oracle等)では、DELETE文で行を削除しても物理的なディスク領域は即座には解放されません。削除された領域は「再利用可能な空き領域」として保持され、今後のINSERT等で再利用されます。物理的にディスクを回収したい場合は、ALTER TABLE(Oracle)やVACUUM(PostgreSQL)など製品固有のメンテナンスコマンドが必要です。ただし、IPA試験の範囲ではこの物理的な挙動は問われないので、試験対策としては深掘り不要です。