![](http://image.uc.cn/s/wemedia/s/upload/2024/823d906575ba88824f375a21be7b987e.jpg)
在SQL中,有几种常见的去重复数据的方法,以下以MySQL为例进行介绍:
1. 使用 DISTINCT 关键字
DISTINCT 关键字用于返回唯一不同的值。它可以作用于单个列或多个列。
示例:
假设有一个名为 employees 的表,包含 id、name 和 department 列。
sql复制-- 对单个列去重
SELECT DISTINCT department
FROM employees;
-- 对多个列去重,只有当多个列的值都相同时才会被视为重复
SELECT DISTINCT name, department
FROM employees;
![](http://image.uc.cn/s/wemedia/s/upload/2024/8ca5d9be9bf392e62d1862b36ce926c3.jpg)
2. 使用 GROUP BY 子句
GROUP BY 子句可以根据一个或多个列对结果进行分组,在分组的过程中会自动去除重复的行。
示例:
sql复制-- 按照department分组,每组只保留一条记录
SELECT department
FROM employees
GROUP BY department;
-- 按照多个列分组
SELECT name, department
FROM employees
GROUP BY name, department;
通常在使用 GROUP BY 时,会结合聚合函数(如 COUNT、SUM、AVG 等)一起使用,用于对每个分组进行计算。例如:
sql复制SELECT department, COUNT(*)
FROM employees
GROUP BY department;
这个查询会统计每个部门的员工数量。
![](http://image.uc.cn/s/wemedia/s/upload/2024/eb2981671afd572e88022ed80f594efa.jpg)
3. 使用 ROW_NUMBER() 窗口函数
ROW_NUMBER() 窗口函数可以为每一行分配一个唯一的行号,我们可以利用这个特性来去除重复行。
示例:
sql复制WITH ranked_employees AS (
SELECT
id,
name,
department,
ROW_NUMBER() OVER (PARTITION BY name, department ORDER BY id) AS row_num
FROM employees
)
SELECT id, name, department
FROM ranked_employees
WHERE row_num = 1;
在这个例子中,PARTITION BY name, department 表示按照 name 和 department 进行分区,在每个分区内,ROW_NUMBER() 函数会根据 id 列给每一行分配一个行号。最后,我们只选择行号为1的记录,从而达到去重的目的。
![](http://image.uc.cn/s/wemedia/s/upload/2024/101166b0dc58a181df4770586c800278.jpg)