注:(1)子查询不能在DELETE语句中使用的原因:首先,在DELETE中使用子查询,这会是相关子查询,效率很低;然后,MySQL不允许对要更改或要删除记录的数据表做子查询(很显然,动脑子想一想也明白了);
目录
一:DELETE子句简介
DELETE语句是删除数据的,而不能删除数据表本身,删除数据表的是DROP语句,DELETE语句只是删除记录而已。
● DELETE子句:执行删除操作的子句;
● FROM子句:确定删除那张数据表;
● WHERE子句:按照条件去删除记录;如果没有条件,就会删除全表,清空表;
● ORDER BY子句:对结果集进行排序;
● LIMIT子句:限定删除内容;
执行顺序:FROM子句→WHERE子句→ORDER BY子句→LIMIT子句→DELETE子句;
二:DELETE案例:单表的案例:无连接
案例1:删除10部门中,工龄超过20年的员工;
这个案例很简单,不涉及多张表。
我的做法:
DELETE FROM t_emp
WHERE deptno=10 AND FLOOR(DATEDIFF(NOW(),hiredate)/365)>=20;
……………………………………………………
案例2:删除20部门中工资最高的员工记录;
DELETE FROM t_emp
WHERE deptno=20
ORDER BY sal DESC
LIMIT 1;
三:DELETE案例:多张表的案例:内连接
(前面,UPDATE语句,表连接的时候可以修改多张表的记录。。。。DELETE也是这样的)
案例3:删除SALES部门和该部门的全部员工记录
DELETE子句的作用是:指定要删除那些表的记录。
这儿使用内连接,因为删除的就是有部门的,没有部门的不删除的…
这种操作有点骚,先确定结果集中的记录,然后指定下删除哪些表,然后就能在原表中删除那些在结果集中被指定的记录了。
DELETE e,d
FROM t_emp e JOIN t_dept d ON e.deptno=d.deptno
WHERE d.dname="SALES";
……………………………………………………
案例4:删除每个低于部门平均底薪的员工记录;
这个需要先查询,然后表连接
DELETE e
FROM t_emp e JOIN (SELECT AVG(sal) aa,deptno dno FROM t_emp GROUP BY deptno) temp ON e.deptno=temp.dno
WHERE e.sal<temp.aa;
……………………………………………………
案例5:删除员工KING和他直接下属的员工记录。。
我的做法:
DELETE e1
FROM t_emp e1 JOIN (SELECT empno FROM t_emp WHERE ename="KING") temp
WHERE e1.ename="KING" OR e1.mgr=temp.empno;
标准做法:
DELETE e
FROM t_emp e JOIN(SELECT empno FROM t_emp WHERE ename="KING") temp ON e.mgr=temp.empno OR e.empno=temp.empno;
四:DELETE案例:多张表的案例:外连接
案例6:删除SALES部门的员工,以及没有部门的员工:
我的做法:
DELETE e
FROM t_emp e left JOIN (SELECT deptno FROM t_dept WHERE dname="SALES") temp ON e.deptno=temp.deptno
WHERE e.deptno IS NULL OR e.deptno=temp.deptno;
标准做法:看下自己的做法和标准做法的不同……
DELETE e
FROM t_emp e LEFT JOIN t_dept d ON e.deptno=d.deptno
WHERE d.dname="SALES" OR e.deptno IS NULL;
五:快速删除数据表的全部记录:TRUNCATE语句
注:关于MySQL目前了解的内容: