トップ > SQL入門 > 23章
23章 データ削除
では、次はレコードの削除方法について確認していきましょう。

DELETE


DELETE文を使用すると既存のレコードを削除することができます。

では、構文を確認していきましょう。

[構文] 行の挿入(すべての列の挿入)
 DELETE [FROM] 表名
 [WHERE 条件式];

レコードの削除の構文は簡単ですね。FROMは省略可能です。
UPDATE同様、WHERE句を指定しない場合は、全レコードを削除します。

ただし、全レコードが削除されても表自体が削除されるわけではありません。
表の定義は残っています。後半で紹介しますが、
表を削除する場合は、DROP TABLE文を使用します。

では実行例です。

  SQL> SELECT emp_id,first_name FROM employees WHERE emp_id = 15;

      EMP_ID FIRST_NAME                    
  ---------- ------------------------------
          15 Kato                           

  SQL> DELETE employees WHERE emp_id = 15;

  1 row deleted.

  SQL> SELECT emp_id,first_name FROM employees WHERE emp_id = 15;

  no rows selected
  

WHERE句を使用してemp_idが15の従業員を削除しました。
その後SELECTを実行していますが、表示されていないことが分かります。

続いて、全行の削除をみていきましょう。

  SQL> SELECT emp_id,first_name FROM employees;

      EMP_ID FIRST_NAME
  ---------- ------------------------------
           1 Suzuki
           2 Sato
           3 Yamamoto
           4 Watanabe
           5 Watanabe
           6 Kataoka
           7 Harada
           8 Koda
           9 Saito
          10 Akagi
          11 Sato
          12 Tao
          13 Kaneko
          14 Totsuka
          15 Kato
          16 Sinagawa
          17 Kuroda
          18 Nakamura
          19 Kamata
          20 Ito

  20 rows selected.

  SQL> DELETE employees;

  20 rows deleted.

  SQL> SELECT emp_id,first_name FROM employees;

  no rows selected

  SQL> DESC employees
  
   Name                         Null?    Type
   ---------------------------- -------- ---------------------
   EMP_ID                       NOT NULL NUMBER(10)
   FIRST_NAME                            VARCHAR2(30)
   LAST_NAME                             VARCHAR2(30)
   ADDRESS                               VARCHAR2(100)
   TEL                                   VARCHAR2(12)
   SALARY                                NUMBER(30)
   HIRE_DATE                             DATE
   MANAGER_ID                            NUMBER(10)
   DEPT_ID


今回はWHERE句を指定していないので、すべてのレコードを削除しました。
SELECTを行っても表示されていないことが分かります。

ただし、DESCRIBEコマンドは実行できることが分かります。
つまりレコードはすべて削除されましたが、表自体は存在しています。

今回は紹介しませんが、DELETE文もUPDATE同様にWHERE句に
副問合せを使用することができます。

いかがでしたでしょうか。INSERT,UPDATE,DELETEコマンドを使用することで
データベースに対する操作を行えるようになりました。以上がDML文の内容となります。

TRUNCATE


またTRUNCATE文というコマンドがあり、こちらもレコードの削除を行います。
ただしTRUNCATEは全行の削除を行います。

[構文] 行の挿入(すべての列の挿入)
 TRUNCATE TABLE 表名;

構文は非常に簡単ですね。このTRUNCATEコマンドで全行の削除が行えます。
DELETE文でもWHERE句を付けなければ全行の削除が行えますが、どう違うのでしょうか。
DELETEとTRUNCATE文の違いを以下にまとめました。

DELETEとTRUNCATEの違い
DELETE TRUNCATE
DML文 DDL文
削除行を元に戻すことができる
(ロールバック)
削除行を元に戻すことができない
処理が遅い
処理が高速

上記が違いとなります。大きな違いはDELETE文は削除するときに、
元に戻すための情報も併せて生成するため、
元に戻すことが可能ですが、その分処理が遅くなります。

一方、TRUNCATEは元に戻す情報は生成しないため、処理が高速です。
ただし、元には戻せません。

どちらを使うかはその状況次第ということになります。