MySQL插入、更新和删除[7题]

原始表如下:


MySQL插入、更新和删除[7题]_第1张图片
emp
MySQL插入、更新和删除[7题]_第2张图片
dept

第1题,4.5复制表定义

例:希望创建一个表dept_east,表结构与dept完全一致,但是里面没有数据
需要最终结果:


答:

create table dept_east as
select * from dept
where 0=1

由于where条件永远无法成立,所以可以实现新表无数据

第2题,4.4复制数据到另一个表

例:希望把dept表中位置 loc在'NEW YORK','BOSTON' 的数据复制到新表dept_east中

需要最终结果:

MySQL插入、更新和删除[7题]_第3张图片

答:

insert into dept_east (deptno, dname, loc)
select deptno, dname, loc
from dept
where loc in ('NEW YORK','BOSTON')

其实等同于,在空表中插入在另一表查询出来的符合条件的数据

第3题,4.7禁止插入特定列

例:希望一个程序插入数据到emp表中,但只允许他插入empno, ename, job列
需要最终结果:

MySQL插入、更新和删除[7题]_第4张图片

答:

create view new_emps as
select empno, ename, job from emp

创建一个view视图,只暴露允许被插入的列

第4题,4.10使用另一个表的数据更新记录

例:现有一个new_sal表,储存了部分员工调整后的工资,new_sal表数据如下图;
如果emp表中的deptno列和new_sal表中的deptno列,则将emp表中的sal列更新为new_sal表中的sal列,emp表中的comm列更新为new_sal表中的sal*0.5

new_sal

需要最终结果:
MySQL插入、更新和删除[7题]_第5张图片

答:

#修改数据库安全等级模式
SET SQL_SAFE_UPDATES = 0;
#更新,注意不可以: update emp1 e1 set (e1.sal,e1.COMM) = (select ns.sal,ns.sal/2...)
update emp1 e1 set e1.sal= (select ns.sal from new_sal ns where ns.deptno=e1.deptno),
                   e1.comm= (select ns.sal/2 from new_sal ns where ns.deptno=e1.deptno) 
where exists ( select null from new_sal ns where ns.deptno=e1.deptno);

有时候直接update会报错Error Code: 1175
这是因为MySql运行在safe-updates模式下,该模式会导致非主键条件下无法执行update或者delete命令,需要SET SQL_SAFE_UPDATES = 0; 修改下数据库模式
如果想要提高数据库安全等级,可以在恢复回原有的设置,执行命令:SET SQL_SAFE_UPDATES = 1;
执行成功后,以delete命令为例,非主键情况下又报错了,说明安全等级修改成功

第5题,4.15删除违反参照完整性的记录

例:某一些员工所属的部门其实并不存在,希望删除这些员工

#先在emp1表中存入一个部门90 ,是dept表中没有的
insert into emp1 (empno,deptno) values (007,90)
#查看emp1中的deptno 
select distinct deptno from emp1
order by deptno  -- 10,20,30,90
#查看dept中的deptno 
select distinct deptno from dept
order by deptno  -- 10,20,30,40

需要最终结果:(找出来并删除它所对应的员工记录)


答:

#找出不存在的部门90
select emp1.deptno
from emp1
where not exists (select null
                  from dept
                  where dept.deptno = emp1.deptno)
#删除(直接运行以下代码块即可)
delete
from emp1
where not exists (select null
                  from dept
                  where dept.deptno = emp1.deptno)

第6题,4.16删除重复记录

例:删除dupes表里的重复记录
原始表dupes如下图所示:

MySQL插入、更新和删除[7题]_第6张图片
dupes

需要最终结果:
MySQL插入、更新和删除[7题]_第7张图片

答:

select min(id)
from dupes
group by name
order by  min(id) 

(如果是需要找出去掉重复值之后的name,那就多加一步,参考骑士值方法)

第7题,4.17删除被其它表参照的记录

例:有一张dept_accidents表,该表每一行数据代表一起制造业事故。每一行都记录了发生事故的部门,以及事故的类型
对于发生了3件以上事故的部门,你希望从EMP表里删除掉这些部门的全部员工记录

dept_accidents表数据如下图所示:


MySQL插入、更新和删除[7题]_第8张图片
dept_accidents

需要最终结果:(找出来并删除对应的员工记录)

MySQL插入、更新和删除[7题]_第9张图片

答:

#注意having
select *
from emp
where deptno in (select deptno
                 from dept_accidents 
                 group by deptno
                 having count(*) >=3)
#执行删除
delete
from emp
where deptno in (select deptno
                 from dept_accidents 
                 group by deptno
                 having count(*) >=3)

你可能感兴趣的:(MySQL插入、更新和删除[7题])