DML【数据操作语言】

2023/8/29 数据库MySQL

DQL是对数据的查操作,DML就是操作:增、删、改。数据库的基础操作就是:增删改查(CRUD)。

# 1、插入(增)

语法

# 语法1
insert into 表名(字段名1, ...) values(1, ...);

# 语法2
insert into 表名(字段名1, ...) 子查询;

# 语法3
insert into 表名 set 列名=, 列名=, ...
1
2
3
4
5
6
7
8

注意点

  • 字段个数和值的个数必须一致
  • 字段类型和值类型一致或兼容,而且一一对应
  • 可以为空的字段,可以不用插入值,或用null填充
  • 不可以为空的字段,必须插入值
  • 字段可以省略,但默认所有字段,并且顺序和表中的存储顺序一致
例子练习
#方式一:经典的插入
#1.插入的值的类型要与列的类型一致或兼容
INSERT INTO beauty(id, NAME, sex, borndate, phone, photo, boyfriend_id)
VALUES (13, '唐艺昕', '女', '1990-4-23', '1898888888', NULL, 2);

#2.不可以为null的列必须插入值。可以为null的列如何插入值?
#方式一:显式
INSERT INTO beauty(id, NAME, sex, borndate, phone, photo, boyfriend_id)
VALUES (14, '马丽', '女', '1980-5-23', '1898888888', NULL, 2);
#方式二:隐式
INSERT INTO beauty(id, NAME, sex, phone)
VALUES (15, '娜扎', '女', '1388888888');

#3.列的顺序可以调换,但要与值对应
INSERT INTO beauty(NAME, sex, id, phone)
VALUES ('蒋欣', '女', 16, '110');

#4.列数和值的个数必须一致
INSERT INTO beauty(NAME, sex, id, phone, borndate) #错误❌ 不匹配
VALUES ('关晓彤', '女', 17, '110');

#5.可以省略列名,默认所有列,而且列的顺序和表中列的顺序一致
INSERT INTO beauty
VALUES (18, '梁缘', '男', NULL, '119', NULL, NULL);

#方式二:
INSERT INTO beauty
SET id=19, NAME='刘涛', phone='999';

#两种方式大pk ★

#1、方式一支持插入多行,方式二不支持
INSERT INTO beauty
VALUES (23, '唐艺昕1', '女', '1990-4-23', '1898888888', NULL, 2)
     , (24, '唐艺昕2', '女', '1990-4-23', '1898888888', NULL, 2)
     , (25, '唐艺昕3', '女', '1990-4-23', '1898888888', NULL, 2);

#2、方式一支持子查询,方式二不支持
INSERT INTO beauty(id, NAME, phone)
SELECT 26, '宋茜', '11809866';

INSERT INTO beauty(id, NAME, phone)
SELECT id, boyname, '1234567'
FROM boys
WHERE id < 3;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

# 2、删除(删)

语法

# 单表的删除
delete from 表名 where 筛选条件;

# sql99语法
delete 别名1, 别名2 from1 别名1 inner|left|right join2 别名2 on 连接条件
where 筛选条件 limit 条目数

# truncate 清空全表(慎用),包括自增序列也清除
truncate table 表名;
1
2
3
4
5
6
7
8
9

注意点

  • delete可以加where条件,truncate不能加where
  • truncate删除,效率高一丢丢
  • 假如要删除的表中有自增长列,如果用delete删除后,再插入数据,自增长列的值从断点开始,而truncate删除后,再插入数据,自增长列的值从1开始
  • truncate删除没有返回值,delete删除返回删除的行数
  • truncate删除不能回滚,delete删除可以回滚
例子练习
#方式一:delete
#1.单表的删除
#案例:删除手机号以9结尾的女神信息
DELETE
FROM beauty
WHERE phone LIKE '%9';

#2.多表的删除

#案例:删除张无忌的女朋友的信息
DELETE b
FROM beauty b
         INNER JOIN boys bo ON b.`boyfriend_id` = bo.`id`
WHERE bo.`boyName` = '张无忌';

#案例:删除黄晓明的信息以及他女朋友的信息
DELETE b, bo
FROM beauty b
         INNER JOIN boys bo ON b.`boyfriend_id` = bo.`id`
WHERE bo.`boyName` = '黄晓明';

#方式二:truncate语句

#案例:将魅力值>100的男神信息删除
TRUNCATE TABLE boys WHERE userCP >100;	#❌

#delete pk truncate【面试题★】
#区别
DELETE FROM boys;
TRUNCATE TABLE boys;
INSERT INTO boys (boyname, usercp)
VALUES ('张飞', 100),
       ('刘备', 100),
       ('关云长', 100);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

# 2、修改(改)

语法

update 表名 set=新值,=新值, ... where 筛选条件;

# sql99语法
update1 别名 inner|left|right join2 别名 on 连接条件
set=, ...
where 筛选条件;
1
2
3
4
5
6
例子练习
#1.修改单表的记录

#案例1:修改beauty表中姓唐的女神的电话为13899888899
UPDATE beauty
SET phone = '13899888899'
WHERE NAME LIKE '唐%';

#案例2:修改boys表中id为2的名称为张飞,魅力值 10
UPDATE boys
SET boyname='张飞', usercp=10
WHERE id = 2;


#2.修改多表的记录

#案例 1:修改张无忌的女朋友的手机号为114
UPDATE boys bo
    INNER JOIN beauty b ON bo.`id` = b.`boyfriend_id`
SET b.`phone`='114',
    bo.`userCP`=1000
WHERE bo.`boyName` = '张无忌';

#案例2:修改没有男朋友的女神的男朋友编号都为2号
UPDATE boys bo
    RIGHT JOIN beauty b ON bo.`id` = b.`boyfriend_id`
SET b.`boyfriend_id`=2
WHERE bo.`id` IS NULL;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27