.net column
.NET開発者のためのブログメディア

削除の手順

MySQLのDELETEとは?DELETEで消すレコードの条件指定方法を解説!

2021年03月15日

SE
DELETEを使ったデータ消去方法について教えてください。

PM
DELETEは非常に重要な機能ですね。一口にデータ消去と言っても、様々な方法がありますので、実際のコードを見ながら理解を深めていきましょう。

MySQLのDELETEの使い方を解説

MySQLのDELETEとは?


MySQLはオープンソースのリレーショナルデータベースです。フリーでありながら、YouTube・FaceBook・Twitter・Netflixなど、多くのサイトで利用され信頼の高さを誇ります。そのMySQLで使用するSQL文のうち、DELETEを解説します。

SQLはデータベースを操作するための言語で、SELECT・INSERT・UPDATE・DELETEは4大命令と言われます。その1つのDELETEはデータの削除のために使用する重要な機能です。

テーブル名のみを指定すると全てのレコードが消える

SQL文の操作の対象はデータベースに属するテーブルです。テーブルはカラム(列)に分かれたレコード(行)という形式になっています。以下のサンプルはid、name、age、statusの4つのカラムがある3件のレコードを持つテーブルです。

id name age status
1 山田太郎 30 会社員
2 佐藤花子 21 大学生
3 鈴木三郎 15 中学生

DELETE文の簡単な使い方は以下の通りです。

DELETE FROM テーブル名

これを実行すると、指定したテーブルの中身は全て消えます。

WHEREを使えば指定した条件のレコードのみを消せる

しかし全てのレコードを消したいというケースは実際にはあまりないでしょう。MySQLにはDROP TABLEというテーブルごと削除する命令文もありますが、それに近い行為です。DELETEを使う場合は条件を指定して消したいレコードを絞り込むのが普通です。

DELETEで消すレコードの条件指定をするには、WHERE節を使います。上のサンプルのテーブルの名前が「Test」だとして、レコードを1件だけ消したい場合は以下のようにします。

DELETE FROM Test WHERE id = 2

結果は以下になります。idが2のレコードだけ削除されました。なおMySQLでこのようにテーブルの内容全てを表示するには「SELECT * FROM Test」を実行します。

id name age status
1 山田太郎 30 会社員
3 鈴木三郎 15 中学生

!=で=とは逆の意味になる

上の例の

WHERE カラム名 = 値

の=は「等しいならば」という意味ですが、!=にすると「等しくないならば」と言う意味になります。以下を実行すると、

DELETE FROM Test WHERE id != 2

以下のようにidが2以外のレコードが削除されます。

id name age status
2 佐藤花子 21 大学生

なお!=ではなく<>を使用しても同じです。

不等号も使える

=、!=、<>以外に不等号も使用できます。以下を実行すると、

DELETE FROM Test WHERE age > 20

以下のようになります。ageが20を超えるレコードが削除されています。

id name age status
3 鈴木三郎 15 中学生

以下を実行すると、

DELETE FROM Test WHERE age <= 15

以下のようになります。ageが15以下が対象ということです。

id name age status
1 山田太郎 30 会社員
2 佐藤花子 21 大学生

ANDとORで複数の条件を指定できる

WHERE節にANDを使うと「AかつB」のような複数の条件を指定できます。以下を実行すると、

DELETE FROM Test WHERE age=30 AND status=’会社員’

以下の結果になります。

id name age status
2 佐藤花子 21 大学生
3 鈴木三郎 15 中学生

ORは「AまたはB」と言う条件を指定できます。以下を実行すると、

DELETE FROM Test WHERE age=30 OR status=’大学生’

以下になります。該当する複数のレコードが削除されました。

id name age status
3 鈴木三郎 15 中学生

BETWEEN ANDで範囲指定ができる

BETWEEN ANDを使うと範囲指定ができます。以下を実行すると、

DELETE FROM Test WHERE age BETWEEN 20 AND 30

以下のようになります。この場合はageが20から30までという意味なので、21と30のレコードが削除されました。

