文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

mysql中去除重复数据,只保留一条。

2023-08-31 15:18

关注

                梳理一下关于删除重复记录的逻辑

目录

前期准备:建表插入数据

1、通过group by 和count(1)>1找出有重复的数据

 2、通过每个分组中的最小id来去重

        2.1、添加主键id列

        2.2 去重

                2.2.1、首先找出每个分组中count(1) >1的数据中的最小id【min(id)】,sql语句如下:

                 2.2.2、再将上表和emp表做表连接,sql语句如下:


前期准备:建表插入数据

-- 创建表格empDROP TABLE IF EXISTS `emp`;CREATE TABLE `emp`  (  `EMPNO` int(0) NULL DEFAULT NULL,  `ENAME` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,  `JOB` varchar(9) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,  `MGR` int(0) NULL DEFAULT NULL,  `HIREDATE` date NULL DEFAULT NULL,  `SAL` int(0) NULL DEFAULT NULL,  `COMM` int(0) NULL DEFAULT NULL,  `DEPTNO` int(0) NULL DEFAULT NULL) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- 插入数据INSERT INTO `emp` VALUES (7566, '琼斯1', '经理', 7839, '1981-04-02', 2975, NULL, 20);INSERT INTO `emp` VALUES (7654, '马丁', '售货员', 7698, '1981-09-28', 1250, 1400, 30);INSERT INTO `emp` VALUES (7782, '克拉克', '经理', 7839, '1981-06-09', 2450, NULL, 10);INSERT INTO `emp` VALUES (7788, '斯科特', '分析师', 7566, '1987-04-19', 3000, NULL, 20);INSERT INTO `emp` VALUES (7839, '国王', '总统', NULL, '1981-11-17', 5000, NULL, 10);INSERT INTO `emp` VALUES (7844, '特纳', '售货员', 7698, '1981-09-08', 1500, 0, 30);INSERT INTO `emp` VALUES (7876, '亚当斯', '店员', 7788, '1987-05-23', 1100, NULL, 20);INSERT INTO `emp` VALUES (7900, '詹姆斯', '店员', 7698, '1981-12-03', 950, NULL, 30);INSERT INTO `emp` VALUES (7902, '福特', '分析师', 7566, '1981-12-03', 3000, NULL, 20);INSERT INTO `emp` VALUES (7521, '沃德', '售货员', 7698, '1981-02-22', 1250, 500, 30);INSERT INTO `emp` VALUES (7934, '米勒', '店员', 7782, '1982-01-23', 1300, NULL, 10);INSERT INTO `emp` VALUES (7499, '艾伦', '售货员', 7698, '1981-02-20', 1600, 300, 30);INSERT INTO `emp` VALUES (7698, '布莱克', '经理', 7839, '1981-05-01', 2850, NULL, 30);INSERT INTO `emp` VALUES (7566, '琼斯', '经理', 7839, '1981-04-02', 2975, NULL, 20);SET FOREIGN_KEY_CHECKS = 1;

表格来自oracle自带emp表。

1、通过group by 和count(1)>1找出有重复的数据

SELECT  ename,count(1) FROM emp GROUP BY ename HAVING count(1) >1;

在group by 之后 count(1)> 1代表其分组数据是重复的。

 具体group by 字段根据实际情况需求添加。

结果如下:

 2、通过每个分组中的最小id来去重

        2.1、添加主键id列

由于表格没有主键列,所以需要新增id自增。

ALTER TABLE emp add id int first; -- 改变表结构,增加名为id的列ALTER table emp MODIFY id int PRIMARY key auto_increment; -- 将id字段设置为主键自增;

        2.2 去重

          2.2.1、首先找出每个分组中count(1) >1的数据中的最小id【min(id)】,sql语句如下:

SELECT min(id) id,ename,count(0) FROM emp GROUP BY ename HAVING count(1) >1;

结果如下:

          2.2.2、再将上表和emp表做表连接,sql语句如下:

SELECT t1.*,t2.* fromemp t1inner join (SELECT min(id) id,ename,count(0) FROM emp GROUP BY ename HAVING count(1) >1) t2on t1.ENAME = t2.ENAME;

结果如下:

         可以看出t1.id和t2.id之间的联系,我们只需要删除t1.id > t2.id的数据,只留下每组中id最小的值和count(1)= 1 的数据。

        需要用到MySQL DELETE语句使用INNER JOIN子句,语法如下:

DELETE  a FROM table1 AS a LEFT JOIN table2 AS b ON 连接条件 WHERE 过滤条件;

        完整去重sql语句如下:

DELETE t1 fromemp t1inner join (SELECT min(id) id,ename,count(0) FROM emp GROUP BY ename HAVING count(1) >1) t2on t1.ENAME = t2.ENAMEwhere t1.id > t2.id;

来源地址:https://blog.csdn.net/weixin_75052326/article/details/130744456

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