MySQL 删除薪水高于所在平均薪水的员工信息

Posted by 道行尚浅 on May 24, 2018

临时表删除法

查看数据


mysql> select * from emp1 ;
+-------+--------+-----------+------+---------------------+------+------+--------+
| empNO | ENAME  | JOB       | MGR  | HIREDATE            | SAL  | COMM | deptNO |
+-------+--------+-----------+------+---------------------+------+------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800 | NULL |     20 |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600 |  300 |     30 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250 |  500 |     30 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975 | NULL |     20 |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250 | 1400 |     30 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850 | NULL |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450 | NULL |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000 | NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000 | NULL |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500 |    0 |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100 | NULL |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950 | NULL |     30 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000 | NULL |     20 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300 | NULL |     10 |
+-------+--------+-----------+------+---------------------+------+------+--------+
14 rows in set (0.00 sec)

执行删除语句



mysql> delete from emp1
    -> where  empno in
    -> (select empno from
    -> ( select empno
    ->    from  emp1  e1
    ->  where e1.sal > (select avg(sal) from emp1  e2 where  e1.deptno=e2.deptno   ) ) temtable) ;
Query OK, 6 rows affected (0.01 sec)



查看结果



mysql> select * from emp1 ;
+-------+--------+----------+------+---------------------+------+------+--------+
| empNO | ENAME  | JOB      | MGR  | HIREDATE            | SAL  | COMM | deptNO |
+-------+--------+----------+------+---------------------+------+------+--------+
|  7369 | SMITH  | CLERK    | 7902 | 1980-12-17 00:00:00 |  800 | NULL |     20 |
|  7521 | WARD   | SALESMAN | 7698 | 1981-02-22 00:00:00 | 1250 |  500 |     30 |
|  7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 00:00:00 | 1250 | 1400 |     30 |
|  7782 | CLARK  | MANAGER  | 7839 | 1981-06-09 00:00:00 | 2450 | NULL |     10 |
|  7844 | TURNER | SALESMAN | 7698 | 1981-09-08 00:00:00 | 1500 |    0 |     30 |
|  7876 | ADAMS  | CLERK    | 7788 | 1987-05-23 00:00:00 | 1100 | NULL |     20 |
|  7900 | JAMES  | CLERK    | 7698 | 1981-12-03 00:00:00 |  950 | NULL |     30 |
|  7934 | MILLER | CLERK    | 7782 | 1982-01-23 00:00:00 | 1300 | NULL |     10 |
+-------+--------+----------+------+---------------------+------+------+--------+
8 rows in set (0.00 sec)


关联删除法

查看数据



mysql> select * from emp1 ;
+-------+--------+-----------+------+---------------------+------+------+--------+
| empNO | ENAME  | JOB       | MGR  | HIREDATE            | SAL  | COMM | deptNO |
+-------+--------+-----------+------+---------------------+------+------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800 | NULL |     20 |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600 |  300 |     30 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250 |  500 |     30 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975 | NULL |     20 |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250 | 1400 |     30 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850 | NULL |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450 | NULL |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000 | NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000 | NULL |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500 |    0 |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100 | NULL |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950 | NULL |     30 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000 | NULL |     20 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300 | NULL |     10 |
+-------+--------+-----------+------+---------------------+------+------+--------+
14 rows in set (0.00 sec)

执行语句


mysql> delete  emp1 from emp1 ,(select deptno,avg(sal) a_sal from emp1 group by deptno) emp2
    ->  where emp1.deptno=emp2.deptno
    ->    and emp1.sal > emp2.a_sal ;
Query OK, 6 rows affected (0.09 sec)

查看结果


mysql> select * from emp1 ;
+-------+--------+----------+------+---------------------+------+------+--------+
| empNO | ENAME  | JOB      | MGR  | HIREDATE            | SAL  | COMM | deptNO |
+-------+--------+----------+------+---------------------+------+------+--------+
|  7369 | SMITH  | CLERK    | 7902 | 1980-12-17 00:00:00 |  800 | NULL |     20 |
|  7521 | WARD   | SALESMAN | 7698 | 1981-02-22 00:00:00 | 1250 |  500 |     30 |
|  7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 00:00:00 | 1250 | 1400 |     30 |
|  7782 | CLARK  | MANAGER  | 7839 | 1981-06-09 00:00:00 | 2450 | NULL |     10 |
|  7844 | TURNER | SALESMAN | 7698 | 1981-09-08 00:00:00 | 1500 |    0 |     30 |
|  7876 | ADAMS  | CLERK    | 7788 | 1987-05-23 00:00:00 | 1100 | NULL |     20 |
|  7900 | JAMES  | CLERK    | 7698 | 1981-12-03 00:00:00 |  950 | NULL |     30 |
|  7934 | MILLER | CLERK    | 7782 | 1982-01-23 00:00:00 | 1300 | NULL |     10 |
+-------+--------+----------+------+---------------------+------+------+--------+
8 rows in set (0.00 sec)