1. 使用 DISTINCT 关键字
DISTINCT 关键字用于返回唯一不同的值。
SELECT DISTINCT column1, column2 FROM table_name;
这会返回 column1 和 column2 组合的所有唯一行。
2. 使用 GROUP BY
如果你想要对某些列进行分组,并对每个组应用聚合函数(如 COUNT, MAX, MIN 等),可以使用 GROUP BY。
SELECT column1, column2 FROM table_name GROUP BY column1, column2;
这将返回每个唯一 column1 和 column2 组合的行。
3. 使用 ROW_NUMBER() 或 RANK() 窗口函数(适用于SQL Server, PostgreSQL, Oracle等)
这些函数可以为结果集中的每行分配一个唯一的序号,然后你可以基于这个序号选择不重复的行。
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY column1, column2 ORDER BY some_column) as rn
FROM table_name
) temp_table
WHERE rn = 1;
这里,PARTITION BY 子句用于定义哪些列的组合将被视为唯一,ORDER BY 子句定义了如何为每组分配序号。
4. 使用 GROUP BY 与聚合函数结合(去除重复行但不完全保留所有列信息)
如果你想要去除重复的行,但只想保留某些列的聚合信息,可以这样做:
SELECT column1, MAX(column2) as max_column2, COUNT(*) FROM table_name GROUP BY column1;
5. 使用 CTE(公用表表达式)和 ROW_NUMBER()(适用于SQL Server, PostgreSQL, Oracle等)
CTE 可以与窗口函数一起使用来去重。
WITH RankedResults AS (
SELECT *, ROW_NUMBER() OVER(PARTITION BY column1 ORDER BY column2) as rn
FROM table_name
)
SELECT * FROM RankedResults WHERE rn = 1;
6. 使用 DELETE 语句删除重复行(谨慎使用)
如果你想要删除重复的行,可以这样做(注意:这将永久删除数据,请确保你有备份):
DELETE t1 FROM table_name t1
JOIN (
SELECT column1, MIN(id) as min_id -- 假设id是主键或唯一标识符
FROM table_name
GROUP BY column1
HAVING COUNT(*) > 1
) t2 ON t1.column1 = t2.column1 AND t1.id <> t2.min_id;
这些方法可以根据具体需求和数据库系统选择使用。每种方法都有其适用的场景。在处理数据时,请确保理解每种方法的影响,特别是在删除数据时。