Mysql版本:8.0.26
可视化客户端:sql yog
提示:以下是本篇文章正文内容,下面案例可供参考
一、DML是什么?
DML,英文全称Data Manipulation Language,意为数据操纵语言,用于数据库操作,对数据库其中的对象和数据运行访问工作的编程语句,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入(意指新增或创建)、更新(修改)与删除(销毁)。
二、INSERT(添加 / 插入)
测试数据表准备如下:
CREATE TABLE `stu` ( `sid` int DEFAULT NULL, `sname` varchar(20) DEFAULT NULL, `birthday` date DEFAULT NULL, `score` int DEFAULT NULL, `gender` enum('男','女') DEFAULT NULL, `weight` double(4,1) DEFAULT NULL, `tel` char(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
2.1 添加一条记录到某个表中
👉语法:
①INSERT INTO 表名称 VALUES(值列表);
②INSERT INTO 表名称 VALUE(值列表);
👉注意:
值列表中的值的顺序、类型、个数必须与(字段列表)一一对应
👉小tips:
value和values有何区别?
value在底层只能逐行逐行的添加数据,即一条一条的添加,不能使用批处理命令以提高效率
values可以在底层开启批处理功能,可同时添加多条数据,大大提高效率
案例:给表stu添加一条记录,为(1,‘张三’,‘1995-2-5’,89,‘男’,86.5,‘13478956896’)
代码演示如下:
INSERT INTO stu VALUES(1,'张三','1995-2-5',89,'男',86.5,'13478956896'); INSERT INTO stu VALUE(2,'张三','1995-2-5',89,'男',86.5,'13478956896');
2.2 添加语句,可指定部分字段赋值
👉语法:
INSERT INTO 表名称(字段列表) VALUES(值列表)
案例:为stu表添加一行记录,分别为字段sid,sname,tel赋值,赋值内容随意
代码演示如下:
INSERT INTO stu(sid,sname,tel) VALUES(3,'李四','13478956896') ;
2.3 添加多条记录到某个表中
👉语法:
INSERT INTO 表名称 VALUES(值列表),(值列表),(值列表) …(值列表);
INSERT INTO 表名称(字段列表) VALUES(值列表),(值列表),(值列表) …(值列表);
👉注意: 值列表中的值的顺序、类型、个数必须与(字段列表)一一对应
案例:给表stu一次性添加多行记录
代码演示如下;
INSERT INTO stu(sid,sname,tel) VALUES (4,'王五' ,'13478956811'), (5,'赵六','13478953811'), (6,'老王','13478956822') ;
三、UPDATE(修改)
3.1 修改所有行
👉语法:
UPDATE 表名称 SET 字段名 = 值,字段名=值,字段名 = 值 ;
案例:将表stu的weight字段下的值全设为93
修改之前:
代码修改如下:
UPDATE stu SET weight=93;
3.2 修改部分行
👉语法:
UPDATE 表名称 SET 字段名 = 值,字段名=值,字段名 = 值 WHERE 条件;
案例:修改李四和王五的体重为86
代码演示如下:
UPDATE stu SET weight = 86 WHERE sname IN ('李四','王五');
四、DROP(删除)
4.1 删除部分行
👉语法:
DELETE EROM 表名称 WHERE 条件;
案例:删除stu表中姓名为“老王”的学生记录
代码演示如下:
DELETE FROM stu WHERE sname='老王';#这只是删除符合条件的那一行记录(数据)
4.2 删除某一列的数据
👉语法:
UPDATE 表名 SET 字段名=NULL;
案例:删除weight列下的所有数据
代码演示如下:
UPDATE stu SET weight=NULL;
4.3 删除所有行,即删除所有数据
👉语法:
DELETE EROM 表名称;
案例:删除stu表的所有数据
代码修改如下:
DELETE FROM stu;
五、DML中嵌套子查询
👉准备测试数据如下:
CREATE TABLE `t_employee` ( `eid` int NOT NULL AUTO_INCREMENT COMMENT '员工编号', `ename` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '员工姓名', `salary` double NOT NULL COMMENT '薪资', `commission_pct` decimal(3,2) DEFAULT NULL COMMENT '奖金比例', `birthday` date NOT NULL COMMENT '出生日期', `gender` enum('男','女') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '男' COMMENT '性别', `tel` char(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '手机号码', `email` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '邮箱', `address` varchar(150) DEFAULT NULL COMMENT '地址', `work_place` set('北京','深圳','上海','武汉') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '北京' COMMENT '工作地点', `hiredate` date NOT NULL COMMENT '入职日期', `job_id` int DEFAULT NULL COMMENT '职位编号', `mid` int DEFAULT NULL COMMENT '领导编号', `did` int DEFAULT NULL COMMENT '部门编号', PRIMARY KEY (`eid`), KEY `job_id` (`job_id`), KEY `did` (`did`), KEY `mid` (`mid`), CONSTRAINT `t_employee_ibfk_1` FOREIGN KEY (`job_id`) REFERENCES `t_job` (`jid`) ON DELETE SET NULL ON UPDATE CASCADE, CONSTRAINT `t_employee_ibfk_2` FOREIGN KEY (`did`) REFERENCES `t_department` (`did`) ON DELETE SET NULL ON UPDATE CASCADE, CONSTRAINT `t_employee_ibfk_3` FOREIGN KEY (`mid`) REFERENCES `t_employee` (`eid`) ON DELETE SET NULL ON UPDATE CASCADE, CONSTRAINT `t_employee_chk_1` CHECK ((`salary` > 0)), CONSTRAINT `t_employee_chk_2` CHECK ((`hiredate` > `birthday`)) ) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
5.1 UPDATE中嵌套子查询
案例:修改0106db数据库中t employee表中的数据,修改“何进”员工的薪资和“孙洪亮”的薪资一样
代码演示如下:
UPDATE t_employee SET salary=(SELECT salary FROM t_employee WHERE ename='孙洪亮') WHERE ename='何进';
👉报错代码分析:
错误代码:1093
You can’t specify target table t_employee’ for update in FROM clause t_employee现在在from子句中出现了,说明它正在被“查询”,就不能同时被修改。
👉解决措施:
把子查询(SELECT salary EROM t employee WHERE ename =孙洪亮’的结果放到一个内存中"临时表,这样做的目的是可以解开t employee的锁,然后修改t~employee表就不会因为锁的问题被拒绝。
代码修改如下:
UPDATE t_employee SET salary=(SELECT salary FROM (SELECT salary FROM t_employee WHERE ename='孙洪亮') AS temp) WHERE ename='何进'
5.2 DELETE中嵌套子查询
案例:删除和"何进”同一个部门的员工
代码演示如下:
DELETE FROM t_employee WHERE did=(SELECT did FROM (SELECT did FROM t_employee WHERE ename='何进') temp)
附:复制表结构与部分数据
① 复制表结构
👉语法:
CREATE TABLE 要复制的表名 LIKE 被复制的表名;
案例:创建一个新表emp,让它和t_employee表有着相同的表结构
代码演示如下:
CREATE TABLE emp LIKE t_employee;
② 复制部分数据
👉语法:
INSERT INTO 要复制的表名 被复制的表中某些行
案例:将t_employee表中eid为4的部分员工信息复制到emp 表中
代码演示如下:
INSERT INTO emp (SELECT * FROM t_employee WHERE eid = 4);