MySQL讲义第8讲——数据更新之 DELETE


文章目录

  • MySQL讲义第8讲——数据更新之 DELETE
  • 一、使用 delete 命令删除表中的数据
  • 二、使用 truncate 命令删除表中的数据


MySQL 数据库和其它的关系型数据库一样,支持数据的增(插入:insert)、删(删除:delete)、改(更新:update)、查(查询:select)操作。

如果要删除表中的部分数据,使用 delete 命令,如果要删除表中的全部数据,可以使用 delete 命令或者 truncate命令。

一、使用 delete 命令删除表中的数据

格式如下:

DELETE FROM 表名
    [WHERE 条件]
    [ORDER BY ...]
    [LIMIT row_count]
    
说明:
(1) ORDER BY:按照指定的顺序对行删除操作。
(2) LIMIT:限制可删除的行数。

举例:

(1)从 certificate 表删除 phone 为 133 开头的记录

mysql> select * from certificate;
+------+--------+-------------+-----------------+
| s_no | s_name | phone       | certificate     |
+------+--------+-------------+-----------------+
|    1 | Jack   | 13703735566 | 英语四级        |
|    2 | Mark   | 13783735566 | 英语四级        |
|    3 | Rose   | 13783735522 | 英语六级        |
|    4 | John   | 18503735214 | 计算机二级      |
|    5 | Jerry  | 13303735266 | 英语四级        |
+------+--------+-------------+-----------------+
5 rows in set (0.00 sec)

mysql> delete from certificate where phone like '133%';
Query OK, 1 row affected (0.02 sec)

mysql> select * from certificate;
+------+--------+-------------+-----------------+
| s_no | s_name | phone       | certificate     |
+------+--------+-------------+-----------------+
|    1 | Jack   | 13703735566 | 英语四级        |
|    2 | Mark   | 13783735566 | 英语四级        |
|    3 | Rose   | 13783735522 | 英语六级        |
|    4 | John   | 18503735214 | 计算机二级      |
+------+--------+-------------+-----------------+
4 rows in set (0.00 sec)

(2)删除时限制删除的行数:从 certificate 表删除 phone 为 137 开头的记录,但一次最多删除两行。并且按学号降序的顺序删除。

mysql> select * from certificate;
+------+--------+-------------+-----------------+
| s_no | s_name | phone       | certificate     |
+------+--------+-------------+-----------------+
|    1 | Jack   | 13703735566 | 英语四级        |
|    2 | Mark   | 13783735566 | 英语四级        |
|    3 | Rose   | 13783735522 | 英语六级        |
|    4 | John   | 18503735214 | 计算机二级      |
+------+--------+-------------+-----------------+
4 rows in set (0.00 sec)

mysql> delete from certificate where phone like '137%'
    -> order by s_no desc
    -> limit 2;
Query OK, 2 rows affected (0.07 sec)

mysql> select * from certificate;
+------+--------+-------------+-----------------+
| s_no | s_name | phone       | certificate     |
+------+--------+-------------+-----------------+
|    1 | Jack   | 13703735566 | 英语四级        |
|    4 | John   | 18503735214 | 计算机二级      |
+------+--------+-------------+-----------------+
2 rows in set (0.01 sec)

二、使用 truncate 命令删除表中的数据

使用 truncate 命令可以删除表中的所有数据,和不带条件的 delete 命令结果相同。两个命令的区别有两点:
(1)delete 命令在删除时逐行判断和删除,效率较低;truncate 命令是直接删除表,然后重建表,因此删除的效率很高。
(2)当表中有自增字段时,如果使用 delete 命令删除全部记录,当重新插入记录时,自增字段的值从删除之前的编号的最大值开始增加。如果使用 truncate 命令删除全部记录,重新插入记录时,自增字段的值将重新开始编号。

truncate 命令的语法如下:

truncate [TABLE] 表名;

举例:

(1)创建表 t1,id 为自增字段,初始值为 1,然后插入数据。根据 t1 表生成 t2,t2 表的结构和数据与 t1 表完全相同。

结果如下:

mysql> desc t1;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int(11)  | NO   | PRI | NULL    | auto_increment |
| name  | char(20) | YES  |     | NULL    |                |
+-------+----------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> select * from t1;
+----+-------+
| id | name  |
+----+-------+
|  1 | zhang |
|  2 | wang  |
|  3 | li    |
|  4 | zhao  |
|  5 | liu   |
+----+-------+
5 rows in set (0.00 sec)

mysql> create table t2 like t1;
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t2 select * from t1;
Query OK, 5 rows affected (0.08 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> desc t2;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int(11)  | NO   | PRI | NULL    | auto_increment |
| name  | char(20) | YES  |     | NULL    |                |
+-------+----------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> select * from t2;
+----+-------+
| id | name  |
+----+-------+
|  1 | zhang |
|  2 | wang  |
|  3 | li    |
|  4 | zhao  |
|  5 | liu   |
+----+-------+
5 rows in set (0.00 sec)

(2)使用 delete 命令删除 t1 表中的所有数据,然后插入新记录

可以看到,新插入的记录 id 从 6 开始编号。

mysql> delete from t1;
Query OK, 5 rows affected (0.02 sec)

mysql> insert into t1(name) values('Tom'),('Jack'),('Jerry');
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+----+-------+
| id | name  |
+----+-------+
|  6 | Tom   |
|  7 | Jack  |
|  8 | Jerry |
+----+-------+
3 rows in set (0.00 sec)

(3)使用 truncate 命令删除 t2 表中的所有数据,然后插入新记录

可以看到,新插入的记录 id 从 1 重新开始编号。

mysql> truncate table t2;
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t2(name) values('Tom'),('Jack'),('Jerry');
Query OK, 3 rows affected (0.03 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from t2;
+----+-------+
| id | name  |
+----+-------+
|  1 | Tom   |
|  2 | Jack  |
|  3 | Jerry |
+----+-------+
3 rows in set (0.00 sec)