MySQLのDELETEとは?DELETEで消すレコードの条件指定方法を解説!
- システム
エンジニア - DELETEを使ったデータ消去方法について教えてください。
- プロジェクト
マネージャー - 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
オートコミットモードを解除するとタイミングの良い所でコミットをする必要がありますが、活用してみましょう。
- システム
エンジニア - やり直しが効かない作業なので、細心の注意が必要ですね。
- プロジェクト
マネージャー - そうですね。また、様々な消去の方法を紹介しましたので、ぜひマスターしてください。
MySQLのDELETEは注意して行おう
MySQLのDELETEについて解説しましたが、ご理解頂けましたでしょうか。DELETEは削除を行うコマンドなので、ミスをすると取り返しがつかなくなります。DELETEを行うときは細心の注意を払いながら行いましょう。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
新着案件New Job
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅) -
PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円東京都豊島区(池袋駅)