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

devtools/2024/10/25 12:47:06/

数据库中的重复数据可能导致存储成本增加、查询性能下降、分析结果不准确以及数据管理混乱。本文概述了四种 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.ppmy.cn/devtools/128683.html

相关文章

AnaTraf | 网络性能监控与TCP响应时延:保障高效运维的核心要素

http://www.anatraf.com 网络作为业务运行的核心,直接影响着业务的连续性和用户体验。为了确保网络的高效性和稳定性,网络性能监控成为IT运维工作中的重要一环。TCP响应时延则是衡量网络性能的重要指标之一。本文将探讨如何通过网络性能监控和优化TCP响…

错排问题(C语言)

错排问题(Derangement)是一个经典的组合数学问题,描述的是将 \( n \) 个元素进行排列,使得没有一个元素出现在它原来的位置上。换句话说,错排问题要求所有元素都不在它们原来的位置上。 ### 错排问题的公式 错排问题…

界面控件DevExpress WPF中文教程:Data Grid——表格视图概述

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

2020款Macbook Pro A2251无法充电无法开机定位及修复

问题背景 up主有一台2020年的Macbook Pro,带Touch Bar,16G512G,四核I5,型号A2251 应该是一周没充电了,之前还用的好好的,后来有一天出差想带上 打开没电,手头上有个小米的66W快充头&#xff0c…

关于ETL的两种架构(ETL架构和ELT架构)

ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库,但其对象…

【python实战】利用代理ip爬取Alibaba海外版数据

引言 在跨境电商的业务场景中,数据采集是分析市场、了解竞争对手以及优化经营策略的重要环节。然而,随着越来越多企业依赖数据驱动决策,许多跨境电商平台为了保护自身数据,采取了更严格的防护措施。这些平台通过屏蔽大陆IP地址或部…

【功能安全】汽车功能安全个人认证证书

目录 1、证书 2、课程信息 📖 推荐阅读 1、证书 汽车功能安全工程师去拿类似莱茵、SGS、南德颁发的证书,如下: 2、课程信息 一般上什么课程了,课程信息大概如下: 汽车功能安全工程师认证课 (3天&#…

第2章·C程序设计的初步认识——例题汇总

本文是《全国计算机等级考试二级教程——C语言程序设计》中&#xff0c;第2章“C程序设计的初步认识”中的例题汇总。 【例2.1】求矩形的面积。 #include <stdio.h> main() { double a, b, area; a 1.2; b 3.6; area a * b; printf("a %f, b %f, ar…