SQL统计不同字段组合数量_多列聚合查询技巧【技巧】
#技术教程 发布时间: 2025-12-20
统计多字段组合次数应使用 GROUP BY 多列配合 COUNT(),如 SELECT city, industry, COUNT() FROM companies GROUP BY city, industry;非聚合字段须全在 GROUP BY 中,过滤分组结果用 HAVING,补全缺失组合需 CROSS JOIN 加 LEFT JOIN,高频组合字段应建顺序一致的联合索引。
要统计多个字段组合出现的次数,核心是用 GROUP BY 多个列 配合 COUNT(*),而不是嵌套或拼接字段——既清晰又高效。
直接多列 GROUP BY 是最标准写法
数据库原生支持对多个字段同时分组,SQL 引擎会自动把值完全相同的行归为一组。例如统计「城市 + 行业」组合的公司数量:
- SELECT city, industry, COUNT(*) AS cnt FROM companies GROUP BY city, industry;
- 注意:SELECT 中所有非聚合字段(如 city、industry)必须全部出现在 GROUP BY 子句中,否则
报错(严格模式下)。 - 顺序无关紧要,
GROUP BY industry, city效果一致,但建议和 SELECT 顺序保持一致,便于阅读。
需要过滤组合频次时,用 HAVING 而不是 WHERE
WHERE 在分组前过滤单行数据;HAVING 在分组后过滤“组合组”。比如只看出现 ≥5 次的城市-行业组合:
- SELECT city, industry, COUNT(*) AS cnt FROM companies GROUP BY city, industry HAVING COUNT(*) >= 5;
- HAVING 后可直接写聚合函数,也可用别名(部分数据库如 MySQL 支持,PostgreSQL 不支持别名,建议写全 COUNT(*))。
想补全缺失组合?考虑 LEFT JOIN 或生成维度表
默认 GROUP BY 只返回实际存在的组合。若需展示所有城市 × 所有行业(包括计数为 0 的),不能靠 GROUP BY 单独实现:
- 先用
SELECT DISTINCT city FROM companies和SELECT DISTINCT industry FROM companies构建完整组合集(可用 CROSS JOIN); - 再 LEFT JOIN 原表并 COUNT,把空值转为 0:
COALESCE(COUNT(t.id), 0)。
性能提醒:多列组合字段记得建联合索引
高频用于 GROUP BY 的字段组合(如 (city, industry)),建议创建联合索引:
- CREATE INDEX idx_city_industry ON companies(city, industry);
- 索引顺序应与 GROUP BY 顺序一致,才能有效加速分组扫描;
- 避免在组合字段上用函数(如 UPPER(city)),会导致索引失效。
上一篇 : SQL按字段范围分批处理_SQL避免长时间锁表
下一篇 : 深入评测NUC 13 Extreme:小巧精致的NUC霸主
-
SEO外包最佳选择国内专业的白帽SEO机构,熟知搜索算法,各行业企业站优化策略!
SEO公司
-
可定制SEO优化套餐基于整站优化与品牌搜索展现,定制个性化营销推广方案!
SEO套餐
-
SEO入门教程多年积累SEO实战案例,从新手到专家,从入门到精通,海量的SEO学习资料!
SEO教程
-
SEO项目资源高质量SEO项目资源,稀缺性外链,优质文案代写,老域名提权,云主机相关配置折扣!
SEO资源
-
SEO快速建站快速搭建符合搜索引擎友好的企业网站,协助备案,域名选择,服务器配置等相关服务!
SEO建站
-
快速搜索引擎优化建议没有任何SEO机构,可以承诺搜索引擎排名的具体位置,如果有,那么请您多注意!专业的SEO机构,一般情况下只能确保目标关键词进入到首页或者前几页,如果您有相关问题,欢迎咨询!
报错(严格模式下)。