delete、drop、truncate三者都是删除数据库的语句,我们经常使用的就是delete和drop,虽然都是删除数据库数据的操作,但是其中也有很大区别。
1.drop
drop可以作用与数据库,也可以作用与表。对表而言,drop是将表中数据和表结构一起删除。
下面我举一个例子能更直观的说明。
mysql> select * from table_stu; #现在有一个数据表
+---------+----------+------------+---------+-------------+-------------+-------------+
| stu_num | stu_name | stu_gender | stu_age | stu_tel | stu_remark | stu_qq |
+---------+----------+------------+---------+-------------+-------------+-------------+
| 1 | 张三 | 男 | 21 | 19891113793 | 12345678910 | 12345678910 |
| 3 | 王 | 男 | 15 | 911010101 | 911020202 | 911030303 |
+---------+----------+------------+---------+-------------+-------------+-------------+
mysql> desc table_stu; #查看这个数据表的结构
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| stu_num | char(8) | NO | | NULL | |
| stu_name | varchar(20) | NO | | NULL | |
| stu_gender | char(2) | NO | | NULL | |
| stu_age | int | NO | | NULL | |
| stu_tel | char(11) | NO | | NULL | |
| stu_remark | varchar(200) | YES | | NULL | |
| stu_qq | varchar(11) | YES | | NULL | |
+------------+--------------+------+-----+---------+-------+
7 rows in set (0.01 sec)
mysql> drop table table_stu; #使用drop删除该数据表
Query OK, 0 rows affected (0.01 sec)
mysql> select * from table_stu; #查看数据表数据,显示数据表不存在
ERROR 1146 (42S02): Table 'new_first.table_stu' doesn't exist
mysql> desc table_stu; #查看表结构,也是显示数据表不存在
ERROR 1146 (42S02): Table 'new_first.table_stu' doesn't exist
2.truncate
truncate我们不经常使用,他的作用是清空表,或者是截断表,并且只能作用与表。它是删除表的数据,不会删除表结构。
mysql> select * from new_table; #查看表数据
+----------+--------------------------+-----------+--------------+-----------+
| cs_id | cs_name | cs_credit | cs_type | cs_depart |
+----------+--------------------------+-----------+--------------+-----------+
| 5200313 | 数据库原理及应用 | 4 | 核心专业 | 信工 |
| 5203314 | 计算机导论 | 4 | 通识教育 | 信工 |
| 5219314 | 数据结构 | 5 | 专业核心 | 信工 |
| 5223013 | 大学物理 | 4 | 专业基础 | 信工 |
| 5227614 | 毕业实习 | 4 | 集中实践 | 信工 |
| 5230912 | 云计算 | 2 | 共同选修 | 信工 |
| 5236212 | 机器学习 | 2 | 共同选修 | 信工 |
| 5237514 | c语言 | 4 | 专业基础 | 信工 |
| 5245112 | 区块链 | 2 | 任意选修 | 信工 |
| 7200422 | 知识产权法 | 2 | 任意选修 | 文法 |
| 20201833 | 概率论 | 3 | 专业基础 | 基础 |
| 20202336 | 高等数学 | 6 | 专业基础 | 基础 |
| 29299131 | 劳动教育 | 1 | 集中实践 | 学务 |
+----------+--------------------------+-----------+--------------+-----------+
13 rows in set (0.00 sec)
mysql> desc new_table; #查看表结构
+-----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| cs_id | int | NO | | NULL | |
| cs_name | varchar(50) | NO | | NULL | |
| cs_credit | tinyint unsigned | YES | | NULL | |
| cs_type | char(12) | YES | | NULL | |
| cs_depart | char(6) | YES | | NULL | |
+-----------+------------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> truncate table new_table; #使用truncate方法删除表
Query OK, 0 rows affected (0.03 sec)
mysql> select * from new_table; #查看表数据,发现显示为空
Empty set (0.00 sec)
mysql> desc new_table; #但是查看表结构,显示表结构与删除之前没有变化
+-----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| cs_id | int | NO | | NULL | |
| cs_name | varchar(50) | NO | | NULL | |
| cs_credit | tinyint unsigned | YES | | NULL | |
| cs_type | char(12) | YES | | NULL | |
| cs_depart | char(6) | YES | | NULL | |
+-----------+------------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
3.delete
使用delete删除数据时,虽然也是删除表的数据,但是其中大有门道,它是一行一行的删除数据,效率远不如truncate。
我们同样举例说明:
mysql> select * from stu; #查看表数据
+--------------+-----------+---------+---------+-----------+--------------+
| stu_id | stu_name | stu_sex | stu_age | stu_major | stu_college |
+--------------+-----------+---------+---------+-----------+--------------+
| 201804550101 | 郭奎 | 男 | 22 | 计科 | 信工学院 |
| 201804550102 | 吕宇航 | 男 | 18 | 计科 | 信工学院 |
| 201804550103 | 张豪辉 | 女 | 19 | 计科 | 信工学院 |
| 201804550107 | 丁志杰 | 男 | 17 | 金融学 | 金贸学院 |
| 201804550109 | 范伟 | 男 | 19 | 金融学 | 金贸学院 |
| 201804550116 | 张依婷 | 女 | 17 | 大数据 | 信工学院 |
| 201804550120 | 张维 | 男 | 19 | 计科 | 信工学院 |
| 201804550121 | 朱柳阳 | 女 | 20 | 计科 | 信工学院 |
| 201804550144 | 谭兵炎 | 男 | 20 | 大数据 | 信工学院 |
| 201804550153 | 杨志强 | 男 | 17 | 大数据 | 信工学院 |
+--------------+-----------+---------+---------+-----------+--------------+
10 rows in set (0.00 sec)
mysql> desc stu; #查看表结构
+-------------+-------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------------+------+-----+---------+-------+
| stu_id | bigint unsigned | NO | | NULL | |
| stu_name | char(12) | NO | | NULL | |
| stu_sex | enum('男','女') | YES | | NULL | |
| stu_age | tinyint unsigned | YES | | NULL | |
| stu_major | char(9) | YES | | NULL | |
| stu_college | char(12) | YES | | NULL | |
+-------------+-------------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
mysql> delete from stu; #使用delete方法删除表
Query OK, 10 rows affected (0.01 sec)
mysql> select * from stu; #delete删除后,查看表数据,显示为空
Empty set (0.00 sec)
mysql> desc stu; #查看表结构,显示表结构仍然存在
+-------------+-------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------------+------+-----+---------+-------+
| stu_id | bigint unsigned | NO | | NULL | |
| stu_name | char(12) | NO | | NULL | |
| stu_sex | enum('男','女') | YES | | NULL | |
| stu_age | tinyint unsigned | YES | | NULL | |
| stu_major | char(9) | YES | | NULL | |
| stu_college | char(12) | YES | | NULL | |
+-------------+-------------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
总结
drop,删除整张表,包括表数据和结构。
truncate,删除表中数据,不会删除表结构。(效率高)
delete,删除表数据,不会删除表结构。(一行一行删除,效率低)