sql去重
时间: 2025-07-08 20:47:22 浏览: 17
### SQL 去除重复数据的方法
在SQL中,去除查询结果中的重复记录是常见的需求。通常可以使用 `DISTINCT` 和 `GROUP BY` 这两个关键字来实现这一目标。虽然它们都能达到去重的效果,但在实际应用中,两者的使用场景和功能有所不同。
#### 使用 `DISTINCT`
`DISTINCT` 关键字用于返回唯一不同的值。当指定列存在多个相同的值时,`DISTINCT` 会只保留一个。它主要用于直接去除重复行,适用于简单的去重场景。例如:
```sql
SELECT DISTINCT column_name FROM table_name;
```
此语句将从表 `table_name` 中选取 `column_name` 列的所有不同值。需要注意的是,`DISTINCT` 对所有指定的列都起作用,只有当所有指定列的组合完全相同时,才会被视为重复记录并被处理掉 [^5]。
#### 使用 `GROUP BY`
相比之下,`GROUP BY` 更多用于对数据进行分组,并结合聚合函数一起使用以计算统计数据。尽管如此,它也可以用来去除重复记录。通过将数据按照某些列进行分组,每组只返回一行数据,从而实现去重的目的。例如:
```sql
SELECT column1, COUNT(column2), AVG(column3)
FROM table_name
GROUP BY column1;
```
在这个例子中,`GROUP BY` 将根据 `column1` 的不同值对数据进行分组,并且对于每个分组,都会执行 `COUNT` 和 `AVG` 聚合函数来统计信息 [^2]。
#### 比较与选择
- **`DISTINCT`** 直接去除重复行,适合不需要额外统计的情况。
- **`GROUP BY`** 在去除重复的同时还能提供更多的数据分析能力,如计数、求和等统计操作。
选择合适的关键字取决于具体的需求。如果只是想简单地过滤掉重复的数据,那么使用 `DISTINCT` 是最直接的方式;而如果还需要基于这些分组做进一步的分析,则应该采用 `GROUP BY` [^1]。
#### 多字段去重
对于多字段组合的去重情况,可以通过以下两种等价的方式来实现:
```sql
-- 使用 DISTINCT
SELECT COUNT(DISTINCT name, sex) FROM aaa.student;
-- 使用 GROUP BY
SELECT COUNT(*) FROM (SELECT name, sex FROM aaa.student GROUP BY name, sex) AS kk;
```
这里的第一种方式利用了 `DISTINCT` 来确保 `name` 和 `sex` 的组合是唯一的,第二种方式则是先用 `GROUP BY` 对 `name` 和 `sex` 进行分组,然后计算总共有多少个不重复的组合 [^3]。
#### 删除重复数据
除了查询之外,在处理数据库中的重复数据时,还可以使用 `DELETE` 语句配合子查询和 `GROUP BY` 来移除多余的记录。比如下面的例子就是删除表 `a_person_test` 中除了每组 `person_sort_code` 最大 `id` 的记录以外的所有重复记录:
```sql
DELETE FROM a_person_test
WHERE id NOT IN (
SELECT t.max_id
FROM (
SELECT MAX(id) AS max_id
FROM a_person_test
GROUP BY person_sort_code
) AS t
);
```
这段代码首先通过内层的 `GROUP BY` 找到每个 `person_sort_code` 组内的最大 `id`,然后外层的 `DELETE` 语句会删除那些不在这个列表中的记录 [^4]。
---
阅读全文
相关推荐

















