mysql多表删除

来源:互联网 发布:部落冲突女巫升级数据 编辑:程序博客网 时间:2024/06/03 13:59
这几天在看mysql的中文版手册,发现DELETE还可以多表删除数据,但是目前在项目中还没有遇到过有人这样写的。在此记录一下,以免以后遇到怀有疑问。
先用以下sql构造测试的数据库数据:
CREATE TABLE `grade` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `name` varchar(8) NOT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;INSERT INTO `grade` VALUES (1, '一年级');INSERT INTO `grade` VALUES (2, '二年级');INSERT INTO `grade` VALUES (3, '三年级');CREATE TABLE `student` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `grade_id` bigint(20) NOT NULL COMMENT '年纪id',  `name` varchar(8) DEFAULT NULL,  `sex` tinyint(2) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;INSERT INTO `student` VALUES (1, 1, '张三', 1);INSERT INTO `student` VALUES (2, 2, '李四', 2)

表很简单,一目了然,不做解释。
1. 从student表中把那些grade_id值在grade表里有匹配的记录全删除掉,即删除所有年级的学生。
DELETE student FROM student, grade WHERE student.grade_id=grade.id;
以上sql等价于:
DELETE FROM student USING student, grade WHERE student.grade_id=grade.id;
当然也可以指定grade_id:
DELETE FROM student USING student, grade WHERE student.grade_id=grade.id AND grade_id = 1;
2.删除所有没有年级的学生。
DELETE student FROM student LEFT JOIN grade ON student.grade_id = grade.id WHERE grade.id IS NULL;
或者
DELETE  FROM student USING student LEFT JOIN grade ON student.grade_id = grade.id WHERE grade.id IS NULL;
3.删除三年级和所有三年级的学生。
DELETE grade,student FROM grade LEFT JOIN student ON grade.id = student.grade_id WHERE grade.id=3;
可以理解成从查询的结果中删除:
SELECT * FROM grade LEFT JOIN student ON grade.id = student.grade_id WHERE grade.id=3;

以上根据这两个表列举多表删除的语法的例子,场景不太合适,只是用来理解。


原创粉丝点击