数据操作语言DML

Data Manipulation Language概述

即"数据操纵语言",简称"DML"。

用户通过它可以实现对数据库的基本操作(例如,对表中数据的插入(INSERT)、删除(DELETE),修改(UPDATE)和查询(SELECT)等操作)。但由于SELECT操作是非常频繁的,因此一般单独拿出来讲,称之为数据查询语言(Data Query Language,简称"DQL")。

综上所述,此文章介绍插入(INSERT)、删除(DELETE),修改(UPDATE)的操作,以及基础的查询(SELECT)语句使用

插入-INSERT

# 插入单行:
mysql> INSERT INTO student (id,name,age,gender,time_of_enrollment,address,mobile_number,remarks)VALUE (1,'唐三',21,'Male','2017-04-01 10:00:00','斗罗大陆','18866669999','男一号');

# 插入多行:
mysql> INSERT INTO student (id,name,age,gender,time_of_enrollment,address,mobile_number,remarks)VALUES (2,'小舞',18,'Female','2017-04-29 10:00:00','星斗大森林','17766668888','女一号'),(3,'戴沐白',23,'Male','2017-05-20 10:00:00','星罗帝国','18877779999','男二号'),(4,'宁荣荣',19,'Female','2017-06-03 10:00:00','七宝琉璃宗',19966665555,'女二号');

更新-UPDATE

UPDATE student SET name='千手修罗唐三' WHERE id=1;

删除-DELETE

DELETE FROM  student WHERE id=8;

扩展知识

伪删除-将DELETE语句更换为UPDATE语句

# 原表结构如下所示:
mysql> DESC student;
+--------------------+-----------------------+------+-----+---------+----------------+
| Field              | Type                  | Null | Key | Default | Extra          |
+--------------------+-----------------------+------+-----+---------+----------------+
| id                 | int(11)               | NO   | PRI | NULL    | auto_increment |
| name               | varchar(30)           | NO   |     | NULL    |                |
| age                | tinyint(3) unsigned   | YES  |     | NULL    |                |
| gender             | enum('Male','Female') | YES  |     | Male    |                |
| time_of_enrollment | datetime              | YES  |     | NULL    |                |
| address            | varchar(255)          | NO   |     | NULL    |                |
| mobile_number      | bigint(20)            | NO   | UNI | NULL    |                |
| remarks            | varchar(255)          | YES  |     | NULL    |                |
+--------------------+-----------------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)
        
# 原表数据如下所示:
mysql> SELECT * FROM student;
+----+--------------------+------+--------+---------------------+-----------------+---------------+-----------+
| id | name               | age  | gender | time_of_enrollment  | address         | mobile_number | remarks   |
+----+--------------------+------+--------+---------------------+-----------------+---------------+-----------+
|  1 | 千手修罗唐三       |   21 | Male   | 2017-04-01 10:00:00 | 斗罗大陆        |   18866669999 | 男一号    |
|  2 | 小舞               |   18 | Female | 2017-04-29 10:00:00 | 星斗大森林      |   17766668888 | 女一号    |
|  3 | 戴沐白             |   23 | Male   | 2017-05-20 10:00:00 | 星罗帝国        |   18877779999 | 男二号    |
|  4 | 宁荣荣             |   19 | Female | 2017-06-03 10:00:00 | 七宝琉璃宗      |   19966665555 | 女二号    |
|  5 | 朱竹青             |   20 | Female | 2017-06-10 10:00:00 | 星罗帝国        |   15566669999 | 女二号    |
|  6 | 马红俊             |   20 | Male   | 2017-07-01 10:00:00 | 天斗帝国        |   18888888888 | 男二号    |
|  7 | 奥斯卡             |   22 | Male   | 2017-07-08 10:00:00 | 天斗帝国        |   19999999999 | 男二号    |
+----+--------------------+------+--------+---------------------+-----------------+---------------+-----------+
7 rows in set (0.00 sec)

# 删除id为2的数据的常规操作:DELTE FROM student WHRER id=2;

# 伪删除id为2的数据操作流程:
# 1. 修改表原表结构:
mysql> DESC student;
+--------------------+-----------------------+------+-----+---------+----------------+
| Field              | Type                  | Null | Key | Default | Extra          |
+--------------------+-----------------------+------+-----+---------+----------------+
| id                 | int(11)               | NO   | PRI | NULL    | auto_increment |
| name               | varchar(30)           | NO   |     | NULL    |                |
| age                | tinyint(3) unsigned   | YES  |     | NULL    |                |
| gender             | enum('Male','Female') | YES  |     | Male    |                |
| time_of_enrollment | datetime              | YES  |     | NULL    |                |
| address            | varchar(255)          | NO   |     | NULL    |                |
| mobile_number      | bigint(20)            | NO   | UNI | NULL    |                |
| remarks            | varchar(255)          | YES  |     | NULL    |                |
+--------------------+-----------------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

