しがないOLのはじめてのMySQL(データの削除)

2017.05.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは。クニ吉です。
季節の変わり目というのは、体調を崩しやすくて困っちゃいますね。

さて、今回は1回書いたきりだったので、またMySQLについて。
今回は削除系の話を書いてみようと思います。

前提

本ブログにおけるMySQLのバージョンは、「5.7.17」です。
(私の)過去ブログで既に記載している構文や結果表示については、さらっと流して書いていますので、過去ブログをご確認ください。

本ブログの構成

  • データの削除
  • テーブルの削除
  • データベースの削除
  • まとめ

データの削除

前回作成したテーブルの中身を見てみましょう。
今回はこのデータを削除していこうと思います。

mysql> select * from item;
+----+-----------------------------+-------+
| id | item_name                   | price |
+----+-----------------------------+-------+
|  1 | カエルのオルゴール              |  3500 |
|  2 | カエルのTシャツ                 |  1900 |
|  3 | カエルの指輪                   |   800 |
|  4 | カエルの靴下                   |   350 |
+----+-----------------------------+-------+
4 rows in set (0.00 sec)

データの削除は以下の2パターンがあります。

  • ある条件を満たしたデータのみを削除する
  • 全データを一括で削除する

条件を指定して削除する手順

1.データの削除を行うにはDELETE文を使います。
構文:DELETE FROM {テーブル名} WHERE {条件式};
このWHERE句で条件を指定することによって、条件に合致するデータを削除することができます。
WHERE句を省略すると、テーブル内の全データが削除されますのでご注意ください。
まず、「カエルの指輪」のデータのみを消してみましょう。
削除対象のデータ:id=3 item_name=カエルの指輪 price=800

idが「3」のデータを指定する:

mysql> delete from item where id = 3;

結果:以下が表示されたらOKです。

Query OK, 1 row affected (0.00 sec)

2.前回利用したSELECT文でテーブルの中身を確認します。

mysql> select * from item;
+----+-----------------------------+-------+
| id | item_name                   | price |
+----+-----------------------------+-------+
|  1 | カエルのオルゴール              |  3500 |
|  2 | カエルのTシャツ                 |  1900 |
|  4 | カエルの靴下                   |   350 |
+----+-----------------------------+-------+
3 rows in set (0.00 sec)

「カエルの指輪」が消えていることを確認できます。

WHERE句の条件式について

手順ではidが一致するという条件を用いて削除を行いましたが、以下のような条件を指定することも可能です。

priceの値が「800」のデータを指定する:

mysql> delete from item where price = 800;

item_nameに「指輪」を含むデータを指定する:

mysql> delete from item where item_name like '%指輪';

このWHERE句では「Like演算子」と「ワイルドカード」も用いて「値の最後に'指輪'という文字を含む値」というあいまい検索を利用しています。
このほか、条件式には「〇〇を含まない値」や「10以上の値」など様々な指定が可能です。
こちらはまた後日まとめて書きたいと思います。

テーブル内の全データを削除する手順

次に全部のデータを削除してみましょう。
全データを削除するには以下の2パターンあります。

  • DELETE文のWHERE句を省略することで全データを削除する。
  • TRUNCATE文で全データを削除する。

どちらも全データ削除することに変わりはないのですが、DELETE文はテーブル内データ1件ずつを削除するのに対し、TRUNCATE文は一回テーブル自体を削除(後述のDROP TABLE文を実行する)し、同じ構造のテーブルを作り直しているという違いがあります。
この違いをわかりやすくするために、以下の手順でデータの削除を行います。

  1. DELETE文でitemテーブル内のデータを削除 & テーブルの中身を確認
  2. itemテーブルにデータ追加 & テーブルの中身を確認
  3. TRUNCATE文でitemテーブル内のデータを削除 & テーブルの中身を確認
  4. itemテーブルにデータ追加 & テーブルの中身を確認

前提条件:idはオートナンバー設定をしています。


1.DELETE文(WHERE句省略)でテーブル内の全データを削除します。
構文:DELETE FROM {テーブル名}

mysql> delete from item;

結果:以下が表示されたらOKです。

Query OK, 3 row affected (0.00 sec)

