パソナについて
記事検索

deleteはさまざまなデータ削除が可能!SQL文つきでご紹介

この記事では代表的なdelete文を取り上げ、どのような削除方法があるか解説します。合わせてdelete文とよく比較される、truncate文との違いにも触れます。記事を読みながら、delete文の機能や便利さ、注意点を確認してください。

deleteはさまざまなデータ削除が可能!SQL文つきでご紹介

この記事では代表的なdelete文を取り上げ、どのような削除方法があるか解説します。合わせてdelete文とよく比較される、truncate文との違いにも触れます。記事を読みながら、delete文の機能や便利さ、注意点を確認してください。

スキルアップ

2023/01/26 UP

deleteはデータの削除を行なう、基本的なSQLの一つです。指定した行を削除することがおもな機能ですが、削除対象のデータはさまざまな方法で指定できます。

この記事では代表的なdelete文を取り上げ、どのような削除方法があるか解説します。合わせてdelete文とよく比較される、truncate文との違いにも触れます。記事を読みながら、delete文の機能や便利さ、注意点を確認してください。

SQLのdelete文とはなにか?

まずはdelete文がどのような特徴を持つのか、概要を確認していきましょう。類似のSQL文として使われる「truncate」との違いも解説していきます。

条件に合った行を削除する

delete文は指定された表を参照し、条件に合致した行を削除するSQL文です。該当する行が複数ある場合は、すべて削除されます。また条件を指定しない場合は、表に格納されたすべてのデータが削除されます。

delete文の実行により、データ量を減らすことが可能です。なお全件削除しても、表の枠組みは残ります。表そのものの削除は、drop table文で行ないます。

truncate文との相違点

データの削除には、truncate文も使われます。delete文とtruncate文には、重要な相違点があることに注意が必要です。

delete文は、トランザクションログに記録しながらデータを削除します。大量のデータ削除では時間がかかる一方、誤って削除した場合でもコミットする前であればロールバックで戻せます。またdelete文では、データの一部を削除することも可能です。

truncate文は、データの削除内容をトランザクションに記録しません。大量のデータがある場合でも迅速に削除できますが、一度実行するともとに戻せません。またデータの一部削除に対応していないことにも注意が必要です。

delete文の使い方はデータベースにより異なる場合がある

delete文の文法は、RDBMS(リレーショナルデータベース管理システム)やバージョンによって異なる場合があります。エラーの発生や意図しない動作を招かないためにも、事前にお使いのRDBMSやバージョンを確認し、マニュアルを参照しておくとトラブルを防止できるためおすすめです。

基本的なdelete文の使い方

ここからはMySQL8.0を用いて、基本的なdelete文の使い方を解説します。説明には、以下の「社員」表を利用します。

社員番号 氏名
3640104 東海富士郎
4010199 田巻次郎
4100431 里岡知花
5030208 武田柔一

表のデータをすべて削除するケースと一部だけを削除するケースについて、どのようなdelete文になるか確認していきましょう。

なお記事に書かれたdelete文を順に実行し動作を確認したい方は、実行前に

BEGIN;

delete文の実行後に

ROLLBACK;

を実行することで、スムーズに操作を進められます。

表のデータをすべて削除する

表のデータをすべて削除したい場合は、「delete from (表の名前)」で実現できます。さきほど紹介した表のデータを全件削除するSQL文は、以下のとおりです。

DELETE FROM 社員;

実行後に「社員」表の内容を検索しても、データは1件も表示されません。RDBMSや使用するツールによっては、「表示される結果がありません」という趣旨の表記となる場合もあります。

条件に合った行を削除する

delete文は、データの一部を削除するケースで使われることが多いでしょう。削除する条件は、where句で指定できます。ここでは社員番号が3640104の方を削除してみましょう。

DELETE FROM 社員 WHERE 社員番号=3640104;

以下のとおり、「社員」表の行数が4行から3行に減りました。

社員番号 氏名
4010199 田巻次郎
4100431 里岡知花
5030208 武田柔一

where句で定める条件には、不等号も使えます。社員番号が5000000以下の方を削除するdelete文を、以下に示しました。

DELETE FROM 社員 WHERE 社員番号<=5000000;

実行した結果、社員番号5030208のデータだけが残りました。

社員番号 氏名
5030208 武田柔一

実務に役立つdelete文の使い方をご紹介

delete文は構文を工夫することで、少ない手間で消したいデータを削除できることが魅力です。実務に役立つ4つの方法を確認していきましょう。

ここからは「社員」表に加えて、「人事評価」表と「過去の社員」表も使います。「人事評価」表の内容は、以下のとおりです。

社員番号 年度 評価
3640104 2022 C
4010199 2022 C
4100431 2022 B
5030208 2022 A
5120704 2022 D

また「過去の社員」表の内容は、以下のとおりとなります。

社員番号 氏名
2130505 串川与左衛門
3640104 東海富士郎
5120704 木村和香

削除対象のデータをselect文で指定する

削除対象となるデータを数値や文字列で示す代わりに、select文を使って指定することもできます。ここでは「人事評価」表と「社員」表を突き合わせ、「社員」表に存在しない社員番号のデータを「人事評価」表から削除するdelete文を使います。

DELETE FROM 人事評価 WHERE 社員番号 NOT IN (SELECT 社員番号 FROM 社員);

実行した結果、「人事評価」表から社員番号5120704のデータが1行削除されました。

