LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

MYSQL表中没有主键,怎么找到重复的数据

zhenglin
2026年10月12日 16:25 本文热度 213

问题描述

有一次遇到这样一个面试题,说如果一个表中没有主键,如何找到里面重复的数据?

表数据如下:

表结构如下:

针对以上问题,有以下几种解决方案

解决方案

1.  使用 GROUP BY 分组查询法

利用 GROUP BY 分组查询语句来分组聚合,然后筛选出出现次数大于1的重复记录。例如:

SELECT column1, column2, column3, COUNT(*) as count FROM table_name GROUP BY column1, column2, column3 HAVING count > 1;

​该语句将按照 column1、column2、column3 分组,统计每个分组的数量,然后取出数量大于 1 的分组。该方法比较简单,但是如果表中记录较多,可能查询效率较低。

2. 使用子查询法

使用子查询获得重复的记录,例如:

SELECT * FROM table_name WHERE (column1, column2, column3) IN (SELECT column1, column2, column3 FROM table_name GROUP BY column1, column2, column3 HAVING COUNT(*) > 1)

该语句子查询部分统计每个不同的 column1、column2、column3 分组,然后再用 IN 子句将重复记录选出来。


3. 使用连接查询法

使用连接查询,将表和本身连接起来,并比较来判断重复。例如:

SELECT a.* FROM table_name a INNER JOIN (SELECT column1, column2, column3 FROM table_name GROUP BY column1, column2, column3 HAVING COUNT(*) > 1) b ON a.column1 = b.column1 AND a.column2 = b.column2 AND a.column3 = b.column3

该语句以列 column1、column2、column3 分组,找出出现两次以上的重复记录,并与原表进行连接查询。


4.  使用去重后比较条数法

将表中所有列的值连接成一个字符串,再将这个字符串进行快速 MD5 哈希,用 count() 函数来计算每个哈希值出现的次数,如果某个哈希值出现次数大于 1,那么这些记录就是重复的。例如:

SELECT COUNT(*), MD5(CONCAT_WS('|', column_1, column_2, column_3, column_4, ..., column_n)) FROM table_name GROUP BY MD5(CONCAT_WS('|', column_1, column_2, column_3, column_4, ..., column_n)) HAVING COUNT(*) > 1

5. 使用子查询法计算重复次数

使用子查询先计算出每个记录重复的次数,然后取出重复次数大于 1 的记录。例如:

SELECT a.* FROM table_name a, (SELECT column1, column2, column3, COUNT(*) as count FROM table_name GROUP BY column1, column2, column3 HAVING count > 1) b WHERE a.column1 = b.column1 AND a.column2 = b.column2 AND a.column3 = b.column3

该语句计算出每个 column1、column2、column3 分组中出现的次数,然后筛选出出现次数大于 1 的记录。


6. 对多列使用 DISTINCT 子句法

使用 DISTINCT 子句来去除重复的数据,例如:

SELECT DISTINCT column1, column2, column3 FROM table_name

该语句将按照 column1、column2、column3 去重,只取出不同的记录。如果存在重复数据,那么就会取出重复数据。


7. 查找输入数据相同的记录法

这种方法就是找到输入的记录与某些记录是相同的,这些记录就是重复记录。例如:

SELECT * FROM table_name WHERE column1='value1' AND column2='value2' AND column3='value3'

该语句将根据表中每个过滤条件来查找重复记录。


8. 根据下标去重

该方法是通过打印出所有的键值,找出重复的键并去重。例如:

SELECT DISTINCT SUBSTRING_INDEX(column_string,',',1) AS column1, SUBSTRING_INDEX(SUBSTRING_INDEX(column_string,',',2),',',-1) AS column2, SUBSTRING_INDEX(column_string,',',-1) AS column3 FROM (SELECT CONCAT(column1,',',column2,',',column3) AS column_string FROM table_name) AS table_alias

该语句将 SELECT CONCAT(column1,',',column2,',',column3) AS column_string FROM table_name 产生的结果进行处理,将 column1、column2、column3 分开,然后再按照去重不同列的方法进行处理。


9.  手动输入表的列名法

该方法是通过手动输入要查询的列名,然后进行查找。例如:

SELECT column1, column2, column3, COUNT(*) as count FROM table_name GROUP BY column1, column2, column3 HAVING count > 1;

10. 使用 ROW_NUMBER() OVER() 分配行号

该方法基于 ROW_NUMBER() OVER() 分配行号来找到重复的记录。例如:

SELECT * FROM (

    SELECT *, ROW_NUMBER() OVER(PARTITION BY column1, column2, column3 ORDER BY column1, column2, column3) AS rn 

    FROM table_name

) t

WHERE t.rn > 1

​

该语句将按照 column1、column2、column3 分组,为每组结果分配一个行号并选出行号大于 1 的结果。这种方法适用于较新的 MySQL 版本和较大的表。


阅读原文:点击这里


该文章在 2026/10/12 16:25:42 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-9  粤公网安备44030602007207号