mysql> ALTER TABLE student ADD COLUMN deleted TINYINT NOT NULL DEFAULT 0 COMMENT '标记改行是否已经被删除,如果为1表示被标记已经删除,如果为0则表示未删除.';
Query OK, 0 rows affected (0.17 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> DESC student;
+--------------------+-----------------------+------+-----+---------+----------------+
| Field              | Type                  | Null | Key | Default | Extra          |
+--------------------+-----------------------+------+-----+---------+----------------+
| id                 | int(11)               | NO   | PRI | NULL    | auto_increment |
| name               | varchar(30)           | NO   |     | NULL    |                |
| age                | tinyint(3) unsigned   | YES  |     | NULL    |                |
| gender             | enum('Male','Female') | YES  |     | Male    |                |
| time_of_enrollment | datetime              | YES  |     | NULL    |                |
| address            | varchar(255)          | NO   |     | NULL    |                |
| mobile_number      | bigint(20)            | NO   | UNI | NULL    |                |
| remarks            | varchar(255)          | YES  |     | NULL    |                |
| deleted            | tinyint(4)            | NO   |     | 0       |                |
+--------------------+-----------------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)

mysql> SELECT * FROM student;
+----+--------------------+------+--------+---------------------+-----------------+---------------+-----------+---------+
| id | name               | age  | gender | time_of_enrollment  | address         | mobile_number | remarks   | deleted |
+----+--------------------+------+--------+---------------------+-----------------+---------------+-----------+---------+
|  1 | 千手修罗唐三       |   21 | Male   | 2017-04-01 10:00:00 | 斗罗大陆        |   18866669999 | 男一号    |       0 |
|  2 | 小舞               |   18 | Female | 2017-04-29 10:00:00 | 星斗大森林      |   17766668888 | 女一号    |       0 |
|  3 | 戴沐白             |   23 | Male   | 2017-05-20 10:00:00 | 星罗帝国        |   18877779999 | 男二号    |       0 |
|  4 | 宁荣荣             |   19 | Female | 2017-06-03 10:00:00 | 七宝琉璃宗      |   19966665555 | 女二号    |       0 |
|  5 | 朱竹青             |   20 | Female | 2017-06-10 10:00:00 | 星罗帝国        |   15566669999 | 女二号    |       0 |
|  6 | 马红俊             |   20 | Male   | 2017-07-01 10:00:00 | 天斗帝国        |   18888888888 | 男二号    |       0 |
|  7 | 奥斯卡             |   22 | Male   | 2017-07-08 10:00:00 | 天斗帝国        |   19999999999 | 男二号    |       0 |
+----+--------------------+------+--------+---------------------+-----------------+---------------+-----------+---------+
7 rows in set (0.00 sec)

# 将删除语句更换为UPDATE
mysql> SELECT * FROM student;
+----+--------------------+------+--------+---------------------+-----------------+---------------+-----------+---------+
| id | name               | age  | gender | time_of_enrollment  | address         | mobile_number | remarks   | deleted |
+----+--------------------+------+--------+---------------------+-----------------+---------------+-----------+---------+
|  1 | 千手修罗唐三       |   21 | Male   | 2017-04-01 10:00:00 | 斗罗大陆        |   18866669999 | 男一号    |       0 |
|  2 | 小舞               |   18 | Female | 2017-04-29 10:00:00 | 星斗大森林      |   17766668888 | 女一号    |       0 |
|  3 | 戴沐白             |   23 | Male   | 2017-05-20 10:00:00 | 星罗帝国        |   18877779999 | 男二号    |       0 |
|  4 | 宁荣荣             |   19 | Female | 2017-06-03 10:00:00 | 七宝琉璃宗      |   19966665555 | 女二号    |       0 |
|  5 | 朱竹青             |   20 | Female | 2017-06-10 10:00:00 | 星罗帝国        |   15566669999 | 女二号    |       0 |
|  6 | 马红俊             |   20 | Male   | 2017-07-01 10:00:00 | 天斗帝国        |   18888888888 | 男二号    |       0 |
|  7 | 奥斯卡             |   22 | Male   | 2017-07-08 10:00:00 | 天斗帝国        |   19999999999 | 男二号    |       0 |
+----+--------------------+------+--------+---------------------+-----------------+---------------+-----------+---------+
7 rows in set (0.01 sec)

