- SQL 教程
- SQL - 首页
- SQL - 概述
- SQL - RDBMS 概念
- SQL - 数据库
- SQL - 语法
- SQL - 数据类型
- SQL - 运算符
- SQL - 表达式
- SQL 数据库
- SQL - 创建数据库
- SQL - 删除数据库
- SQL - 选择数据库
- SQL - 重命名数据库
- SQL - 显示数据库
- SQL - 备份数据库
- SQL 表
- SQL - 创建表
- SQL - 显示表
- SQL - 重命名表
- SQL - 截断表
- SQL - 克隆表
- SQL - 临时表
- SQL - 修改表
- SQL - 删除表
- SQL - 删除表数据
- SQL - 约束
- SQL 查询
- SQL - 插入查询
- SQL - 选择查询
- SQL - SELECT INTO
- SQL - INSERT INTO SELECT
- SQL - 更新查询
- SQL - 删除查询
- SQL - 排序结果
- SQL 视图
- SQL - 创建视图
- SQL - 更新视图
- SQL - 删除视图
- SQL - 重命名视图
- SQL 运算符和子句
- SQL - WHERE 子句
- SQL - TOP 子句
- SQL - DISTINCT 子句
- SQL - ORDER BY 子句
- SQL - GROUP BY 子句
- SQL - HAVING 子句
- SQL - AND & OR
- SQL - 布尔 (BIT) 运算符
- SQL - LIKE 运算符
- SQL - IN 运算符
- SQL - ANY, ALL 运算符
- SQL - EXISTS 运算符
- SQL - CASE
- SQL - NOT 运算符
- SQL - 不等于
- SQL - IS NULL
- SQL - IS NOT NULL
- SQL - NOT NULL
- SQL - BETWEEN 运算符
- SQL - UNION 运算符
- SQL - UNION vs UNION ALL
- SQL - INTERSECT 运算符
- SQL - EXCEPT 运算符
- SQL - 别名
- SQL 连接
- SQL - 使用连接
- SQL - 内连接
- SQL - 左连接
- SQL - 右连接
- SQL - 交叉连接
- SQL - 全连接
- SQL - 自连接
- SQL - 删除连接
- SQL - 更新连接
- SQL - 左连接 vs 右连接
- SQL - UNION vs JOIN
- SQL 键
- SQL - 唯一键
- SQL - 主键
- SQL - 外键
- SQL - 组合键
- SQL - 候选键
- SQL 索引
- SQL - 索引
- SQL - 创建索引
- SQL - 删除索引
- SQL - 显示索引
- SQL - 唯一索引
- SQL - 聚簇索引
- SQL - 非聚簇索引
- 高级 SQL
- SQL - 通配符
- SQL - 注释
- SQL - 注入
- SQL - 托管
- SQL - MIN & MAX
- SQL - NULL 函数
- SQL - CHECK 约束
- SQL - DEFAULT 约束
- SQL - 存储过程
- SQL - NULL 值
- SQL - 事务
- SQL - 子查询
- SQL - 处理重复数据
- SQL - 使用序列
- SQL - 自动递增
- SQL - 日期 & 时间
- SQL - 游标
- SQL - 公共表表达式
- SQL - GROUP BY vs ORDER BY
- SQL - IN vs EXISTS
- SQL - 数据库调优
- SQL 函数参考
- SQL - 日期函数
- SQL - 字符串函数
- SQL - 聚合函数
- SQL - 数值函数
- SQL - 文本 & 图片函数
- SQL - 统计函数
- SQL - 逻辑函数
- SQL - 游标函数
- SQL - JSON 函数
- SQL - 转换函数
- SQL - 数据类型函数
- SQL 有用资源
- SQL - 问答
- SQL - 快速指南
- SQL - 有用函数
- SQL - 有用资源
- SQL - 讨论
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;