SQL的DISTINCT关键字有何作用?去除重复数据的技巧

2 02 2 年,在某城市做项目时,遇到需要统计不同类别的数量。
当时我使用了SQL的DISTINCT关键字,发现它可以直接跟在SELECT后面指定单个列并去除重复。
这个用法对我来说非常简单。
比如我这样写: SELECT DISTINCT 列名 FROM 表名;该查询返回table_name中column_name的所有唯一值。

后来项目需要根据多列组合去重,我就用了DISTINCT来处理。
例如:SELECT DISTINCT column1 ,column2 FROM 表名;这样,只有当column1 和column2 的组合值完全相同时,它们才会被视为重复行并被删除。

我还对比了DISTINCT和GROUP BY,发现DISTINCT更加简单直接,只用于去重,不涉及聚合计算,而GROUP BY更加灵活,可以与聚合函数结合使用。
我当时选择了DISTINCT,因为它更适合我的需求。

在处理NULL值时,我发现DISTINCT将所有NULL值视为同一个值,只保留一个。
如果我想排除 NULL 值,我可以在 WHERE 子句中将它们过滤掉,如下所示: SELECT DISTINCT 列名 FROM 表名 WHERE 列名 IS NOT NULL;
在对复杂逻辑进行重复数据删除时,我尝试了窗口函数。
我写了一个这样的子查询:WITH RankedData AS (SELECT, ROW_NUMBER() OVER (PARTITION BY columns_name ORDER BY some_column) AS rn FROM table_name) SELECT FROM RankedData WHERE rn = 1 ;该方法为每组重复数据分配一个序号,并且只保留序号为1 的行。

在处理大量数据时,我注意到临时表和游标的使用。
您可以将数据插入临时表或逐行处理数据、检测重复项并将唯一值插入到结果表中。
然而,性能较低,我尽量避免在大数据集上使用它。

最后,我还注意到不同数据库提供的具体重复数据删除方法,例如 PostgreSQL 的 DISTINCT ON (column_name) 和 MySQL 的 GROUP_CONCAT。
这些功能可以提高效率。
我根据场景选择了合适的方法来平衡可读性和性能。

SQL中去重的三种方法

这是一个坑。
别相信。
不要这样做。

实用提醒:对于大量数据,重复使用 ROW_NUMBER()。