4. 删除数据 DELETE
语法
DELETE FROM 表名 [WHERE 条件];sql
-- A. 删除女生记录
DELETE FROM student WHERE Ssex = '女';
-- B. 没有 WHERE:删除表中所有行(表还在,数据光)
DELETE FROM student;重要限制:
- DELETE 可以加 WHERE 精确删除,也可不加 WHERE 清空全表;
- DELETE 不能只删某个字段的值(想清空某列请用 UPDATE 置 NULL);
- 有外键关联时,被引用的数据可能删不掉(如某学生已有成绩,直接删学生会因外键报错)。
⚠️ 单击"删除全部"前,Navicat 会弹窗确认——这其实是给你最后一次反悔机会。生产环境误删数据往往要跑备份恢复,代价极大。
📝 本节例题
以下例题均基于 教学实例 库(student / course / sc / teacher / grades / dept / emp),开始前先执行 USE 教学实例;。建议先自己写一遍,再展开答案对照。
例 1
删除 05 号教师记录。
查看参考答案(可复制)
sql
DELETE FROM teacher WHERE Tno = '05';💡 DELETE 不带 WHERE 会清空整张表,执行前先用 SELECT 验证条件。
例 2
删除 004 号学生:先删他的成绩,再删学生本人。
查看参考答案(可复制)
sql
DELETE FROM sc WHERE Sno = '004';
DELETE FROM student WHERE Sno = '004';💡 有主从关系时,先删子表(成绩)再删父表(学生),顺序反了可能被外键拦住。
例 3
删除一名没有任何成绩的学生(先用子查询查出学号,确认后再删)。
查看参考答案(可复制)
sql
SELECT Sno, Sname FROM student
WHERE Sno NOT IN (SELECT Sno FROM sc);
DELETE FROM student
WHERE Sno NOT IN (SELECT Sno FROM sc);💡 NOT IN 的子查询结果里若含 NULL,会导致一条都删不掉;sc.Sno 非空所以这里没问题。