关于MySQL表中没有主键时如何找到重复的数据

 更新时间:2023年06月09日 16:02:03   作者:唐小码  
这篇文章主要来和探讨一下关于MySQL表中没有主键时,该如何找到重复的数据,文中的示例代码讲解详细,具有一定的参考价值,需要的可以了解一下

问题描述

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

表数据如下:

表结构如下:

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

解决方案

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 版本和较大的表。

到此这篇关于关于MySQL表中没有主键时如何找到重复的数据的文章就介绍到这了,更多相关MySQL重复数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 聊聊QT添加MySQL驱动依赖的问题

    聊聊QT添加MySQL驱动依赖的问题

    这篇文章主要介绍了QT添加MySQL驱动依赖的问题,本文通过图文实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • 在EF中使用MySQL的方法及常见问题

    在EF中使用MySQL的方法及常见问题

    这篇文章主要介绍了在EF中使用MySQL的方法及常见问题 的相关资料,需要的朋友可以参考下
    2016-06-06
  • MyCat 垂直分片和水平拆分的实现

    MyCat 垂直分片和水平拆分的实现

    本文主要介绍了MyCat 垂直分片和水平拆分的实现,垂直分片将不同类型的表拆分到不同的数据库服务器上,水平拆分则将大表拆分到多个服务器上,下面就来具体介绍一下,感兴趣的可以了解一下
    2025-03-03
  • MySQL为什么要避免大事务以及大事务解决的方法

    MySQL为什么要避免大事务以及大事务解决的方法

    这篇文章主要介绍了MySQL为什么要避免大事务以及大事务解决的方法,帮助大家更好的理解和学习MySQL,感兴趣的朋友可以了解下
    2020-08-08
  • Mysql中Insert into xxx on duplicate key update问题

    Mysql中Insert into xxx on duplicate key update问题

    在看代码的过程中碰到了这一用法,不太理解,google了一下。它的意义其实是如果在insert语句末尾制定了on duplicate key update语句的话,则当插入行会导致一个unique索引或者primary key中出现重复值,则执行update中的语句,否则才插入新行
    2012-08-08
  • 如何设计高效合理的MySQL查询语句

    如何设计高效合理的MySQL查询语句

    合理的MySQL查询语句可以让我们的MySQL数据库效率更高,那么如何设计高效合理的查询语句就成为了摆在我们面前的问题。
    2015-08-08
  • MySQL表LEFT JOIN左连接与RIGHT JOIN右连接的实例教程

    MySQL表LEFT JOIN左连接与RIGHT JOIN右连接的实例教程

    这篇文章主要介绍了MySQL表LEFT JOIN左连接与RIGHT JOIN右连接的实例教程,表连接操作是MySQL入门学习中的基础知识,需要的朋友可以参考下
    2015-12-12
  • 如何修改Linux服务器中的MySQL数据库密码

    如何修改Linux服务器中的MySQL数据库密码

    这篇文章主要介绍了如何修改Linux服务器中的MySQL数据库密码问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Mysql无法选取非聚合列的解决方法

    Mysql无法选取非聚合列的解决方法

    这篇文章主要给大家介绍了关于Mysql无法选取非聚合列的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • 8种手动和自动备份MySQL数据库的方法

    8种手动和自动备份MySQL数据库的方法

    作为流行的开源数据库管理系统,MySQL的使用者众多,为了维护数据安全性,数据备份是必不可少的。本文就为大家介绍几种适用于企业的数据备份方法,需要的朋友可以参考下
    2018-10-10

最新评论