删除重复记录只保留其中一条

  1. ---创建一个表
  2. CREATE TABLE `student` (
  3. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '学生ID',
  4. `name` varchar(20) DEFAULT NULL COMMENT '学生ID',
  5. `age` int(10) DEFAULT NULL COMMENT '学生年龄',
  6. `sex` char(1) DEFAULT NULL COMMENT '性别:0女|1男',
  7. PRIMARY KEY (`id`) USING BTREE
  8. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表';
  9. insert into `student`(`id`,`name`,`sex`) values
  10. (1,'郭德纲',10,'1'),
  11. (2,'宋茜',8,'0'),
  12. (3,'宋茜',8,'0'),
  13. (3,'郭德纲',10,'1'),
  14. (4,'蒋方舟',3,'0');
  15. ---查询重复的name
  16. SELECT name FROM student GROUP BY name HAVING count(name) > 1;
  17. ---查询重复的name中最小的id
  18. SELECT min(id) FROM student GROUP BY name HAVING count(name) > 1;
  19. ---查询重复的name中非最小的id
  20. SELECT id FROM student WHERE name in(
  21. SELECT name FROM student GROUP BY name HAVING count(name) > 1)
  22. AND id not IN(SELECT min(id) FROM student GROUP BY name HAVING count(name) > 1);
  23. ---删除重复的name数据,只保留id最小的一条namename
  24. DELETE FROM student WHERE id IN (
  25. SELECT id from (
  26. SELECT id FROM student WHERE name in(
  27. SELECT name FROM student GROUP BY namename HAVING count(namename) > 1)
  28. AND id not IN(SELECT min(id) FROM student GROUP BY name HAVING count(name) > 1)
  29. )as t
  30. );

若要保留最大的id数据,则把关键词 **min** 改为**max** 即可

连表更新

  1. UPDATE user a, room b SET a.num=a.num+1 WHERE a.room_id=b.id

连表删除

DELETE user FROM user,black WHERE user.id=black.id