📅  最后修改于: 2023-12-03 15:20:17.357000             🧑  作者: Mango
在处理数据时,经常会遇到需要删除表中重复的数据项。本文介绍如何使用 SQL 根据某一列删除表中的重复数据项。
重复数据项指的是在某一列或多列上,数据值完全或部分相同的数据记录。如下所示,表 orders
中包含多条订单记录,其中部分记录在客户 ID (customer_id
) 列上有重复:
| order_id | customer_id | order_date | |----------|-------------|------------| | 1 | 1001 | 2021-01-01 | | 2 | 1002 | 2021-01-02 | | 3 | 1001 | 2021-01-03 | | 4 | 1003 | 2021-01-04 | | 5 | 1002 | 2021-01-05 |
在这个例子中,订单 1 和订单 3 在客户 ID 上重复,订单 2 和订单 5 也在客户 ID 上重复。
为了删除表中的重复数据项,我们需要使用 SQL 的 DISTINCT
关键字来选择唯一的数据记录。DISTINCT
关键字用于从数据库表中返回不同的值,我们可以将它用于查询语句的列名称后,根据指定的列值返回唯一数据记录。
-- 查询 orders 表中的唯一记录
SELECT DISTINCT customer_id
FROM orders;
使用 DISTINCT
关键字查询表中唯一的客户 ID 列后,我们会发现表中的重复记录已经被删除。
| customer_id | |-------------| | 1001 | | 1002 | | 1003 |
但是在这个例子中,我们只根据客户 ID 列选择唯一的数据记录,其他数据列仍然存在重复。
为了删除整条记录的重复项,我们需要使用 GROUP BY
关键字,按照指定的列名称对数据进行分组,并计算每组中的行数:
SELECT
customer_id,
COUNT(*) AS cnt
FROM orders
GROUP BY customer_id;
在查询结果中,我们可以看到客户号码为 1001 和 1002 的客户 ID 列出现了多次,因为订单表中存在多条记录与该客户相关联。
| customer_id | cnt | |-------------|-----| | 1001 | 2 | | 1002 | 2 | | 1003 | 1 |
现在,我们可以使用子查询来选择仅出现一次的数据记录并删除表中的重复项。具体做法是将 GROUP BY
查询作为子查询,选择仅出现一次的客户 ID 列,然后使用 IN
关键字将结果作为过滤条件:
DELETE FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 1
);
在这个例子中,我们使用 HAVING COUNT(*) > 1
来选择所有出现超过一次的数据记录。在 IN
子句中使用子查询的结果,删除所有客户 ID 列出现超过一次的所有记录。最终,我们的订单表中不再包括出现重复项的记录。
使用 SQL 根据列删除重复项可以有效清理数据表中的脏数据,并保证数据准确性和可靠性。我们可以使用 DISTINCT
关键字选择唯一数据记录,使用 GROUP BY
关键字选择出现重复项的数据记录,并使用子查询和 IN
关键字来删除表中的重复记录。