DROP TABLE文とDELETE文
データの登録方法が分かったら、次はデータの削除である。データの削除方法は、大きく分けて2つある。
①DROP TABLE文によって、テーブルそのものを削除する
②DELETE文によって、テーブルは残したまま、テーブル内のすべての行を削除する
①のDROP TABLE文は、テーブルごとすべて削除するため、一度削除した後にデータを再登録するには、CREATE TABLE文でテーブルの作成から始めなければならない。
これに対し、②のDELETE文の場合は、データ(行)を削除してもテーブルは残っているため、INSERT文によってすぐにデータを再登録することができる。
本ページのテーマは「データの削除」ということで、データの削除のみするDELETE文の使い方を学ぶ。
DELETE文の基本構文
DELETE文の基本構文は、非常に単純なものである。
DELETE FROM <テーブル名>;
この基本構文に沿ってDELETE文を実行すると、指定したテーブルのすべての行を削除する。したがって、chojinテーブルの全行削除して空っぽにするならば、以下のように書く。
[sql] DELETE FROM chojin; [/sql]
FROMを忘れて「DELETE <テーブル名>」と書いたり、列名をつけようとして「DELETE <列名> FROM <テーブル名>」と書いたりする間違いを見かけることがあるが、いずれもエラーとなって正しく動作しない。
後者が間違いである理由は、DELETE文における削除対象は、列ではなく行なので、DELETE文で一部の列だけを削除することはできない。したがって、DELETE文で列名を指定することはできない。当然ながら、アスタリスクを使って「DELETE * FROM chojin;」と書くのも間違いで、エラーになる。
削除対象を制限したDELETE文(探索型DELETE)
テーブルの全行ではなく、一部の行だけを削除する場合は、SELECT文の場合と同様、WHERE句で条件を記述する。このように削除対象のレコードを制限したDELETE文のことを、「探索型DELETE」と呼ぶ。
例えば、超人強度(power)が4000以上の行だけを削除したい場合を考える。
[sql] DELETE FROM chojin WHERE power >= 4000; [/sql]
WHERE句の記述方法は、これまでSELECT文を使ってきたものと全く同じように考えて構わない。
なお、SELECT文と違って、DELETE文にはGROUP BY、HAVING、ORDER BYの3つの句は指定できない。使えるのはWHERE句だけである。GROUP BYやHAVINGというのは、元となるテーブルからデータを選択するときに、「抽出する形を変えたい」という場合に使用する。ORDER BYも、結果の表示順を指定するのが目的である。そのため、テーブルのデータそのものを削除するときには、そもそも出番がない訳である。
削除と切り捨て
テーブルからデータを削除する方法として、標準SQLが用意しているのはDELETE文だけである。しかし、多くのデータベース製品には、「TRUNCATE」というコマンドが用意されている。
TRUNCATEとは「切り捨てる」という意味で、具体的には次のように使う。
TRUNCATE <テーブル名>;
DELETEと違って、TRUNCATEは、必ずテーブルを全行削除する。WHERE句で条件を指定して、一部の行だけを削除するということはできない。したがって、細かい制御はできないが、その代わり、DELETE文よりも削除の処理が高速であるというメリットがある。
実はDELETE文というのは、DMLの中でもかなり実行に時間がかかる処理であるため、全行削除して構わない場合は、TRUNCATEを使うことで実行時間を短縮できる。