このページでは、ORACLEデータベースで、表のデータを削除するSQL、DELETE文について紹介します。
DELETE文の基本構文に加えて、たくさんのサンプルを掲載していますのでぜひ参考にしてください。
SQLとは何か?どんな種類があるか基礎的な内容については↓で詳しく解説していますので参考にしてください。
>>【初心者向け】SQLとは?基礎から分かりやすく解説
DELETE文の基本構文
DELETE文の基本構文は次の通りです。
WHERE条件を付けることで、削除するデータを選択するし絞ることが出来ます。
DELETE FROM テーブル名 [WHERE 条件];
具体的なSQLは、サンプルで詳しく解説していきます。
DELETE文のSQLサンプル
ここからはパターンごとにSQLのサンプルを使って解説していきます。
1.全件データをDELETEする方法
DELETE文では、テーブルに登録されているデータの全件を一括削除することが出来ます。
次のサンプルでは、tab1というテーブルのレコードを全て削除しています。WHERE条件をつけないと全件削除になります。
DELETE FROM tab1;
2.カラムの値が条件に一致したレコードのみDELETEする方法
DELETE文では、WHERE句に条件をつけることで、条件に一致するレコードだけを削除することが出来ます。
◆列の値を指定する
次のサンプルでは、tab1というテーブルのデータのうち、co1列の値が’001’という値のデータだけを削除します。
DELETE FROM tab1 WHERE col1 = '001';
◆列の複数の値を条件に指定する
INやORの条件を使うことで、複数の値を条件に付けることが出来ます。サンプルでは、col1の値が001,002,003のデータを削除しています。
DELETE FROM tab1 WHERE col1 in ('001','002','003');
DELETE FROM tab1 WHERE col1 = '001' OR col1 = '002' OR col1 = '003';
◆列の値の範囲を指定する
AND条件やBETWEENを使うことで、列の値の範囲を指定してレコードを削除することができます。サンプルでは、col2の値が100から500のレコードを削除しています。
DELETE FROM tab1 WHERE col2 >= 100 AND col2 <= 500;
DELETE FROM tab1 WHERE BETWEEN col2 100 AND 500;
3.JOINを使ってDELETEする方法
DELETE文では、JOINを使えるケースと使えないケースがあります。
◆JOINが使えないケース
削除するテーブルを指定しているFROM句の後ろではJOINは使えません。エラーになります。
DELETE FROM tab1 INNER JOIN tab2 ON ol1 = col1;
◆JOINが使えるケース
例えば、WHERE句でEXISTSや副問合せを行ったときには使えます。ただし、EXISTSや副問合せの範囲内でのみ使用することが出来ます。
DELETE FROM tab1 a
WHERE a.col1 in (SELECT b.col1 FROM tab2 b INNER JOIN tab3 ON col1 = col1);
4.EXISTSを使ってDELETEする方法
DELETE文では、EXISTSを使った条件をつけてレコードを削除することが出来ます。
◆EXISTSを使う
WHERE句にEXISTSの条件を記述します。サンプルでは、tab2のテーブルにcol1の値が一致するレコードがあれば、削除します。
DELETE FROM tab1 a
WHERE EXISTS (SELECT 'x' FROM tab2 b WHERE b.col1 = a.col1);
◆NOT EXISTSを使う
EXISTSと同様にして、NOT EXISTSを使うこともできます。サンプルでは、tab2のテーブルにcol1の値が一致するレコードがなければ、削除します。
DELETE FROM tab1 a
WHERE NOT EXISTS (SELECT 'x' FROM tab2 b WHERE b.col1 = a.col1);
5.件数指定してDELETEする方法
LIMITやROWNUMを使うことで、最大何件のレコードを削除するか件数を指定して、DELETEすることが出来ます。
◆LIMITを使う
LIMITは指定したテーブルの取得結果の上から順に、指定した件数までのレコードを削除します。サンプルでは、ORDERBYで並び替えた順番の上から順に1,000件までのデータを削除します。
DELETE FROM tab1 ORDER BY col1 LIMIT 1000;
◆ROWNUMを使う
とにかくランダムでもいいから指定した件数を削除したい場合にはROWNUMでOKです。
DELETE FROM tab1 WHERE ROWNUM <= 1000;
ROWNUMは、データをSELECTしたときの並び順で割り振られる番号です。とても簡単に言うとランダムに割り振られるようなものです。
ROWNUMはORDEREBYよりも先に評価されるので、ORDER BYしたからと言って、上から1000件というような指定にはなりません。
テストデータで、どのデータでもいいから削除したい場合には有効が、削除するとまずい大事なデータがある場合は、他の条件を使ってきちんと削除することをおすすめします。
6.複数の表のレコードを同時にDELETEする方法
結論から言うと、ORACLEでは、複数のテーブルのレコードを1つのSQLで同時にDELETEする方法はありません。
ただし、複数の表のレコードを同時に削除することは可能です。
もう少し詳しくいうと、削除の確定タイミングを同期させることが可能です。
例えば、
1.A表のレコードを削除
2.B表のレコードを削除
3.トランザクションをコミット
とすることで、1と2のレコードの削除を確定するタイミングを合わせることが出来ます。
つまり、複数の表のレコードを同時に削除しています。
ORACLEはデフォルト設定では、明示的にコミットしない限り、DELETE文は確定されないので、COMMITのタイミングを合わせることで同時削除を実現できます。
7.DELETE文のFROM句の省略する方法
DELETE文のFROM句は省略できます。
省略した形は次のとおりです。
DELETE tab1 WHERE ROWNUM <= 1000;
ただし、FROM句を省略できるのは、ORACLEデータベースだけです。
SQL標準的にはFROM句の省略はできません。MySQLやPostgres、SQLiteを使う場合やデータベースのリプレイスの場合は要注意です。
8.DELETEとTRUNCATEの違い
DELETE文と似たようなSQLでTRUNCATEというものがあります。
TRUNCATEは次のように使います。
TRUNCATE TABLE tab1;
TRUNCATEがDELETEと違うところは主に3つあります。
1.一括削除しかできない
TRUNCATE文は、WHEREなどの条件を指定する機能はありません。テーブルのレコードを全件削除する機能のみに絞られています。
2.ロールバックできない
DELETE文やINSERT、UPDATEはコミットするまでの間、レコードの更新した情報をログとして保持しています。
ただし、TRUNCATEはレコードを更新した情報を保持しないので、ロールバックすることが出来ません。
つまり、データを削除したら取り返しがつかないということです。
3.DELETE文よりも処理時間が速い
「2.ロールバックできない」の理由に合った、更新した情報を保持しないという特性があり、DELETE文よりもいろいろな処理が省略されます。
結果的に、DELETE文よりも高速にデータを削除することが出来ます。
以上の特性があるので、TRUNCATEは夜間バッチでデータを一括で削除するときやテストデータの入れ替えのタイミングなどで使うことが多いです。
まとめ
DELETE文を使うことで、レコードを削除することが出来ます。
DELETE文の他にも、SELECT文やINSERT文、UPDATE文といったSQLがあり、データの検索や追加、更新を行うことが出来ます。
具体的な書き方や使い方については、↓で詳しく解説していますのでぜひ参考にしてください。
・データの検索:【SQL】SELECT文の書き方:サンプル多数あり
・データの追加:【SQL】INSERT文の書き方:サンプル多数あり
・データの更新:【SQL】UPDATE文の書き方:サンプル多数あり