mysql去除重复数据只保留一条数据实例

 更新时间:2023年08月02日 11:28:50   作者:电风扇头发  
这篇文章主要给大家介绍了关于mysql去除重复数据只保留一条数据的相关资料,在使用MySQL时,有时需要查询出某个字段不重复的记录,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

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

前期准备:建表插入数据

-- 创建表格emp
DROP 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.* from
		emp t1
		inner join (SELECT min(id) id,ename,count(0) FROM emp GROUP BY ename HAVING count(1) >1) t2
		on 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 from
		emp t1
inner join (SELECT min(id) id,ename,count(0) FROM emp GROUP BY ename HAVING count(1) >1) t2
		on t1.ENAME = t2.ENAME
where t1.id > t2.id;

总结

到此这篇关于mysql去除重复数据只保留一条数据的文章就介绍到这了,更多相关mysql去除重复数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何更改MySQL数据库的编码为utf8mb4

    如何更改MySQL数据库的编码为utf8mb4

    utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符。 这篇文章给大家介绍了更改MySQL数据库的编码为utf8mb4的相关知识,感兴趣的朋友一起看看吧
    2020-02-02
  • MySQL中between and的基本用法详解

    MySQL中between and的基本用法详解

    文章介绍了MySQL中的BETWEEN AND操作符,它可以用于数值和日期类型的字段,包括边界值,通过示例展示了如何使用BETWEEN AND进行数值查询和时间查询,并强调了在处理datetime和timestamp类型时需要注意时间精度问题,需要的朋友可以参考下
    2026-03-03
  • mysql中find_in_set()函数用法及自定义增强函数详解

    mysql中find_in_set()函数用法及自定义增强函数详解

    这篇文章主要给大家介绍了关于mysql中find_in_set()函数用法及自定义增强函数的相关资料,在MySQL 数据库中进行复杂的查询语句,例如对多个字段进行筛选和排序,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • 详解Navicat远程连接mysql很慢

    详解Navicat远程连接mysql很慢

    这篇文章主要介绍了详解Navicat远程连接mysql很慢(以及数据库连接报错"Too many connections")解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • MySQL复合查询(多表查询、子查询)的实现

    MySQL复合查询(多表查询、子查询)的实现

    MySQL复合查询是指在一个SQL语句中使用多个查询条件,以过滤和检索数据,本文主要介绍了MySQL复合查询(多表查询、子查询)的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • MySQL8.0的WITH查询详情

    MySQL8.0的WITH查询详情

    这篇文章主要介绍了MySQL的WITH查询详情,需要的下伙伴可以参考下文
    2021-08-08
  • MySQL之MyISAM存储引擎的非聚簇索引详解

    MySQL之MyISAM存储引擎的非聚簇索引详解

    这篇文章主要为大家详细介绍了MySQL之MyISAM存储引擎的非聚簇索引,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Mac安装 mysql 数据库总结

    Mac安装 mysql 数据库总结

    本文给大家分享的是如何在Mac下安装mysql数据库的方法,总结的很全面,有需要的小伙伴可以参考下
    2016-04-04
  • mysql数据库sql优化原则(经验总结)

    mysql数据库sql优化原则(经验总结)

    这里的原则 只是针对mysql数据库,其他的数据库 某些是殊途同归,某些还是存在差异。我总结的也是mysql普遍的规则,对于某些特殊情况得特殊对待。在构造sql语句的时候养成良好的习惯
    2014-03-03
  • mysql 重要日志文件汇总

    mysql 重要日志文件汇总

    这篇文章主要介绍了mysql 重要日志文件的汇总,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-11-11

最新评论