<span>DML -- 数据操作语言</span>
DML:数据操作语言
概述
- 数据操作语言
- 插入:insert
- 修改:update
- 删除:delete
一、插入语句
插入方式一:经典的插入方式
-
语法
insert into 表名(列1, ...) values(值1, ...);
-
插入的值的类型要与列的类型一致或者兼容
INSERT INTO beauty(id, name, sex, borndate, phone, photo, boyfriend_id) VALUES(13, 'AAA', '女', '1990-4-23', '18888888888',null ,2);
-
可以为NULL的列插入值
-
方式一:直接在对应列写NULL
INSERT INTO beauty(id, name, sex, borndate, phone, photo, boyfriend_id) VALUES(14, 'BBB', '女', '1990-4-24', '18888888888',null ,2);
-
方式二:直接不要有对应列
INSERT INTO beauty(id, name, sex, borndate, phone) VALUES(15, 'CCC', '女', '1990-4-25', '18888888888');
-
-
列的顺序可以调换,但是必须一一对应
INSERT INTO beauty(name, sex, id, phone) VALUES('DDD', '女', 16, '100100');
-
列数和值的个数必须一致
-- ! 会发生错误,因为列数和值的个数必须一致 INSERT INTO beauty(name, sex, id, phone, boyfriend_id) VALUES('DDD', '女', 17, '101');
-
可以省略列名,默认为所有列,而且列的顺序和表中列的顺序时一致的
INSERT INTO beauty VALUES(17, 'EEE', '女', NULL, '1001', NULL, '4');
插入方式二:键值对方式插入
-
语法
INSERT INTO 表名 SET 列1=值1, 列2=值2, ...;
实例:
INSERT INTO beauty SET id=18, name='FFF', sex='女', phone='10010';
两种插入方式对比
-
方式一支持一次性插入多行
INSERT INTO beauty VALUES(19, 'EEA', '女', NULL, '1001', NULL, '4'), (20, 'EEB', '女', NULL, '1001', NULL, '4'), (21, 'EEC', '女', NULL, '1001', NULL, '4');
-
方式一支持子查询,方式二不支持
INSERT INTO beauty(id, name, phone) SELECT 24, 'GGG', '188100'; INSERT INTO beauty(id, name, phone) SELECT id+24, boyname, '123456' from boys WHERE id<3;
二、修改语句
语法
-
修改单表中的记录(重要)
UPDATE 表 SET 列1=值1, 列2=值2, ... WHERE 筛选条件 LIMIT 限定行数; # sql_safe_updates选项开启时就需要注意这个问题;
-
修改多表中的记录(补充)
-- SQL92语法: UPDATE 表1 别名, 表2 别名, ... SET 列1 = 值1, 列2 = 值2, ... WHERE 连接条件 AND 筛选条件 LIMIT 限制条件; -- SQL99语法: UPDATE 表1 别名 INNER | LEFT/RIGHT OUTER | FULL JOIN 表2 别名 ON 连接条件 WHERE 筛选条件 LIMIT 限制条件;
修改单表中的记录
-
案例1:修改bueaty表中,第一个字母是E的电话都改为13899999999
UPDATE beauty SET phone = '13899999998' WHERE name like 'E%' # 由于这里不是主键列就需要LIMIT限制 LIMIT 10;
-
案例2:修改boys表中id为2的名称为张飞,魅力值为10
UPDATE boys SET boyname = '张飞', usercp = 10 WHERE id = 2; # 由于这里是主键列就不用LIMIT了
修改多表的记录
-
案例1:修改张无忌女朋友的电话号为114
UPDATE boys bo INNER JOIN beauty b ON b.boyfriend_id = bo.id SET b.phone = '112' WHERE bo.boyname = '张无忌';
-
案例2:修改没有男朋友的女生的男朋友编号都为张飞
UPDATE beauty b LEFT OUTER JOIN boys bo ON b.boyfriend_id = bo.id SET b.boyfriend_id = 2 WHERE b.id IS NULL;
三、删除语句
语法
-
方式一:DELETE
删除的时候整条记录都被删除
-- 1. 单表的删除 DELETE FROM 表 WHERE 筛选条件; -- 2. 多表的删除 DELETE 表1别名, 表2别名 FROM 表1 别名 INNER | LEFT/RIGHT OUTER | FULL JOIN 表2 别名 ON 连接条件 WHERE 筛选条件 LIMIT 限制条件;
-
方式二:TRUNCATE
删除整个表的数据
TRUNCATE TABLE 表;
方式一:DELETE
-
单表的删除
-
案例:删除手机号以9结尾的女神信息
DELETE FROM beauty WHERE phone LIKE '%9'; DELETE FROM beauty WHERE id = ANY ( SELECT id from beauty WHERE phone LIKE '%0' ) LIMIT 10; # 安全模式
-
-
多表的删除
-
案例:删除张无忌女朋友的信息
DELETE FROM beauty WHERE id = ANY ( SELECT b.id FROM beauty b INNER JOIN boys bo ON b.boyfriend_id = bo.id WHERE bo.boyName = '张无忌' );
-
案例:删除黄晓明的信息及其女朋友的信息
-- sql_safe_updates=OFF DELETE b, bo FROM beauty b INNER JOIN boys bo ON b.boyfriend_id = bo.id WHERE bo.boyName = '黄晓明'; -- sql_safe_updates=ON DELETE bo, b FROM boys bo INNER JOIN beauty b ON b.boyfriend_id = bo.id INNER JOIN ( SELECT id FROM boys WHERE boyName = '黄晓明' ) IDS ON true WHERE bo.id = IDS.id;
-
方式二:TRUNCATE
-
案例:将魅力值>100的男神信息删除(不可能实现,TRUNCATE只能删除整个表里面的数据)
TRUNCATE TABLE boys;
DELETE 和 TRUNCATE 的对比[面试题]
-
DELETE 可以加 WHERE 条件; TRUNCATE 不能加
-
TRUNCATE 执行效率更高
-
加入要删除的表中,有自增长(Auto Increase)列,如果用DELETE删除后,再插入数据,自增长的值从断电开始,而TRUNCATE删除后,再插入数据,自增长列的值从1开始
-- 执行下面的表以后,可以发现,最后的值不是从1开始的 DELETE FROM boys; INSERT INTO boys(boyName, usercp) VALUES('张飞', 100), ('刘备', 200), ('关羽', 200); -- 执行下面的表以后,最后的值从1开始 TRUNCATE TABLE boys; INSERT INTO boys(boyName, usercp) VALUES('张飞', 100), ('刘备', 200), ('关羽', 200);
-
TRUNCATE 删除以后无返回值,DELETE 删除以后有返回值
-
TRUNCATE 删除不能回滚,DELETE删除可以回滚
相关测试
-
运行以下脚本创建表my_employees
USE myemployees; CREATE TABLE my_employees( Id INT(10), First_name VARCHAR(10), Last_name VARCHAR(10), Userid VARCHAR(10), Salary DOUBLE(10,2) ); CREATE TABLE users( id INT, userid VARCHAR(10), department_id INT );
-
显示表my_employees的结构
DESC my_employees;
-
向my_employees表中插入下列数据
ID FIRST_NAME LAST_NAME USERID SALARY
1 patel Ralph Rpatel 895
2 Dancs Betty Bdancs 860
3 Biri Ben Bbiri 1100
4 Newman Chad Cnewman 750
5 Ropeburn Audrey Aropebur 1550-- 方式一:VALUES INSERT INTO my_employees VALUES(1, 'patel', 'Ralph', 'Rpatel', 895), (2,'Dancs','Betty','Bdancs',860), (3,'Biri','Ben','Bbiri',1100), (4,'Newman','Chad','Cnewman',750), (5,'Ropeburn','Audrey','Aropebur',1550); DELETE FROM my_employees; -- 方式二:SELECT INSERT INTO my_employees SELECT 1, 'patel', 'Ralph', 'Rpatel', 895 UNION SELECT 2,'Dancs','Betty','Bdancs',860 UNION SELECT 3,'Biri','Ben','Bbiri',1100 UNION SELECT 4,'Newman','Chad','Cnewman',750 UNION SELECT 5,'Ropeburn','Audrey','Aropebur',1550;
-
向users表中插入数据
1 Rpatel 10
2 Bdancs 10
3 Bbiri 20
4 Cnewman 30
5 Aropebur 40INSERT INTO users VALUES(1, 'Rpatel', 10), (2,'Bdancs',10), (3,'Bbiri',20), (4,'Cnewman',30), (5, 'Aropebur', 40);
-
将3号员工的last_name修改为“drelxer”
UPDATE my_employees
SET Last_name = 'drelxer'
WHERE Id = 3;
-
将所有工资少于900的员工的工资修改为1000
UPDATE my_employees SET Salary = 1000 WHERE Salary < 900;
-
将userid 为Bbiri的user表和my_employees表的记录全部删除
DELETE u, m FROM users u INNER JOIN my_employees m ON u.userid = m.Userid WHERE u.userid = 'Bbiri';
-
删除所有数据
DELETE FROM my_employees; DELETE FROM users;
-
检查所作的修正
SELECT * FROM my_employees; SELECT * FROM users;
-
清空表my_employees
TRUNCATE TABLE my_employees;