COUNT(DISTINCT 列名)用于统计非空唯一值的数量,如SELECT COUNT(DISTINCT city) FROM users返回不重复城市数;NULL值被自动忽略,多列去重需用子查询实现,大数据量时建议建索引或使用近似函数优化性能。
在使用 SQL 的 COUNT(DISTINCT column_name) 时,核心是统计某一列中非重复值的个数。它常用于去重计数,比如统计不同用户、不同地区或不同类别的数量。
基本语法和作用
COUNT(DISTINCT 列名) 只会计算该列中唯一且非 NULL 的值出现的次数。例如:
SELECT COUNT(DISTINCT city) FROM users;
这句查询会返回 users 表中不重复的城市数量。如果 city 列有 “北京”、”上海“、”北京”、”广州”,结果就是 3。
注意 NULL 值的影响
DISTINCT 会自动忽略 NULL 值。也就是说,即使某列有很多 NULL,它们不会被计入去重结果中。例如:
SELECT COUNT(DISTINCT email) FROM users;
如果 email 列中有重复邮箱还有多个 NULL,NULL 不参与计数,只统计不同的非空邮箱数量。
多列去重怎么办?
SQL 标准不支持直接写 COUNT(DISTINCT col1, col2)(MySQL 支持,但其他数据库如 PostgreSQL、Oracle 不行)。正确做法是使用子查询:
SELECT COUNT(*) FROM (
SELECT DISTINCT department, role FROM employees
) AS unique_combinations;
先用 DISTINCT 找出两列组合的唯一行,再对外层计数。这是跨数据库通用的写法。
性能优化建议
当数据量大时,COUNT(DISTINCT) 可能变慢,因为需要排序或哈希去重。可以考虑:
- 确保被统计的列有索引(尤其是单列场景)
- 避免在大表上频繁执行高基数(high cardinality)的去重计数
- 必要时用近似函数,如 Hive 中的 appROX_COUNT_DISTINCT
基本上就这些。只要理解它只算“非空且唯一”的值,并掌握多列处理方式,就能正确使用。实际写的时候先测试小数据,确认逻辑无误再上线。
mysql oracle 大数据 app ai 邮箱 上海 sql mysql NULL count select oracle hive postgresql 数据库 性能优化