当前位置: 首页 > article >正文

SQL 中查找重复数据的四种方法

数据库中的重复数据可能导致存储成本增加、查询性能下降、分析结果不准确以及数据管理混乱。本文概述了四种 SQL 技术来检测和处理这些重复数据:使用GROUP BY和HAVING识别重复行的分组,采用诸如ROW_NUMBER()的窗口函数进行高效分析,利用EXISTS操作符检查特定的重复条件,以及执行自连接以比较同一表中的行。本文还讨论了某些方法需要唯一标识符的必要性,并提供了针对大表的优化技术,例如索引和分区。最后,展示了如何使用公共表表达式(CTE)结合 ROW_NUMBER() 函数删除重复行。
一、重复数据的存在会导致什么问题?

数据库中的重复数据是一个常见问题,可能对数据完整性、存储效率和整体系统性能产生重大影响。重复数据的存在可能导致以下几个问题。

不必要的数据占用空间,从而增加存储成本
处理冗余信息导致查询性能下降
报告和分析不准确,可能导致错误的商业决策
数据管理和客户互动时的混淆

识别和管理重复行对于维护干净、高效和可靠的数据库至关重要。在本篇文章将探讨查找重复行的各种SQL技术,让您迈出提高数据质量和数据库性能的第一步。
二、在SQL中查找重复数据

首先创建并插入一些数据。

CREATE TABLE employees (
id INT,
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(100),
department VARCHAR(50)
);

INSERT INTO employees VALUES
(1, ‘John’, ‘Doe’, ‘john.doe@example.com’, ‘Sales’),
(2, ‘Jane’, ‘Smith’, ‘jane.smith@example.com’, ‘Marketing’),
(3, ‘Bob’, ‘Johnson’, ‘bob.johnson@example.com’, ‘IT’),
(4, ‘Alice’, ‘Williams’, ‘alice.williams@example.com’, ‘HR’),
(5, ‘John’, ‘Doe’, ‘john.doe@example.com’, ‘Sales’),
(6, ‘Sarah’, ‘Brown’, ‘sarah.brown@example.com’, ‘Marketing’),
(7, ‘Bob’, ‘Johnson’, ‘bob.johnson@example.com’, ‘IT’);

2.1 使用GROUP BY和HAVING 💻

使用GROUP BY和HAVING子句可以高效地识别SQL中的重复行。这种方法通过分组相同值的行,然后筛选出包含多条记录的组,从而找出表中的重复项。

WITH cte AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY first_name,last_name,email,department
ORDER BY id
)AS rn
FROM employees
)
SELECT *
FROM cte
WHERE rn>1;

2.2 使用窗口函数 💻

窗口函数是SQL识别重复行的高效工具,尤其在处理大量数据时。它们允许计算当前行及其相关行,提供灵活分析手段。例如ROW_NUMBER() 这样的窗口函数可能更有效。

SELECT DISTINCT t1.*
FROM employees t1
INNER JOIN employees t2 ON
t1.first_name = t2.first_name AND
t1.last_name = t2.last_name AND
t1.email = t2.email AND
t1.department = t2.department AND
t1.id > t2.id;

接下来的两种方法需要至少一个唯一标识符,本文将在示例后解释。
2.3 使用窗口函数 💻

SQL 中的EXISTS操作符提供了另一种检查满足特定条件的行是否存在的方法,这使得其在识别重复数据时特别有用。该方法在处理复杂条件时可能比某些替代方案更高效。

SELECT t1.*
FROM employees t1
WHERE EXISTS (
SELECT 1
FROM employees t2
WHERE t1.first_name = t2.first_name AND
t1.last_name = t2.last_name AND
t1.email = t2.email AND
t1.department = t2.department
AND t1.id > t2.id
);

2.4 使用自连接 💻

自连接是另一种强大的SQL技术,允许一个表与自身连接,使其在查找重复行时特别有用。该方法将每一行与同一表中的每一行比较,使我们能够识别在指定列中具有相同值的记录。

SELECT DISTINCT t1.*
FROM employees t1
INNER JOIN employees t2 ON
t1.first_name = t2.first_name AND
t1.last_name = t2.last_name AND
t1.email = t2.email AND
t1.department = t2.department AND
t1.id > t2.id;

三、唯一标识符与大表优化
唯一标识符的必要性

对于 EXISTS 和自连接方法,在查找完全重复项时需要一个唯一标识符。这个唯一标识符(通常是自增 ID 或主键)有助于区分在其它方面相同的行。

唯一标识符的目的

允许比较行而不将一行与自身匹配。能够从每组重复中仅选择一行。

数据表较大时可考虑的优化技术

确保在您检查重复项的列上有适当的索引。
如果可能,针对您经常检查的重复项列使用分区。
考虑使用临时表或公共表表达式(CTE)来简化复杂查询。
使用EXPLAIN PLAN分析查询性能并进行相应优化。

对于非常大的表,考虑使用批处理或并行查询执行(如果您的数据库系统支持)。有效方法将取决于特定数据库系统、表结构和数据分布。可测试多种方法,以找到适合特定用例的最佳方案。
四、删除重复行

让我们看看如何从表中的完全重复项中删除行,可使用公共表表达式(CTE)和ROW_NUMBER() 函数的组合。

WITH CTE AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY first_name, last_name, email, department – 列出定义重复的所有列
ORDER BY id – 最好是主键或唯一标识符
) AS rn
FROM employees
)
DELETE FROM CTE WHERE rn > 1;

SELECT * FROM employees;

工作原理

CTE 使用ROW_NUMBER() 在重复组内为每一行分配一个编号。
PARTITION BY子句定义什么构成重复(列出所有应相同的列)。
ORDER BY决定保留哪个重复项(rn=1的那个)。
DELETE语句删除所有rn>1的行,有效删除每组重复内容。

http://www.kler.cn/news/362877.html

相关文章:

  • 2024 睿抗机器人开发者大赛(RAICOM)-【网络安全】CTF 部分WP
  • 【性能优化】安卓性能优化之CPU优化
  • 上拉电阻和下拉电阻在电路中的作用(一)
  • Java中的进程与线程(如果想知道Java中有关进程与线程的知识点,那么只看这一篇就足够了!)
  • C# lambda表达式语法简介
  • 监控易监测对象及指标之:JBoss 7.1.x中间件监控
  • 【功能超全】基于OpenCV车牌识别停车场管理系统软件开发【含python源码+PyqtUI界面+功能详解】-车牌识别python 深度学习实战项目
  • VuePress集成到Vue项目的方法
  • 【复旦微FM33 MCU 外设开发指南】外设篇1——硬件除法器
  • 算力的定义、单位、影响因素、提升方法、分类、应用等。附超算排名
  • Redis 五种数据类型详解
  • ChatGLM3-6B大模型部署+微调教程,收藏这一篇就够了!
  • 从0开始深度学习(18)——环境和分布偏移
  • 【毕业设计】工具大礼包之『Maven3.6.3安装与配置』
  • git 上传项目到 github 并生成二维码
  • 离散制造和流程制造分别是什么?它们有什么区别?
  • PPT自动化:快速更换PPT图片(如何保留原图片样式等参数更换图片)
  • Linux安装Anaconda和Pytorch
  • pgstattuple查看表膨胀
  • 【图解版】力扣第146题:LRU缓存
  • 程序员数学:用Python学透线性代数和微积分 中文目录
  • Java学习Day48:苦战小黄龙(基础增删改查新建)
  • 23.Redis核心数据结构
  • 架构演进史
  • 浅谈C++之触发器用法
  • 云原生后端:构建现代化、高扩展性的应用基础设施