Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

SQLレコードの削除についてまとめています。

SQLレコードを削除するサンプルコード

MySQLのサンプルデータベースEmployeesを使用しています。

SQLのレコードを削除するにはDELETE

レコードを削除するにはdelete文を使います。

delete文は条件を指定することが可能で、条件に合致したレコードのみを削除します。

以下は、employees(社員)テーブルから、emp_no(社員番号)が4より小さいデータを削除するサンプルです。delete実行後、emp_no=1のデータが削除されています。

mysql> select * from employees limit 10;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|      1 | 1999-06-06 | Shoji      | Nagano    | M      | 2003-08-01 |
|      4 | 1982-01-01 | Siro       | Takahashi | M      | 2003-07-01 |
|      5 | 1979-08-12 | Yuji       | Satoh     | M      | 2003-04-05 |
|      6 | 1981-12-05 | Kyoko      | Shimada   | F      | 2005-09-01 |
|      7 | 1975-03-15 | Yuri       | Ooishi    | F      | 2004-04-15 |
|  10001 | 1953-09-02 | xGeorgi    | Facello   | M      | 1986-06-26 |
|  10002 | 1964-06-02 | Bezalel    | Simmel    | F      | 1985-11-21 |
|  10003 | 1959-12-03 | Parto      | Bamford   | M      | 1986-08-28 |
|  10004 | 1954-05-01 | Chirstian  | Koblick   | M      | 1986-12-01 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak  | M      | 1989-09-12 |
+--------+------------+------------+-----------+--------+------------+
10 rows in set (0.00 sec)

mysql> DELETE FROM `employees` 
WHERE emp_no < 4;

mysql> select * from employees limit 10;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|      4 | 1982-01-01 | Siro       | Takahashi | M      | 2003-07-01 |
|      5 | 1979-08-12 | Yuji       | Satoh     | M      | 2003-04-05 |
|      6 | 1981-12-05 | Kyoko      | Shimada   | F      | 2005-09-01 |
|      7 | 1975-03-15 | Yuri       | Ooishi    | F      | 2004-04-15 |
|  10001 | 1953-09-02 | xGeorgi    | Facello   | M      | 1986-06-26 |
|  10002 | 1964-06-02 | Bezalel    | Simmel    | F      | 1985-11-21 |
|  10003 | 1959-12-03 | Parto      | Bamford   | M      | 1986-08-28 |
|  10004 | 1954-05-01 | Chirstian  | Koblick   | M      | 1986-12-01 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak  | M      | 1989-09-12 |
|  10006 | 1953-04-20 | Anneke     | Preusig   | F      | 1989-06-02 |
+--------+------------+------------+-----------+--------+------------+
10 rows in set (0.00 sec)

SQLのレコード削除 全データを高速で削除するにはtruncate

テーブルの全データを削除したいとき、高速で削除するにはtruncate。

特に大量のレコード件数がある場合、予想以上に処理に時間がかかります。これは、ロールバックしても良いように、データベースに削除履歴(ログ)を書き込んでいるからなんですよね。

しかし、「ロールバックはしない、高速で削除したい」という場合は、ログの書き込みをしないtruncateが便利です。

以下の例は、employees(社員)テーブルをtruncateで全件削除するサンプルです。

なお、truncateにはdeleteのような条件指定はできません。実行すると、全データを削除します。

mysql> truncate table employees;
Query OK, 0 rows affected (0.51 sec)

mysql> select * from employees;
Empty set (0.06 sec)

【関連記事】
SQL truncate 高速データ削除 deleteやdropとの違いとDBMS間の差異 

SQLレコード削除 DBMSごとの注意点

MySQLのdeleteの独自拡張は、複数テーブルの同時削除が可能な点と、削除の順番が指定可能な点です。

複数テーブルの同時削除は、join条件で紐付けた複数テーブルを削除可能なんですね。また、削除対象テーブルが1つの場合に限り、order byとlimitを組み合わせて削除する順番を指定することが可能です。

【関連記事】
MySQL deleteのサンプルコード集 複数テーブルの削除やエイリアス制限とは 

また、delete後にinsertする代わりに、削除と挿入を同時実行するreplaceが用意されてます。

関連)MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.8 REPLACE 構文

SQL Serverでは、delete文のTOP句に削除するランダムな行数や比率をすることができます。TOP句はdeleteにかぎらずselectでも使用できます。巨大すぎる件数を持つテーブルを操作するためにデータの一部のみを対象にするための機能です。

また、FROM句で結合を指定して削除する行を特定できます。

関連)DELETE (Transact-SQL) – SQL Server | Microsoft Docs

Oracleでは、データ削除時に競合が起こった際、ユーザ定義の競合解消メソッド(PL/SQLファンクション)で、競合チェックをおこなってからデータの削除をおこなうことができます。

関連)Oracle公式:DELETE

postgreSQLでは、returuning句を使って、削除された行の内容をselect文のように返すことができます。削除済みデータとか、履歴などを作るときに便利。returningは、postgreSQLの独自拡張です。delete以外に、insert、updateにも使うことが可能。

DELETE FROM products
  WHERE obsoletion_date = 'today'
  RETURNING *;

参考)postgreSQL公式:6.4. 更新された行のデータを返す

まとめ

ポテパンダの一言メモ
  • SQLのレコードの削除は、delete文で行う
  • ロールバック不要な場合、truncate文でテーブル内の全件削除が高速
  • DBMSによって、delete文の独自拡張があり、使える機能が異なる

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。