SQL - 处理重复项


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

为什么需要在 SQL 中处理重复项?

为了防止出现以下后果,必须处理 SQL 数据库中的重复项 -

  • 组织数据库中重复项的存在将导致逻辑​​错误。

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

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

  • 随着重复数据的存在导致逻辑错误的增加,从数据库中的数据分析得出的结论也将是错误的。

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

防止重复条目

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

例子

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

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

由于我们没有在表上定义任何约束,因此可以向其中插入重复记录。为了防止这种情况,请在相关字段上添加 PRIMARY KEY 约束(一起说 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');

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

性别
托马斯 杰伊 无效的

使用替换查询:

或者,使用 REPLACE 语句替换重复项,如以下查询所示 -

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

该表将包含以下记录 -

性别
库马尔 阿杰 无效的
托马斯 杰伊 无效的

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

使用唯一约束:

在表中强制唯一性的另一种方法是添加 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 子句,通过要求组计数大于 1 来消除唯一值。

消除表中的重复项

我们可以使用 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;