SELECT文でテーブルの中身を確認します。

mysql> select * from item;

結果:
Empty set (0.00 sec)

すべてのデータが削除され、「Empty」となっていることが確認できます。


2.itemテーブルにデータを追加してテーブルの中身を確認します。

データを追加する:
mysql> insert into item(item_name, price)values('キリンの抱き枕', 5000);
Query OK, 1 row affected (0.00 sec)

テーブルの中身を確認する:
mysql> select * from item;
+----+-----------------------+-------+
| id | item_name             | price |
+----+-----------------------+-------+
|  5 | キリンの抱き枕            |  5000 |
+----+-----------------------+-------+
1 row in set (0.00 sec)

idに注目です。idが5から始まっています。


3.次はTRUNCATE文で再び全データの削除を行います。
構文:TRUNCATE TABLE {テーブル名}

mysql> truncate table item;

結果:以下が表示されたらOKです。

Query OK, 0 rows affected (0.01 sec)

SELECT文でテーブルの中身を確認します。

mysql> select * from item;

結果:
Empty set (0.00 sec)

DELETE文で削除したのと同様に、すべてのデータが削除され「Empty」となっていることが確認できます。


4.再びitemテーブルにデータを追加してテーブルの中身を確認します。

データを追加する:
mysql> insert into item(item_name, price)values('キリンのぬいぐるみ', 3200);
Query OK, 1 row affected (0.00 sec)

テーブルの中身を確認する:
mysql> select * from item;
+----+-----------------------------+-------+
| id | item_name                   | price |
+----+-----------------------------+-------+
|  1 | キリンのぬいぐるみ               |  3200 |
+----+-----------------------------+-------+
1 row in set (0.00 sec)

idを確認すると、今度はidが1から始まっています。
前述の通り、TRUNCATE文は一度テーブルを削除しているためにオートナンバーがリセットされます。
このようにDELETE文とTRUNCATE文では内部の削除方法が異なりますので、状況に応じて使い分ける必要があります。

テーブルの削除

次にテーブルの削除です。 DELETE文とTRUNCATE文でもテーブルに格納されているデータはすべて削除しますが、テーブル自体がなくなるわけではありませんので、きちんと削除してあげないといけません。

手順

1.前回利用したSHOW TABLES文で存在しているテーブルを確認します。
このitemテーブルを削除していきます。

mysql> show tables from sampledb;
+--------------------+
| Tables_in_sampledb |
+--------------------+
| item               |
+--------------------+
1 row in set (0.00 sec)

2.DROP TABLE文で対象のテーブルを削除します。
構文:DROP TABLE {テーブル名}

mysql> drop table item;

結果:以下が表示されたらOKです。

Query OK, 0 rows affected (0.00 sec)

複数のテーブルを指定する場合:
以下のように対象のテーブルをカンマ区切りで指定することで、複数のテーブルを削除することができます。

mysql> drop table table_a, table_b;

3.SHOW TABLES文で存在しているテーブルを確認します。

mysql> show tables from sampledb;

結果:
Empty set (0.00 sec)

テーブルが削除されていることが確認できます。

データベースの削除

最後にデータベース自体を削除してみましょう。

手順

1.前回も行ったSHOW DATABASES文で存在しているデータベースを確認します。
この中の「sampledb」を削除します。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sampledb           |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

2.DROP DATABASE文でデータベースを削除します。
構文:DROP DATABASE {データベース名};

mysql> drop database sampledb;

結果: 以下が表示されたらOKです。

Query OK, 0 rows affected (0.01 sec)

3.SHOW DATABASES文で、データベースが削除されたかを確認します。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

「sampledb」が削除されていることを確認できます。
これで前回作成したデータベースを削除できました。

まとめ

今回はデータ、テーブル、データベースの削除方法について書かせていただきました。
いろいろ調べながらやってみた結果を自分の備忘録を兼ねてまとめているのですが、今回はDELETEとTRUNCATEでは同じことをやっているようで処理方法が違うんだなぁ〜fmfmとなりました。こういう違いを知ることが楽しいです。
初歩的な内容ばかりで恐縮ですが、また次回ノシ