【SQL】データ削除「DELETE文」の使い方。全件削除・複数テーブル参照も解説

  • 2024.07.26
       
【SQL】データ削除「DELETE文」の使い方。全件削除・複数テーブル参照も解説

DELETE文はデータを削除するときに用いられる、SQLの代表的なクエリ(命令)の一つです。

本記事ではDELETE文の概要から解説します。また、比較されることの多い「TRUNCATE文」との違いについても併せて紹介するので今後のSQL学習の参考にしてください。

DELETE文とは

SQLの「DELETE」とは、データを削除するクエリです。条件を指定しなければ、テーブル内のレコードがすべて削除されますが、WHERE句を併用すれば条件を満たすレコード(行)のみを削除することもできます。

DELETE文は条件にあてはまるレコード(行)を削除する

DELETE文は、指定されたテーブルを参照し、指定された条件に合致するレコード(行)を削除します。該当するレコードが複数ある場合は、そのレコードがすべて削除されます。また条件を指定しない場合は、テーブルのデータがすべて削除されます。なお、データを全件削除しても、テーブルの枠組み自体は残ります。テーブル自体を削除するには、DROP TABLE文を使います。

DELETE文の文法・使い方はデータベースによって異なる

DELETE文の文法は、RDBMS(リレーショナルデータベース管理システム)やデータベースのバージョンによっても異なる場合があります。エラーや意図しない動作を招きかねないので事前に使用するRDBMSやバージョンを把握し、使い方を調べておく必要があります。

DELETE文の使い方

基本構文

【全レコードの削除】

テーブルに格納されたすべてのレコードを削除する場合は次の構文になります。

DELETE FROM テーブル名;

【削除するレコードの条件を指定する】

削除するレコードの条件を指定する場合は次の構文になります。WHERE句は、SELECT文やUPDATE文だけでなくDELETE文にも使用できます。

DELETE FROM テーブル名 WHERE 条件;

DELETE文の動作を確認する場合は実行前に

BEGIN;

DELETE文の実行後に

ROLLBACK;

を記述することで、ロールバックできます。

あなたのご希望に沿った案件が必ず見つかります
【フリーランス向け】高収入好待遇の案件をご紹介

TECH MANIA フリーランス

≫まずは簡単60秒で無料お問い合わせから≪

サンプルテーブル

「DELETE」文の具体的な使い方を解説していくにあたって、サンプルとして「生徒(student)」テーブルと「テスト(test)」を用意しました。

「生徒(student)」テーブル

氏名(name)クラス(class)学籍番号(student_no)
秋山A997
久保田A998
佐々木B999
佐藤B1000
鈴木B1001
田中C1002
土屋C1003

「テスト(test)」テーブル

ID(id)英語(en)数学(ma)国語(ja)
997807090
998100100100
1000858085
1001754040
1002606535
1003909590

テーブルのデータをすべて削除する

テーブルに含まれるデータすべてを削除する場合は次のように「DELETE FROM テーブル名」と記述します。なお、データを全件削除しても、テーブルの枠組み自体は残ります。

【実行コード】

DELETE FROM student;

実行後は「生徒」テーブルのデータを検索しても、表示されないか「表示される結果がありません」という結果が出ます。

条件にあてはまるレコード(行)を削除する

DELETE文は、データの一部を削除する場合が多いでしょう。条件は、WHERE句で指定できます。ここでは「生徒」テーブルのうち、Aクラスの生徒を消してみます。

【実行コード】

DELETE FROM student WHERE class=A;

【実行結果】

氏名(name)クラス(class)学籍番号(student_no)
佐々木B999
佐藤B1000
鈴木B1001
田中C1002
土屋C1003

WHERE句は不等号も使えます。IDが1000以上の生徒を削除してみます。

【実行コード】

DELETE FROM student WHERE student_no>=1000;

【実行結果】

氏名(name)クラス(class)学籍番号(student_no)
秋山A997
久保田A998
佐々木B999

削除するデータをSELECT文で指定する

削除するデータを数値や文字列で示すこともできますが、SERECT文でも指定可能です。ここでは「生徒」テーブルと「テスト」テーブルからテストを受けていない生徒を「生徒」テーブルから削除します。

【実行コード】

DELETE FROM student WHERE ID NOT IN (SELECT id FROM test);

【実行結果】

氏名(name)クラス(class)学籍番号(student_no)
秋山A997
久保田A998
佐藤B1000
鈴木B1001
田中C1002
土屋C1003

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

DELETE文は「ORDER BY」句を使うことで最大値や最小値など、上位または下位のデータを削除できます。

IDが1000以上の生徒を削除する場合は以下のようなコードになります。

【実行コード】

DELETE FROM student WHERE 1000 < student_no ORDER BY student_no;

【実行結果】

氏名(name)クラス(class)学籍番号(student_no)
秋山A997
久保田A998
佐々木B999

※IDが主キーの場合は、初期状態でIDは昇順で並ぶため、厳密には「ORDER BY」は不要です。

また、「LIMIT」を使って件数を絞ることも可能です。

「テスト」テーブルの英語の点数を降順に並べて上位3件を削除します。

【実行コード】

DELETE FROM test ORDER BY en DESC LIMIT 3;

【実行結果】

