深入解析:(1-7-5) Mysql 对 数据的基本操作
目录
(1) 向部门表中插入 2条记录,其中一条为重复记录, 希望插入成功
(1)把每个员工 的编号和上司的 编号 +1, 用order by 子句完成
2.2 update 子句 (order by + limit)
(1) 把月收入前三名 的员工底薪减100 元, 用limit 子句完成
(2) 把10部们中 工龄超过20年的员工, 底薪增加240元
2.3 update 语句(表连接实现 join + where)
(1) (表连接实现 join + where) 将龙龙 调往 “家乡部1” ,职务调整为“技术大佬”
(1) 把没有部门的员工, 或者 “家乡部1”部门高于3000底薪的员工,都调往60部门
(1) (表连接删除) 删除 “家乡部2” 部门和该部门 的全部员工记录
(2) (表连接删除其中一表记录) 删除 每个低于部门平均底薪 的员工记录
(3)删除 员工king 和他的直接下属的 员工记录, 用表连接实现
(1)(左外连接)删除 SALES 部门员工, 以及没有部门的员工
base :
通过网盘分享的文件:demo.sql
链接: https://pan.baidu.com/s/1iUKSMScC1PXtbOFFaKm-vQ 提取码: i5hb 复制这段内容后打开百度网盘手机App,操作更方便哦
0. 前置总结
- 数据添加(Insert)
- Insert 语法
- Insert 方言语法
- Insert 子查询
- Ignore 关键字
- 数据修改(Update)
- Update 语法
- Update 表连接
- 数据删除(delete)
- delete 语法
- delete 表连接
1. insert 语句
1.1 insert 语法
(1) 员工部门表中 插入 4 条记录
# 插入(Insert)语句
# 1. 员工部门表中 插入 4 条记录
insert into t_dept(deptno, dname, loc)
values
(50, "家乡部1", "杨陵区"),
(60, "家乡部2", "克拉玛依市"),
(70, "家乡部3", "长春市"),
(80, "家乡部4", "汉中市");
select * from t_dept;
1.2 Insert 子查询
(1) 向“家乡部2” 添加一条员工记录
# 2. insert 子查询
# 2.1 向“家乡部2” 添加一条员工记录
insert into t_emp
(empno, ename, job, mgr, hiredate, sal, comm, deptno)
values
(8001, "phdvb", "teacher", 7900, "2025-7-27", 5000, null,
(select deptno
from t_dept
where dname = "家乡部2")
);
select * from t_emp;
1.3 insert 语句方言
(1) 向“家乡部2” 添加一条员工记录
# 3. insert 语句方言
# 3.1 向“家乡部2” 添加一条员工记录
insert into t_emp
set
empno = 8002,
ename = "phdvc",
job = "teacher",
mgr = 7900,
hiredate = "2025-7-27",
sal = 5200,
comm = 200,
deptno = (select deptno from t_dept where dname = "家乡部2");
select * from t_emp;
1.4 ignore 关键字
(1) 向部门表中插入 2条记录,其中一条为重复记录, 希望插入成功
# 4. ignore 关键字
# 4.1 向部门表中插入 2条记录,其中一条为重复记录, 希望插入成功
insert ignore into t_dept
values
(70, "家乡部4", "汉中市"),
(90, "家乡部5", "西安市");
select * from t_dept;
DELETE from t_emp where deptno = 90;
2. update 语句
2.1 update 子句 (order by)
(1)把每个员工 的编号和上司的 编号 +1, 用order by 子句完成
# update 子句
# 1 把每个员工 的编号和上司的 编号 +1, 用order by 子句完成
select * from t_emp;
update t_emp set empno = empno + 1, mgr = mgr + 1
order by empno desc;
2.2 update 子句 (order by + limit)
(1) 把月收入前三名 的员工底薪减100 元, 用limit 子句完成
# 2. 把月收入前三名 的员工底薪减100 元, 用limit 子句完成
# 2.1 base 先按照薪资 做降序排列
select empno, sal + ifnull(comm, 0)
from t_emp
order by sal + ifnull(comm, 0) desc
# 2.2 更新 前三条记录
update t_emp
set sal = sal -100
order by sal + ifnull(comm, 0) desc
limit 3;
(2) 把10部们中 工龄超过20年的员工, 底薪增加240元
# 3. 把10部们中 工龄超过20年的员工, 底薪增加240元
# 3.1 base 查询
select empno, ename, sal, floor(DATEDIFF(now(), hiredate)/365)
from t_emp
where deptno = 10 and DATEDIFF(now(), hiredate)/365 > 20;
# 3.2 更新操作
update t_emp
set sal = sal + 240
where deptno = 10 and DATEDIFF(now(), hiredate)/365 > 20;
2.3 update 语句(表连接实现 join + where)
(1) (表连接实现 join + where) 将龙龙 调往 “家乡部1” ,职务调整为“技术大佬”
# 4. (表连接实现 join + where) 将龙龙 调往 “家乡部1” ,职务调整为“技术大佬”
update t_emp em join t_dept de
set em.deptno = de.deptno , em.job = "技术大佬"
where em.ename = "龙龙" and de.dname = "家乡部1";
(2)把底薪低于 公司平均底薪的 员工, 底薪增加150元
# 5. 把底薪低于 公司平均底薪的 员工, 底薪增加150元
# base 查询
select em1.empno, em1.ename, em1.ename, em1.sal, av.av_sal
from t_emp em1 join (select avg(em2.sal) as av_sal from t_emp em2) av
where em1.sal < av.av_sal
update t_emp em1 join (select avg(em2.sal) as av_sal from t_emp em2) av
set em1.sal = em1.sal + 150
where em1.sal < av.av_sal
2.4(左外连接)实现数据更新
(1) 把没有部门的员工, 或者 “家乡部1”部门高于3000底薪的员工,都调往60部门
# 6. (左外连接)实现数据更新
# 需求: 把没有部门的员工, 或者 “家乡部1”部门高于3000底薪的员工,都调往60部门
# base 查询
select em.empno, em.ename, em.sal, em.deptno
from t_emp em left join t_dept de
on em.deptno = de.deptno
where em.deptno is null or (de.dname = "家乡部1" and em.sal > 3000);
# 更新
update t_emp em left join t_dept de
on em.deptno = de.deptno
set em.deptno = 60
where em.deptno is null or (de.dname = "家乡部1" and em.sal > 3000);
# 验证
select empno, ename, sal, deptno
from t_emp
where deptno = 60
3. delete 语句
3.1 基本用法
(1)删除 10 部门中, 工资最低的员工记录
# 1. 删除 10 部门中, 工资最低的员工记录
# base 查询
select *
from t_emp
where deptno = 10
order by sal + IFNULL(comm , 0)
# 删除
delete from t_emp
where deptno = 10
order by sal + IFNULL(comm , 0)
limit 1;
(2)删除 10部门中, 工龄超过45的员工记录
#2. 删除 10部门中, 工龄超过45的员工记录
# base 查询10 部门, 每个员工的工龄
select empno, ename, DATEDIFF(now(), hiredate)/365
from t_emp
where deptno = 10;
# 删除
delete
from t_emp
where deptno = 10 and DATEDIFF(now(), hiredate)/365 > 45;
3.2 (表连接删除语法)操作多表删除
(1) (表连接删除) 删除 “家乡部2” 部门和该部门 的全部员工记录
# 3. (表连接删除) 删除 “家乡部2” 部门和该部门 的全部员工记录
# base 查询“家乡部2”部门,以及部门的全部员工记录
select em.empno, em.ename, em.deptno, de.dname
from t_emp em join t_dept de
on em.deptno = de.deptno and de.dname = "家乡部2";
# 删除
delete em, de
from t_emp em join t_dept de
on em.deptno = de.deptno and de.dname = "家乡部2";
(2) (表连接删除其中一表记录) 删除 每个低于部门平均底薪 的员工记录
# 4. (表连接删除其中一表记录) 删除 每个低于部门平均底薪 的员工记录
# base 查询 每个部门 的员工记录 + 平均底薪
select em1.empno, em1.ename, em1.sal, em1.deptno, em2.av_sal as deptAvgSal
from t_emp em1 join (select deptno, avg(sal) as av_sal from t_emp group by deptno) em2
on em1.deptno = em2.deptno;
# 删除
delete em1
from t_emp em1 join (select deptno, avg(sal) as av_sal from t_emp group by deptno) em2
on em1.deptno = em2.deptno and em1.sal < em2.av_sal;
(3)删除 员工king 和他的直接下属的 员工记录, 用表连接实现
# 5 删除 员工king 和他的直接下属的 员工记录, 用表连接实现
# base0 查询员工king 和他的直接下属的 员工记录,用表连接
select empno from t_emp where ename = "KING";
# base1
select em1.empno, em1.ename, em1.mgr
from t_emp em1 join (select empno from t_emp where ename = "KING") emNo
on em1.mgr = emNo.empno or em1.ename = "KING";
# 删除
delete em1
from t_emp em1 join (select empno from t_emp where ename = "KING") emNo
on em1.mgr = emNo.empno or em1.ename = "KING";
# 验证
select empno, ename, mgr from t_emp;
3.3 (left join表连接删除)
(1)(左外连接)删除 SALES 部门员工, 以及没有部门的员工
# 6. (左外连接)删除 SALES 部门员工, 以及没有部门的员工
# base 0
-- select deptno from t_dept where dname = "SALES";
# base 1
# 查询 SALES 部门员工, 以及没有部门的员工
# 写法一 错误写法
-- select em.empno, em.ename, em.deptno
-- from t_emp em left join (select deptno from t_dept where dname = "SALES") deptT
-- on em.deptno = deptT.deptno or em.deptno is null;
# 写法二
select em.empno, em.ename, em.deptno
from t_emp em left join t_dept de on em.deptno = de.deptno
where de.dname = "SALES" or em.deptno is null;
# 删除
delete em
from t_emp em left join t_dept de on em.deptno = de.deptno
where de.dname = "SALES" or em.deptno is null;
3.4 truncate快速清空数据表
# 7. 清空数据表
truncate table t_emp;