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.mzph.cn/news/882990.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见的Java面试题

1.在项目中遇到难点是如何处理 数据库性能问题:在数据库处理数据操作(如查询、插入、更新、删除等)时表现出的响应速度慢、资源利用率高、吞吐量低等不良情况,影响了系统的整体性能和用户体验 解决方案有以下这些: 优化…

有什么牌子的学生台灯性价比高?五款性价比高的学生用台灯

最近不少朋友都在问我,有什么牌子的学生台灯性价比高?说实话,这还真不是个容易回答的问题。市面上的台灯品种琳琅满目,价格从几十到上千都有,功能也是五花八门。选择一款适合自己的护眼台灯,确实需要好好琢…

深度学习中的迁移学习:优化训练流程与提高模型性能的策略,预训练模型、微调 (Fine-tuning)、特征提取

1024程序员节 | 征文 深度学习中的迁移学习:优化训练流程与提高模型性能的策略 目录 🏗️ 预训练模型:减少训练时间并提高准确性🔄 微调 (Fine-tuning):适应新任务的有效方法🧩 特征提取:快速…

Flink 1.18安装 及配置 postgres12 同步到mysql5.7(Flink sql 方式)

文章目录 1、参考2、flink 常见部署模式组合3、Standalone 安装3.1 单节点安装3.2 问题13.3 修改ui 端口3.4 使用ip访问 4 flink sql postgres --->mysql4.1 配置postgres 124.2 新建用户并赋权4.3. 发布表4.4 Flink sql4.5 Could not find any factory for identifier post…

深度学习到底是怎么实现训练模型的(以医学图像分割为例

本文主要讲解的主要不是深度学习训练模型过程中的数学步骤,不是讲: 输入——前向传播——反向传播——输出,特征提取,特征融合等等过程。而是对于小白或者门外汉来说,知道模型怎么处理的,在用些什么东西&am…

分享二维码弹窗,实现扫码跳转

1.二维码组件 QRCode CustomDialog export struct ShareDialog {Prop item: QuestionDetail as QuestionDetailcontroller: CustomDialogControllerQRCode(this.item.id).width(160).height(160) } 2.扫码跳转 前置知识: Scan Kit 提供默认界面扫码能力。canIUs…

推荐几个好用的配色网站

1.ColorSpace 地址:ColorSpace - Color Palettes Generator and Color Gradient Tool Color Space 是款功能强大的渐变色在线生成器,支持单色、双色,甚至三色渐变。 进入首页,输入一个颜色,点击 GENERATE&#xff08…

从一个简单的计算问题,看国内几个大语言模型推理逻辑能力

引言 首先,来看问题: 123456*987654等于多少,给出你计算的过程。 从openai推出chatgpt以来,大模型发展的很快,笔者也经常使用免费的大语言模型辅助进行文档编写和编码工作。大模型推出时间也好久了,笔者想…

autMan框架的定时推送功能学习

一、定时推送功能简介 “定时推送”位于“系统管理”目录 主要有两个使用方向: 一是定时向某人或某群发送信息。 二是定时运行某指令,就是机器人给自己发指令,让自己运行此指令。 二、定时推送设置 定时:cron表达式,…

常用分布的数学期望、方差、特征函数

文章目录 相关教程相关文献常用分布的数学期望&方差&特征函数定义事件域概率条件概率随机变量分布函数连续随机变量的概率密度函数数学期望离散随机变量连续随机变量 方差与标准差最大似然估计特征函数 不等式Chebyshev(切比雪夫)不等式 作者&am…

Java 21新特性概述

Java 21于2023年9月19日发布,这是一个LTS(长期支持)版本,到此为止,目前有Java 8、Java 11、Java 17和Java 21这四个LTS版本。 Java 21此次推出了15个新特性,本节就介绍其中重要的几个特性: JEP…

C# 读取本地网络配置信息

C# 读取本地网络配置信息 应用场景示例示例1: 获取所有网络接口的信息示例2: 获取特定网络接口的IP配置信息示例3: 获取DNS服务器地址 在现代软件开发中,处理网络配置信息是一个常见需求。无论是开发桌面、移动还是服务器应用程序,了解如何在C#中读取和管…

Ubuntu20.04安装ROS2教程

Ubuntu20.04安装ROS2教程 ROS 2 安装指南支持的ROS 2 版本设置语言环境(Set locale)设置源(Setup Sources)设置密钥安装 ROS 2 包(Install ROS 2 packages)环境设置(Environment setup&#xff…

自闭症学校:儿童成长的崭新希望

在社会的一隅,存在着这样一群特殊的孩子,他们仿佛沉浸于独属于自己的世界,难以与外界进行正常的交流互动,他们便是自闭症儿童。对于这些孩子及其家庭而言,自闭症学校无疑成为了助力他们成长的全新希望。 自闭症学校为孩…

详细且系统的Spring Boot应用开发

为了帮助大家更好地理解如何使用Spring Boot来构建一个基础的Web应用程序,我将通过一个简单的例子来进行说明。这个例子将是一个基本的RESTful API服务,用于管理图书信息。 项目准备 1. 开发环境设置(这个我之前有发文,这里就不详…

java--反射(reflection)

一、反射机制 Java Reflection (1)反射机制允许程序在执行期借助 Reflection API 取得任何类的内部信息(比如成员变量、构造器、成员方法等等),并能操作对象的属性及方法。反射在设计模式和框架底层都会用到。&#x…

[Linux Codec驱动]音频路由概念

1. 音频路由的基本概念 源(Source):音频信号的发出方,通常是一个音频输入设备,如麦克风、音频播放设备等。接收端(Sink):音频信号的接收方,通常是音频输出设备&#xff…

时间序列预测(九)——门控循环单元网络(GRU)

目录 一、GRU结构 二、GRU核心思想 1、更新门(Update Gate):决定了当前时刻隐藏状态中旧状态和新候选状态的混合比例。 2、重置门(Reset Gate):用于控制前一时刻隐藏状态对当前候选隐藏状态的影响程度。…

爬虫爬取数据时,如何解决由于验证码通常是动态生成的,直接通过URL下载可能会遇到验证码内容不一致的问题?( ̄︶ ̄)↗

在使用Selenium下载图片验证码时,由于验证码通常是动态生成的,直接通过URL下载可能会遇到验证码内容不一致的问题。因此,更可靠的方法是使用Selenium的截图功能,然后裁剪出验证码部分。 再通过第三方服务(如AntiCaptch…

Java项目-基于springboot框架的智慧外贸系统项目实战(附源码+文档)

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…