ひとり勉強ログ

ITエンジニアの勉強したことメモ

MySQL講座#10 データの削除(DELETE文の使い方)

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を使うことで実行時間を短縮できる。