MySql中用delete和update时的陷阱

mysql中有这样的限制:
1.delete或update后面的子查询不能和主句中的表一致。
解决方法:
1、把子查询的结果创建临时表存储
2、把这个临时表作为原表删除的条件

下面通过案例来理解上面的意义
要求
1. 删除10号部门薪水最高的员工

数据表

这里写图片描述

创建emp的sql语句

create table emp(
    empno int primary key auto_increment,
    ename varchar(10),
    JOB varchar(9),
    MGR int,
    HIREDATE date,
    SAL int,
    COMM int,
    DEPTNO int not null
);
INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,'1987-06-13',3000,NULL,20);
INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,'1987-06-13',1100,NULL,20);
INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp VALUES(7934,'MILLER','CLERK',7782,'1983-01-23',1300,NULL,10);

要求
1. 删除10号部门薪水最高的员工

解题思路(正确答案是第四步)

第一步:先获取10号部门最高的薪水

select max(sal) from emp where deptno=10

查询结果如下图:
这里写图片描述
第二步:删除10号部门最高薪水的员工(此处有陷阱)

delete from emp
        where sal =(select max(sal) from emp where deptno=10)

执行上面的代码时,会出现错误,因为子查询中的表和主句中的表一样,
所以我们要将子查询表再封装成一个临时表,看下面第三步


第三步:删除10号部门最高薪水的员工(此处仍然有陷阱)

delete from emp
        where sal =(select * from (select max(sal) from emp where deptno=10) as temp)

此查询语句会将最高薪水的员工进行删除,万一其他部门也有5000薪水的人就也会删除,
而我们要删除的是10号部门的最高薪水员工,所以代码还需要加个条件deptno=10


第四步:删除10号部门最高薪水的员工(正确答案)

扫描二维码关注公众号,回复: 1756015 查看本文章
delete from emp
        where sal =(select * from (select max(sal) from emp where deptno=10) as temp)
        and deptno=10

猜你喜欢

转载自blog.csdn.net/u010452388/article/details/80189074
今日推荐