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;
を記述することで、ロールバックできます。
≫まずは簡単60秒で無料お問い合わせから≪
サンプルテーブル
「DELETE」文の具体的な使い方を解説していくにあたって、サンプルとして「生徒(student)」テーブルと「テスト(test)」を用意しました。
「生徒(student)」テーブル
氏名(name) | クラス(class) | 学籍番号(student_no) |
秋山 | A | 997 |
久保田 | A | 998 |
佐々木 | B | 999 |
佐藤 | B | 1000 |
鈴木 | B | 1001 |
田中 | C | 1002 |
土屋 | C | 1003 |
「テスト(test)」テーブル
ID(id) | 英語(en) | 数学(ma) | 国語(ja) |
997 | 80 | 70 | 90 |
998 | 100 | 100 | 100 |
1000 | 85 | 80 | 85 |
1001 | 75 | 40 | 40 |
1002 | 60 | 65 | 35 |
1003 | 90 | 95 | 90 |
テーブルのデータをすべて削除する
テーブルに含まれるデータすべてを削除する場合は次のように「DELETE FROM テーブル名」と記述します。なお、データを全件削除しても、テーブルの枠組み自体は残ります。
【実行コード】
DELETE FROM student;
実行後は「生徒」テーブルのデータを検索しても、表示されないか「表示される結果がありません」という結果が出ます。
条件にあてはまるレコード(行)を削除する
DELETE文は、データの一部を削除する場合が多いでしょう。条件は、WHERE句で指定できます。ここでは「生徒」テーブルのうち、Aクラスの生徒を消してみます。
【実行コード】
DELETE FROM student WHERE class=A;
【実行結果】
氏名(name) | クラス(class) | 学籍番号(student_no) |
佐々木 | B | 999 |
佐藤 | B | 1000 |
鈴木 | B | 1001 |
田中 | C | 1002 |
土屋 | C | 1003 |
WHERE句は不等号も使えます。IDが1000以上の生徒を削除してみます。
【実行コード】
DELETE FROM student WHERE student_no>=1000;
【実行結果】
氏名(name) | クラス(class) | 学籍番号(student_no) |
秋山 | A | 997 |
久保田 | A | 998 |
佐々木 | B | 999 |
削除するデータをSELECT文で指定する
削除するデータを数値や文字列で示すこともできますが、SERECT文でも指定可能です。ここでは「生徒」テーブルと「テスト」テーブルからテストを受けていない生徒を「生徒」テーブルから削除します。
【実行コード】
DELETE FROM student WHERE ID NOT IN (SELECT id FROM test);
【実行結果】
氏名(name) | クラス(class) | 学籍番号(student_no) |
秋山 | A | 997 |
久保田 | A | 998 |
佐藤 | B | 1000 |
鈴木 | B | 1001 |
田中 | C | 1002 |
土屋 | C | 1003 |
上位/下位のデータを削除する
DELETE文は「ORDER BY」句を使うことで最大値や最小値など、上位または下位のデータを削除できます。
IDが1000以上の生徒を削除する場合は以下のようなコードになります。
【実行コード】
DELETE FROM student WHERE 1000 < student_no ORDER BY student_no;
【実行結果】
氏名(name) | クラス(class) | 学籍番号(student_no) |
秋山 | A | 997 |
久保田 | A | 998 |
佐々木 | B | 999 |
※IDが主キーの場合は、初期状態でIDは昇順で並ぶため、厳密には「ORDER BY」は不要です。
また、「LIMIT」を使って件数を絞ることも可能です。
「テスト」テーブルの英語の点数を降順に並べて上位3件を削除します。
【実行コード】
DELETE FROM test ORDER BY en DESC LIMIT 3;
【実行結果】
ID(id) | 英語(en) | 数学(ma) | 国語(ja) |
998 | 100 | 100 | 100 |
1003 | 90 | 95 | 90 |
1000 | 85 | 80 | 85 |
「DESC」を「ASC」に書き換えることで昇順になり、上位3件を削除できます。
前方一致や後方一致で条件を指定し削除する
前方一致や後方一致といった削除条件を指定することも可能です。ここでは氏名が「田」で終わる生徒を削除します。
【実行コード】
DELETE FROM student WHERE name LIKE '%田';
【実行結果】
氏名(name) | クラス(class) | 学籍番号(student_no) |
秋山 | A | 997 |
佐々木 | B | 999 |
佐藤 | B | 1000 |
鈴木 | B | 1001 |
田中 | C | 1002 |
土屋 | C | 1003 |
重複するデータを削除する
複数のテーブルでデータが重複するのを避けるには「JOIN」句を使います。
テストを受けた生徒を「生徒」テーブルから削除します。
(「生徒」テーブルと「テスト」テーブルの2つのテーブルに共通するデータを「生徒」テーブルから削除する)
【実行コード】
DELETE student FROM student INNER JOIN test WHERE student.student_no = test.id;
【実行結果】
氏名(name) | クラス(class) | 学籍番号(student_no) |
佐々木 | B | 999 |
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) |
997 | NULL | 70 | 90 |
998 | NULL | 100 | 100 |
999 | NULL | 60 | 70 |
1000 | NULL | 80 | 85 |
1001 | NULL | 40 | 40 |
1002 | NULL | 65 | 35 |
1003 | NULL | 95 | 90 |
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関連記事
- RDBを操作するデータベース言語「SQL」とは?
- RDB以外のデータベース管理システム「NoSQL」とは?
- RDB管理システム「MySQL」とは?
- RDB管理システム「PostgreSQL」とは?
- RDB管理システム「SQL Server」とは?
- RDB管理システム「SQLite」とは?
- ブラウザ上でMySQLを管理できる「phpMyAdmin」とは?
- データを抽出する「SELECT」文
- データを追加する「INSERT」文
- データを削除する「DELETE」文
- データを更新する「UPDATE」文
- テーブル構造を変更する「ALTER TABLE」文
- 抽出条件を指定する「WHERE」句
- 抽出条件を指定する「HAVING」句
- 複数の抽出条件をまとめる「IN」句
- 重複レコードを除外する「DISTINCT」
- 抽出範囲を指定する「BETWEEN」演算子
- 抽出条件を満たすレコードの存在の有無を調べる「EXISTS」句
- レコード件数を取得する集計関数「COUNT」関数
- レコードをグループ化する「GROUP BY」句
- 抽出結果を並び替える「ORDER BY」句
- テーブル間のデータを結合する「JOIN」句
- 内部結合「INNER JOIN」句
- 抽出結果を統合して表示する「UNION」句
- データの曖昧検索「LIKE」句
- データの取得件数を制限する「LIMIT」句
- 条件分岐処理「CASE」式
- 「NULL」の扱い方
- 「主キー」とは?
- 「外部キー」とは?
- 2023.09.13
- Other
Author:鷺坂りな @TechMania編集部 投稿一覧
Otherカテゴリの最新記事
-
- 2024.10.25
【Excel VBA】VBAでファイルを上書き保存する方法を解説
-
- 2024.10.25
【Excel VBA】ファイル名を取得する方法を解説(ファイルパス、Dir関数、ワイルドカード、サブフォルダ名)
-
- 2024.10.22
【Excel VBA】セルに罫線を引く方法をわかりやすく解説
-
- 2024.10.18
【Excel VBA】正規表現(RegExp)で文字列を操作する方法を解説(検索・抽出・置換)
-
- 2024.10.11
【Excel VBA】Functionの使い方を解説(宣言・引数、戻り値の指定、応用法)
-
- 2024.10.04
【Excel VBA】構造体とは?使い方を解説(宣言・初期化・引数・コピー・定数)