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は元に戻す情報は生成しないため、処理が高速です。
ただし、元には戻せません。
どちらを使うかはその状況次第ということになります。