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)