会。count(distinct column_name) 默认忽略 null 值,不参与去重计数;mysql 8.0 前不支持多列 distinct,需用子查询或拼接;postgresql 中 count(distinct) 与 group by 性能相近,但功能更灵活;sql server 对 text 类型需先转 varchar(max) 才能用 distinct。

COUNT DISTINCT 会忽略 NULL 吗?
会。COUNT(DISTINCT column_name) 默认跳过所有 NULL 值,不参与去重计数。如果你的字段有大量 NULL,而你误以为它们被算进去了,结果就会偏低。
验证方法很简单:分别执行
SELECT COUNT(DISTINCT col) FROM t; SELECT COUNT(DISTINCT col) + COUNT(*) FILTER (WHERE col IS NULL) FROM t;
后者才是“非重复值 + NULL 的个数”,但注意:FILTER 是 PostgreSQL 语法;MySQL 和 SQL Server 不支持,得用 CASE 模拟。
MySQL 8.0 之前没法直接 COUNT DISTINCT 多列?
对,老版本 MySQL(如 5.7)不支持 COUNT(DISTINCT a, b)——它会报语法错误。你得绕一下:
- 用
CONCAT(a, '|', b)拼接(前提是字段不含|,否则可能误合并) - 更稳妥的是子查询去重:
SELECT COUNT(*) FROM (SELECT DISTINCT a, b FROM t) AS tmp - 注意:子查询方式在大数据量时可能变慢,因为要物化临时表
PostgreSQL 里 COUNT DISTINCT 比 GROUP BY + COUNT 快吗?
通常不快,甚至更慢。因为 COUNT(DISTINCT x) 内部仍需哈希或排序去重,和显式写 SELECT COUNT(*) FROM (SELECT DISTINCT x FROM t) s 底层开销接近。
但关键区别在于:
-
COUNT(DISTINCT)是聚合函数,可和其他聚合混用(比如同时算AVG(price)和去重用户数) - 而
GROUP BY子查询只能返回单个计数,想加其他指标就得 JOIN 或 CTE - 如果只统计一个字段的去重数,两者性能差异不大;但字段含大量重复值时,
GROUP BY可能略优(优化器有时能提前终止)
SQL Server 中 DISTINCT 遇到 text / ntext 类型报错怎么办?
会报错:Operand data type text is invalid for distinct operator。因为 text、ntext、image 这些旧类型不支持 DISTINCT 或 GROUP BY。
必须先转型:
- 用
CAST(col AS VARCHAR(MAX))或CONVERT(VARCHAR(MAX), col) - 注意:如果内容超 2GB,
VARCHAR(MAX)也装不下,得改用XML或分块处理 - 长远看,应把表结构升级为
varchar(max)/nvarchar(max),这些新类型完全支持DISTINCT
实际写法示例:SELECT COUNT(DISTINCT CAST(description AS VARCHAR(MAX))) FROM products










