You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL如何查询所有列的唯一值计数与空值占比?有无类似pg_stats的系统表?

MySQL列级统计信息查询方案

MySQL存在和PostgreSQL pg_stats功能类似的系统统计表,可以快速获取近似的空值计数、唯一值计数,不需要逐列手写COUNT(DISTINCT)查询。

1. 8.0及以上版本原生支持

MySQL 8.0新增了INFORMATION_SCHEMA.COLUMN_STATISTICS系统表,存储了所有列的统计信息,对应字段如下:

  • 空值计数:通过histogram字段的null-count属性获取,对应pg_stats的null_frac * 总行数
  • 唯一值计数:通过histogram字段的distinct-values属性获取,对应pg_stats的n_distinct
    针对你提供的employees表,查询语句如下:
-- 先更新统计信息,确保数据最新
ANALYZE TABLE employees;
-- 查询列级统计结果
SELECT
    column_name,
    JSON_UNQUOTE(JSON_EXTRACT(histogram, '$.\"null-count\"')) AS num_null,
    JSON_UNQUOTE(JSON_EXTRACT(histogram, '$.\"distinct-values\"')) AS num_of_distinct
FROM information_schema.column_statistics
WHERE table_schema = '你的数据库名'
  AND table_name = 'employees';

返回的结果和你用PostgreSQL pg_stats查询的结果基本一致,属于近似统计值,误差在可接受范围内,适合快速做数据探查。

2. 低版本MySQL兼容方案

如果你使用的是MySQL 5.7及更低版本,没有COLUMN_STATISTICS表,可以用以下SQL批量生成所有列的统计查询语句,一次性执行即可拿到所有列的精确统计结果,不需要逐列手写:

-- 生成批量查询SQL
SELECT CONCAT(
    'SELECT ''', COLUMN_NAME, ''' AS column_name, ',
    'COUNT(DISTINCT `', COLUMN_NAME, '`) AS num_of_distinct, ',
    'SUM(`', COLUMN_NAME, '` IS NULL) AS num_null ',
    'FROM `', TABLE_NAME, '` UNION ALL'
) AS exec_sql
FROM information_schema.columns
WHERE table_schema = '你的数据库名'
  AND table_name = 'employees';

将生成的SQL语句末尾的UNION ALL删除后执行,就能一次性拿到所有列的精确统计结果。

内容的提问来源于stack exchange,提问作者zshandy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:09:02