一、简介
DML即数据操作语言,实现对表和视图中数据的增删改操作。
常用DML命令有:
insert: 插入数据
delete: 删除数据
update: 更新数据
二、insert
语法格式:
insert [into] 表名|视图名[(列名表)] values(数据表)
• 列名表用于指定该数据表的列名,可以指定一列或者多列,顺序可以与表的列顺序不同。指定多个列,必须用逗号分隔。
• 未被指定的列必须支持空值或者默认值,如果默认值存在,则该列使用默认值。除一些特殊情况外,不然会报错。
• 数据表提供向表中插入的数据,如果提供多个数据,也需要逗号分隔。
• 数据表中提供的数据与列名表指定的列名个数、数据类型和顺序必须一致。
• 当数据表中提供的数据与表定义的列在个数和顺序上完全一致时,列名表可以省略。
实例演示:(承接上篇文章建立的表)
1、添加单条数据
mysql> insert into stu(id,name,age,sex,adtime) values(1,'小明',12,'male','2020-9-2');
mysql> insert into stu values(2,'小红',12,'female','2020-9-1');
mysql> insert into stu(name,age) values('小刚',14);
mysql> select * from stu;
+----+--------+-----+--------+---------------------+
| id | name | age | sex | adtime |
+----+--------+-----+--------+---------------------+
| 1 | 小明 | 12 | male | 2020-09-02 00:00:00 |
| 2 | 小红 | 12 | female | 2020-09-01 00:00:00 |
| 3 | 小刚 | 14 | male | 2020-09-01 00:00:00 |
+----+--------+-----+--------+---------------------+
2、一次添加多条数据:
mysql> insert into stu(name,age,sex) values('小亮',11,'male'),('小爱','10','female');
mysql> insert into stu(name,age,sex) select '小雨',12,'male' union all select '小丽',10,'female';
mysql> select * from stu;
+----+--------+-----+--------+---------------------+
| id | name | age | sex | adtime |
+----+--------+-----+--------+---------------------+
| 1 | 小明 | 15 | male | 2020-09-01 00:00:00 |
| 2 | 小红 | 16 | female | 2020-09-01 00:00:00 |
| 3 | 小刚 | 16 | male | 2020-09-01 00:00:00 |
| 4 | 小亮 | 11 | male | 2020-09-01 00:00:00 |
| 5 | 小爱 | 10 | female | 2020-09-01 00:00:00 |
| 6 | 小雨 | 12 | male | 2020-09-01 00:00:00 |
| 7 | 小丽 | 10 | female | 2020-09-01 00:00:00 |
+----+--------+-----+--------+---------------------+
3、将其它表的多行数据插入到现有表中
此方式必须保证接收新数据行的表中各列的数据类型与源表中相应列的数据类型一致。
mysql> select * from stu;
+----+--------+-----+--------+---------------------+
| id | name | age | sex | adtime |
+----+--------+-----+--------+---------------------+
| 1 | 小明 | 12 | male | 2020-09-02 00:00:00 |
| 2 | 小红 | 12 | female | 2020-09-01 00:00:00 |
| 3 | 小刚 | 14 | male | 2020-09-01 00:00:00 |
+----+--------+-----+--------+---------------------+
mysql> create table stu1 (
-> id int not null primary key auto_increment comment '学号',
-> name varchar(20) not null comment '姓名',
-> age tinyint unsigned not null default 0 comment '年龄',
-> sex enum('male','female') not null comment '性别',
-> adtime datetime not null default '2020-9-1' comment '入学时间'
-> )engine=innodb charset=utf8mb4 comment '学生表';
mysql> insert stu1 select id,name,age,sex,adtime from stu;
或者:
mysql> insert stu1 select * from stu;
mysql> select * from stu1;
+----+--------+-----+--------+---------------------+
| id | name | age | sex | adtime |
+----+--------+-----+--------+---------------------+
| 1 | 小明 | 12 | male | 2020-09-02 00:00:00 |
| 2 | 小红 | 12 | female | 2020-09-01 00:00:00 |
| 3 | 小刚 | 14 | male | 2020-09-01 00:00:00 |
+----+--------+-----+--------+---------------------+
上面是将stu表中的所有数据插入到新表stu1中,也可以使用 where 子句指定需要插入新表的数据。
例如,将性别为男的数据行插入到新表stu1中:
mysql> delete from stu1;
mysql> insert stu1 select * from stu where sex='male';
mysql> select * from stu1;
+----+--------+-----+------+---------------------+
| id | name | age | sex | adtime |
+----+--------+-----+------+---------------------+
| 1 | 小明 | 12 | male | 2020-09-02 00:00:00 |
| 3 | 小刚 | 14 | male | 2020-09-01 00:00:00 |
+----+--------+-----+------+---------------------+
三、update
语法格式:
update 表名 set 列名1=表达式1,列名2=表达式2,...列名n=表达式n [ where 逻辑表达式 ]
• 如果行的更新违反了约束或者更新值是不兼容的数据类型,则会报错。
• 表达式可以是 select 子查询语句,它将把查询到的结果赋值给相依的列名。
• 用 where 子句指定需要更新的行,如果没有使用 where 子句,则更新表中所有行。
示例演示:
1、更改所有人年龄为16
mysql> update stu set age=16;
mysql> select * from stu;
+----+--------+-----+--------+---------------------+
| id | name | age | sex | adtime |
+----+--------+-----+--------+---------------------+
| 1 | 小明 | 16 | male | 2020-09-01 00:00:00 |
| 2 | 小红 | 16 | female | 2020-09-01 00:00:00 |
| 3 | 小刚 | 16 | male | 2020-09-01 00:00:00 |
+----+--------+-----+--------+---------------------+
2、更改小明年龄为15
mysql> update stu set age=age-1 where name='小明';
mysql> select * from stu;
+----+--------+-----+--------+---------------------+
| id | name | age | sex | adtime |
+----+--------+-----+--------+---------------------+
| 1 | 小明 | 15 | male | 2020-09-01 00:00:00 |
| 2 | 小红 | 16 | female | 2020-09-01 00:00:00 |
| 3 | 小刚 | 16 | male | 2020-09-01 00:00:00 |
+----+--------+-----+--------+---------------------+
四、delete
语法格式:
delete from 表名 [ where 逻辑表达式 ]
• 没有 where 子句,将删除表中所有行,但是并不删除表结构。
示例演示:
mysql> delete from stu where name='小丽';
Query OK, 1 row affected (0.00 sec)
mysql> delete from stu where name='小明' or name='小红';
Query OK, 2 row affected (0.00 sec)
mysql> delete from stu;
Query OK, 4 rows affected (0.00 sec)
mysql> select * from stu;
Empty set (0.00 sec)