mysql> UPDATE student SET deleted=1 WHERE id=2;
Query OK, 1 row affected (0.28 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM student;
+----+--------------------+------+--------+---------------------+-----------------+---------------+-----------+---------+
| id | name               | age  | gender | time_of_enrollment  | address         | mobile_number | remarks   | deleted |
+----+--------------------+------+--------+---------------------+-----------------+---------------+-----------+---------+
|  1 | 千手修罗唐三       |   21 | Male   | 2017-04-01 10:00:00 | 斗罗大陆        |   18866669999 | 男一号    |       0 |
|  2 | 小舞               |   18 | Female | 2017-04-29 10:00:00 | 星斗大森林      |   17766668888 | 女一号    |       1 |
|  3 | 戴沐白             |   23 | Male   | 2017-05-20 10:00:00 | 星罗帝国        |   18877779999 | 男二号    |       0 |
|  4 | 宁荣荣             |   19 | Female | 2017-06-03 10:00:00 | 七宝琉璃宗      |   19966665555 | 女二号    |       0 |
|  5 | 朱竹青             |   20 | Female | 2017-06-10 10:00:00 | 星罗帝国        |   15566669999 | 女二号    |       0 |
|  6 | 马红俊             |   20 | Male   | 2017-07-01 10:00:00 | 天斗帝国        |   18888888888 | 男二号    |       0 |
|  7 | 奥斯卡             |   22 | Male   | 2017-07-08 10:00:00 | 天斗帝国        |   19999999999 | 男二号    |       0 |
+----+--------------------+------+--------+---------------------+-----------------+---------------+-----------+---------+
7 rows in set (0.00 sec)

3. 将SELETE语句加上WHERE子句进行过滤
mysql> SELECT * FROM student;
+----+--------------------+------+--------+---------------------+-----------------+---------------+-----------+---------+
| id | name               | age  | gender | time_of_enrollment  | address         | mobile_number | remarks   | deleted |
+----+--------------------+------+--------+---------------------+-----------------+---------------+-----------+---------+
|  1 | 千手修罗唐三       |   21 | Male   | 2017-04-01 10:00:00 | 斗罗大陆        |   18866669999 | 男一号    |       0 |
|  2 | 小舞               |   18 | Female | 2017-04-29 10:00:00 | 星斗大森林      |   17766668888 | 女一号    |       1 |
|  3 | 戴沐白             |   23 | Male   | 2017-05-20 10:00:00 | 星罗帝国        |   18877779999 | 男二号    |       0 |
|  4 | 宁荣荣             |   19 | Female | 2017-06-03 10:00:00 | 七宝琉璃宗      |   19966665555 | 女二号    |       0 |
|  5 | 朱竹青             |   20 | Female | 2017-06-10 10:00:00 | 星罗帝国        |   15566669999 | 女二号    |       0 |
|  6 | 马红俊             |   20 | Male   | 2017-07-01 10:00:00 | 天斗帝国        |   18888888888 | 男二号    |       0 |
|  7 | 奥斯卡             |   22 | Male   | 2017-07-08 10:00:00 | 天斗帝国        |   19999999999 | 男二号    |       0 |
+----+--------------------+------+--------+---------------------+-----------------+---------------+-----------+---------+
7 rows in set (0.00 sec)

mysql> SELECT * FROM student WHERE deleted=0;
+----+--------------------+------+--------+---------------------+-----------------+---------------+-----------+---------+
| id | name               | age  | gender | time_of_enrollment  | address         | mobile_number | remarks   | deleted |
+----+--------------------+------+--------+---------------------+-----------------+---------------+-----------+---------+
|  1 | 千手修罗唐三       |   21 | Male   | 2017-04-01 10:00:00 | 斗罗大陆        |   18866669999 | 男一号    |       0 |
|  3 | 戴沐白             |   23 | Male   | 2017-05-20 10:00:00 | 星罗帝国        |   18877779999 | 男二号    |       0 |
|  4 | 宁荣荣             |   19 | Female | 2017-06-03 10:00:00 | 七宝琉璃宗      |   19966665555 | 女二号    |       0 |
|  5 | 朱竹青             |   20 | Female | 2017-06-10 10:00:00 | 星罗帝国        |   15566669999 | 女二号    |       0 |
|  6 | 马红俊             |   20 | Male   | 2017-07-01 10:00:00 | 天斗帝国        |   18888888888 | 男二号    |       0 |
|  7 | 奥斯卡             |   22 | Male   | 2017-07-08 10:00:00 | 天斗帝国        |   19999999999 | 男二号    |       0 |
+----+--------------------+------+--------+---------------------+-----------------+---------------+-----------+---------+
6 rows in set (0.00 sec)

DELETE FROM student, DROP TABLE student, TRUNCATE TABLE student有何区别?

首先DELETE FROM student, DROP TABLE student, TRUNCATE TABLE student这三条SQL语句均能删除全表数据,但他们的确是存在一定的差异,这也是不争的事实。

DELETE FROM student:

  1. 是逻辑上的删除,并没有真正从磁盘上删除,只是在存储层面打标记,磁盘空间不立即释放,高水位线(HWM)不会降低;
  2. 当数据量较大时,操作会很慢,因为他要将全表进行扫描,而后对每行打标记改行被删除,理论上这种删除通过一定的手段是可以恢复数据的;

DROP TABLE student:

  1. 将表结构(元数据)和数据行物理层次删除;
  2. 该删除操作是不可恢复的,因为已经在物理层上删除数据,想要恢复也只能通过备份来进行恢复了;

TRUNCATE TABLE student:

  1. 清空表中所有的数据页,物理层次删除全表数据,磁盘空间立即释放,高水位线(HWM)会初始化为0;
  2. 其实TRUNCATE我们可以理解为将原表的表结构复制并创建了一张新表,新数据直接写入到新建的表中,他不会去逐行删除之前的数据(之前的原始数据也不会有相应的引用,从而被MySQL进行垃圾回收);
posted @ 2025-08-31 18:15  阿峰博客站  阅读(17)  评论(0)    收藏  举报