社員番号 年度 評価
3640104 2022 C
4010199 2022 C
4100431 2022 B
5030208 2022 A

前方一致や後方一致で条件を指定し削除する

削除する条件には、前方一致や後方一致も使えます。ここでは後方一致の例として、氏名が「郎」で終わる方を「社員」表から削除するdelete文を使います。

DELETE FROM 社員 WHERE 氏名 LIKE '%郎';

「LIKE '%郎'」の部分で、最後が「郎」で終わることを示しています。そのため氏名が「郎」で終わる方は、上で示したdelete文の削除対象となるわけです。

実行した結果「東海富士郎」さんと「田巻次郎」さんのデータが削除され、「社員」表のデータは2行となりました。

社員番号 氏名
4100431 里岡知花
5030208 武田柔一

下位や上位のデータを削除する

delete文では最大値や最小値など、下位や上位のデータを削除することも可能です。ここでは「過去の社員」表から、最も若い社員番号の方を削除するdelete文を示しました。

DELETE FROM 過去の社員 ORDER BY 社員番号 ASC LIMIT 1;

このdelete文では社員番号を昇順に並べたのち、最小の社員番号を持つデータを1行削除します。「LIMIT」に続く数字を2に変えると、小さいほうから2番目までのデータが削除されます。また「ASC」を「DESC」に変えると、最大の社員番号を持つデータが削除されます。

実行した結果、社員番号2130505のデータが1行削除されました。

社員番号 氏名
3640104 東海富士郎
5120704 木村和香

重複するデータを削除する

社員が退職し「社員」表からデータを「過去の社員」に転記したあとは、該当する社員を「社員」表から削除された状態にしておく必要があります。この業務が正しく行なえていないと、両方の表にデータが存在する状態になってしまいます。

JOINを使ってdelete文を実行することにより、重複するデータを削除できます。以下のSQL文は、「過去の社員」表に存在する方を「社員」表から削除するdelete文です。

DELETE 社員 FROM 社員 INNER JOIN 過去の社員 WHERE 社員.社員番号 = 過去の社員.社員番号;

両方の表に存在する社員番号3640104の方が、「社員」表から削除されました。

社員番号 氏名
4010199 田巻次郎
4100431 里岡知花
5030208 武田柔一

delete文を使ううえでの注意点

delete文にはさまざまな削除方法が用意されていますが、なんでも削除できる万能のSQL文ではありません。またデータを削除するため、注意しなければならない点もあります。ここからは4つの項目を取り上げ、注意すべきポイントを確認していきましょう。

特定のフィールドだけを削除することはできない

delete文は、該当する行をまるごと削除する用途で使われるSQL文です。一方で、特定のフィールドだけを削除することはできません。例えば「該当する行のうち、一部の列に格納されたデータだけを削除したい」といった用途では使えません。

もし該当するフィールドがNULLを許可している場合は、update文を活用してフィールドの値をNULLにアップデートする方法が考えられます。

列の削除には使えない

delete文は行の削除には使える一方で、列を削る用途には使えません。この操作は、ALTER TABLE文に「DROP COLUMN (削除する列名)」をつけることで行なえます。

ただし列を削除する場合は、十分な検討と細心の注意が必要です。なぜなら列を削除した結果、以下の不都合が生じるおそれがあるためです。

・他の表やビューからデータを参照できなくなり、正しいデータを保存できなくなる

・プログラムからデータを参照できなくなり、動作に支障が生じる

このような悪影響を防ぐため、事前に表やビューとの関連性を調査しましょう。もし削除対象の列を参照していることがわかった場合は、削除を中止するか適切な対応を行ない、データやプログラムに影響を与えないよう準備を進めてください。

意図するデータを正しく削除できるか要確認

delete文は、登録済みのデータを消去するSQL文です。今まであったデータがなくなってしまうわけですから、消すべきでないデータを誤って消去してしまうと大きなトラブルに発展しかねません。

不都合な事態を防ぐためには、事前に意図するデータを正しく削除できるか確認する方法が有効です。where句で条件を指定する場合は事前にselect文でチェックし、抽出されるデータが意図どおりか事前にチェックしましょう。また可能な範囲で条件をつけることで、消してはいけないデータを消すリスクを下げられます。

削除するデータが他の箇所で参照されていないか十分チェックを

データの削除後、システムにトラブルが起きる場合があります。削除したデータが別の表やビューから参照されているケースは、代表的な例の一つです。削除する際にはデータが他の箇所から参照されていないか、十分にチェックしましょう。

実務ではデータを削除する代わりに、表に「削除フラグ」列を用意する方法も使われます。削除フラグの値を変えることで「使用中」「削除済み」といった設定ができ、「データ自体は残っているがシステム上は削除したことになっている」という扱いができます。

この方法はマスターデータなど、過去のデータを参照する場合がある、削除の影響範囲が大きいデータでよく用いられます。データを削除する場合は、削除フラグの利用もご検討ください。

特徴と注意点を理解したうえでdelete文の活用を

delete文は、さまざまなデータの削除方法を持っています。一方で対象となる表や条件の指定を誤ると、データやシステムに不具合を生じさせるリスクもあります。このため、慎重な操作が必要です。

削除する前には意図どおりの動作をするか、事前に確認しておきましょう。select文で事前にチェックする、削除範囲をできるだけ絞る方法は、操作ミスを防ぐうえで有効です。delete文の特徴と注意点を理解したうえで、安全に活用しましょう。