id name age status
3 鈴木三郎 15 中学生

INと()でリスト指定ができる

INと()でリストの中の値のどれかに一致するレコードを対象にすることができます。以下のようにすると、

DELETE FROM Test WHERE status IN(‘小学生’,’中学生’)

以下の結果になります。該当する3番目のレコードだけが削除されました。

id name age status
1 山田太郎 30 会社員
2 佐藤花子 21 大学生

LIKEで文字列のマッチングができる

LIKEと%と_で文字列の部分マッチングによる条件指定ができます。以下を実行すると、

DELETE FROM Test WHERE name LIKE ‘%花%’

以下の結果になります。nameに「花」を含むレコードが削除されました。

id name age status
1 山田太郎 30 会社員
3 鈴木三郎 15 中学生

以下を実行すると、

DELETE FROM Test WHERE status LIKE ‘_学生’

以下のようにstatusが〇学生のレコードが削除されます。

id name age status
1 山田太郎 30 会社員

%は0文字以上の連続する任意の文字列、_は任意の1文字という意味です。わかりにくいかもしれませんが、色々と試してみれば理解できるでしょう。

ORDER BYとLIMITで上位と下位の一部を削除できる

ORDER BYとLIMITを組み合わせると、DELETEで便利に使えます。以下を実行すると、

DELETE FROM Test ORDER BY age LIMIT 2

以下の結果になります。ORDER BYはageを昇順に並び替えて、LIMIT 2で対象を2件に絞ります。そのためageが15、21、30のうちの15と21のレコードが削除されたということです。

id name age status
1 山田太郎 30 会社員

DESCで降順にもできます。以下を実行すると、

DELETE FROM Test ORDER BY age DESC LIMIT 2

以下になります。ageが31、21、15のうち31と21のレコードが削除されたということです。

id name age status
3 鈴木三郎 15 中学生

TRUNCATE TABLEでレコードを全て消せる

DELETE FROM テーブル名だけだと全てのレコードを消してしまいますが、MySQLにはそれ専用の命令があります。それはTRUNCATE TABLEです。今回のサンプルで以下のようにすれば全レコードを削除できます。

TRUNCATE TABLE Test

これでDELETE FROM Testと同じ結果になりますが、違いもあります。

TRUNCATE TABLEはロールバックできない

DELETEの場合は1件ずつレコードを消すので遅いですが、TRUNCATE TABLEの内部処理ではDROP TABLEでテーブルを消した後に、CREATE TABLEで空のテーブルを作ります。このことにより、DELETEよりも処理が高速です。

またDELETEの場合はロールバック(取り消し)できますが、TRUNCATE TABLEはやり直せません。TRUNCATE TABLEはMySQLのデータベースを整理する特殊な作業のみで使用するとよいでしょう。

トランザクションを使えばミスをロールバックできる

ロールバックの話題がでましたが、MySQLではトランザクションを使えばロールバックによるやり直しができます。ただしMySQLは初期状態ではオートコミットモードになっているので、その状態ではロールバックできません。まずそれを以下のように解除する必要があります。

SET AUTOCOMMIT=false

この状態でINSERTなどでレコードを追加し、終わったら、

COMMIT

をします。これでトランザクションをコミット(確定)できます。そしてこの後、以下でデータをうっかり全部消してしまったとします。

DELETE FROM Test

それでもコミットしていなければ、以下でロールバックして以前のコミットした状態に戻せるのです。コミットかロールバックするまでの流れをトランザクションと言います。

ROLLBACK

オートコミットモードを解除するとタイミングの良い所でコミットをする必要がありますが、活用してみましょう。

SE
やり直しが効かない作業なので、細心の注意が必要ですね。

PM
そうですね。また、様々な消去の方法を紹介しましたので、ぜひマスターしてください。

MySQLのDELETEは注意して行おう

MySQLのDELETEについて解説しましたが、ご理解頂けましたでしょうか。DELETEは削除を行うコマンドなので、ミスをすると取り返しがつかなくなります。DELETEを行うときは細心の注意を払いながら行いましょう。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags