DELETE语句
- DELETE语句用于删除记录,语法如下:
DELETE [IGNORE] FROM 表名
[WHERE 条件1,条件2,...]
[ORDER BY...]
[LIMIT...];
练习
删除10部门中,工龄超过20年的员工记录
delete from t_emp where deptno=10 and datediff(now(),hiredate)/365>20;
删除20部门中工资最高的员工记录
delete from t_emp where deptno=20 order by sal+ifnull(comm,0) desc limit 1;
DELETE语句的内连接
- 因为相关子查询效率非常低,所以我们可以利用表连接的方式来改造DELETE语句
DELETE 表1, FROM 表1 JOIN 表2 ON 条件
[WHERE 条件1,条件2...]
[ORDER BY...]
[LIMIT...];
练习
- 删除SALES部门和该部门门的全部员工记录
delete e,d
from t_emp e join t_dept d on e.deptno=d.deptno
where d.dname="SALES";
- 删除每个低于部门平均底薪的员工记录
delete e
from t_emp e join
(select deptno,avg(sal) avg from t_emp group by deptno) s
on e.deptno=s.deptno and e.sal<s.avg;
- 删除员工KING和他的直接下属的员工记录,用表连接实现。
delete e
from t_emp e join
(select empno from t_emp where ename="KING") t
on e.mgr=t.empno or e.empno=d.empno;
临时表的数据不能删除
DELETE语句的外连接
- DELETE语句的表连接既可以是内连接,又可以是外连接
DELETE 表1,.. FROM 表1 [LEFT | RIGHT] JOIN 表2
ON 条件...;
- 删除SALES部门的员工,以及没有部门的员工。
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;
快速删除数据表全部记录
- DELETE语句是在事务机制下删除记录,删除记录之前,先把将要删
除的记录保存到日志文件里,然后再删除记录。 - TRUNCATE语句在事务机制之外删除记录,速度远超过DELETE语句
TRUNCATE TABLE 表名;