SQL - 处理重复数据



有时,表或结果集包含重复记录。在大多数情况下,允许重复记录,但在某些情况下,需要防止重复记录并将其从数据库表中删除。

为什么在 SQL 中处理重复数据是必要的?

在 SQL 数据库中处理重复数据是为了防止以下后果:

  • 组织数据库中重复数据的出现会导致逻辑错误。

  • 重复数据占用存储空间,导致数据库使用效率下降。

  • 由于资源使用增加,处理资源的总成本也会上升。

  • 由于重复数据的存在导致逻辑错误增加,从数据库数据分析中得出的结论也会出现错误。

本章将介绍如何防止表中出现重复记录以及如何删除已存在的重复记录。

防止重复条目

为了防止重复记录进入表中,我们可以在相关字段上定义主键或唯一索引。这些数据库约束确保指定列或列集中每个条目的唯一性。

示例

让我们使用以下查询创建一个 CUSTOMERS 表:

CREATE TABLE CUSTOMERS (
   FIRST_NAME CHAR(20),
   LAST_NAME CHAR(20),
   SEX CHAR(10)
);

由于我们没有在表上定义任何约束,因此可以向其中插入重复记录。为了防止这种情况,请在相关字段(例如 LAST_NAME 和 FIRST_NAME 组合)上添加主键约束:

ALTER TABLE CUSTOMERS 
ADD PRIMARY KEY (LAST_NAME, FIRST_NAME);

使用 INSERT IGNORE 查询

或者,我们可以使用 INSERT IGNORE 语句插入记录,而不会为重复项生成错误,如下所示:

INSERT IGNORE INTO CUSTOMERS (LAST_NAME, FIRST_NAME) VALUES
( 'Jay', 'Thomas'),
( 'Jay', 'Thomas');

如下所示,表中将只包含一条记录(忽略重复值)。

FIRST_NAME LAST_NAME SEX
Thomas Jay NULL

使用 REPLACE 查询

或者,使用 REPLACE 语句替换重复项,如下面的查询所示:

REPLACE INTO CUSTOMERS (LAST_NAME, FIRST_NAME) VALUES
( 'Ajay', 'Kumar'),
( 'Ajay', 'Kumar');

表将包含以下记录:

FIRST_NAME LAST_NAME SEX
Kumar Ajay NULL
Thomas Jay NULL

INSERT IGNORE 和 REPLACE 语句的选择应根据所需的重复处理行为做出。INSERT IGNORE 语句保留第一组重复记录并丢弃任何后续重复记录。相反,REPLACE 语句保留最后一组重复项并擦除任何较早的重复项。

使用 UNIQUE 约束

在表中强制唯一性的另一种方法是添加 UNIQUE 约束而不是 PRIMARY KEY 约束:

CREATE TABLE BUYERS (
   FIRST_NAME CHAR(20) NOT NULL,
   LAST_NAME CHAR(20) NOT NULL,
   SEX CHAR(10),
   UNIQUE (LAST_NAME, FIRST_NAME)
);

计数和识别重复项

要根据特定列计算和识别重复记录,我们可以使用 COUNT 函数和 GROUP BY 子句。

示例

以下是计算 BUYERS 中 FIRST_NAME 和 LAST_NAME 重复记录的查询:

SELECT COUNT(*) as repetitions, LAST_NAME, FIRST_NAME
FROM BUYERS
GROUP BY LAST_NAME, FIRST_NAME
HAVING repetitions > 1;

此查询将返回 PERSON_TABLE 表中所有重复记录的列表。要识别重复的值集,请按照以下步骤操作:

  • 确定哪些列包含可能重复的值。

  • 将这些列列在列选择列表中,以及 COUNT(*)。

  • 还在 GROUP BY 子句中列出这些列。

  • 添加 HAVING 子句,通过要求组计数大于一来消除唯一值。

从表中消除重复项

我们可以将 DISTINCT 关键字与 SELECT 语句一起使用,从表中检索唯一记录。

SELECT DISTINCT LAST_NAME, FIRST_NAME
FROM BUYERS
ORDER BY LAST_NAME;

或者,您可以包含一个 GROUP BY 子句,指定您要选择的列以消除重复项:

SELECT LAST_NAME, FIRST_NAME
FROM BUYERS
GROUP BY LAST_NAME, FIRST_NAME;
广告
© . All rights reserved.