ID(id)英語(en)数学(ma)国語(ja)
998100100100
1003909590
1000858085

「DESC」を「ASC」に書き換えることで昇順になり、上位3件を削除できます。

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

前方一致や後方一致といった削除条件を指定することも可能です。ここでは氏名が「田」で終わる生徒を削除します。

【実行コード】

DELETE FROM student WHERE name LIKE '%田';

【実行結果】

氏名(name)クラス(class)学籍番号(student_no)
秋山A997
佐々木B999
佐藤B1000
鈴木B1001
田中C1002
土屋C1003

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

複数のテーブルでデータが重複するのを避けるには「JOIN」句を使います。

テストを受けた生徒を「生徒」テーブルから削除します。

(「生徒」テーブルと「テスト」テーブルの2つのテーブルに共通するデータを「生徒」テーブルから削除する)

【実行コード】

DELETE student FROM student INNER JOIN test WHERE student.student_no = test.id;

【実行結果】

氏名(name)クラス(class)学籍番号(student_no)
佐々木B999

DELETEにサブクエリを使用

英語の点数が平均点以下の生徒を削除します。まずは平均点以下の生徒を抽出します。

SERECT student_no FROM student WHERE en < (SELECT AVG(en) FROM test);

これをWHERE句に入れるとサブクエリを含むSELECT文になり、英語の点数が平均点以下の生徒を抽出できます。

SERECT 1 FROM student WHERE student_no IN
 SERECT student_no FROM student WHERE en <
 (SELECT AVG(en) FROM test)
 );

SELECT 1」を「DELETE」に置き換えると平均点以下の生徒を削除できます。

DELETE FROM student WHERE student_no IN SERECT student_no FROM student WHERE en < (SELECT AVG(en) FROM test) );

特定のカラム(列)を削除する場合

DELETE文では特定のカラム(列)のデータのみを削除することはできません。ただ、UPDATE文を使うことで、特定のフィールドをNULL値や空白に更新することが可能です。

【実行コード】

UPDATE test SET en = NULL;

【実行結果】

ID(id)英語(en)数学(ma)国語(ja)
997NULL7090
998NULL100100
999NULL6070
1000NULL8085
1001NULL4040
1002NULL6535
1003NULL9590

DELETE文を使用する上での注意点

DELETE文を使う上で、留意すべき点がいくつかあります。

特定の部分だけを削除することはできない

DELETE文は、条件に該当するレコードごと削除するため、該当するレコードの特定の列に格納されたデータだけを削除するといったことはできません。

ただ、その箇所が「NULL」でもいいという場合はUPDATE文を活用して、値をNULLに更新することもできます。

列の削除には使えない

DELETE文はレコード(行)ごとの削除であってカラム(列)ごとの削除はできません。その場合はALTER TABLE文に「DROP カラム名」で行なえます。

ただ、カラムを削除することで次のような不都合が生じる可能性があるため、カラムを削除する際は十分注意する必要があります。

  • ほかのテーブルやビューからデータを参照できなくなり、正常にデータを保存できなくなる
  • プログラムからデータを参照できず、正常に動作しなくなる

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

WHERE句で条件を指定する場合は、まずSELECT文で抽出されるデータが意図したものであるか確認を取ってからDELETE文を使いましょう。はじめからDELETE文を使うと、削除対象を誤っていた大きな場合データが無くなり、消すべきでないデータを誤って消去してしまうと大きなトラブルになりかねません。

削除するデータがほかのテーブルに影響しているか確認する

削除する前にデータがほかのテーブルやビューから参照されていると、削除後に問題が発生するので削除しても問題がないか十分にチェックしましょう。

実務ではデータを削除する代わりに、テーブルに「削除フラグ」というカラムを立てる方法が使われることも多いです。これは実際にテーブルからデータを削除する「物理削除」とは異なり、テーブルからデータを削除するのではなく、「削除済み」というマークをつける「論理削除」という方法です。これにより、「データは残っているけど、システム上では削除されたことになっている」という扱いになります。論理削除であれば、復活が容易ですが大量のデータを残すことでレスポンスが低下することもあるという可能性もあります。

過去のデータを参照する可能性があるものや削除することで影響する範囲が大きいデータにこの方法がよく用いられます。データを削除する場合は、削除フラグを利用することも考えましょう。

DELETE文とTRUNCATE文との違い

TRUNCATE文もDELETE文と同様に、データを削除するのに使われます。しかし、両者には相違点があります。

DELETE文は、トランザクションログ(*)にデータの記録を行った上でデータを削除するので、誤って削除してしまった場合でも実行前であればロールバックで戻すこともできます。大量のデータを削除する場合は時間がかかります。また、データの一部を削除することもできます。

TRUNCATE文は、データを削除する際にトランザクションに記録しないため、一度実行すると実行前の状態に戻すことはできません。大量のデータを削除する場合でもすばやく動作します、一度実行するともとに戻せません。また、データの一部のみを削除するということはできません。

トランザクションログ:データベースの変更履歴を記録したものでストレージ上のファイルとして記録される場合が多い。

SQLの勉強方法は?

書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。

ただ、SQLに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。

プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。

<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~

このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。

SQL関連記事

     

Otherカテゴリの最新記事