首页 > 数据库 > SQL > 正文

SQL跨表统计怎么写_真实案例解析强化复杂查询思维【教学】

冷炫風刃
发布: 2025-12-21 08:04:03
原创
636人浏览过
跨表统计需先明确主表(结果分组依据)与从表(提供聚合字段),再据空值需求选JOIN类型;如统计各部门员工数及平均薪资,应以dept为主表LEFT JOIN emp,GROUP BY主表非聚合字段,并注意COUNT与AVG对NULL的处理差异。

sql跨表统计怎么写_真实案例解析强化复杂查询思维【教学】

跨表统计的核心不是堆函数,而是理清表间关系再选连接方式。先确认主表、从表,再看统计维度落在哪张表,最后决定用 JOIN 还是子查询——多数场景 JOIN 更直观高效。

明确主表和统计目标,避免“从哪查起”混乱

比如要统计“每个部门的员工数和平均薪资”,部门信息在 dept 表,员工信息在 emp 表,那 dept 就是主表(结果要按部门展示),emp 是从表(提供人数、薪资数据)。不能反过来以 emp 为主表再 group by dept_id,否则没员工的部门会被漏掉。

  • 主表 = 最终结果按哪一列分组(如 dept.name)
  • 从表 = 提供被聚合字段(如 emp.salary、count(*))
  • 空值敏感场景(如查“所有部门+员工数”),主表必须是 dept,用 LEFT JOIN emp

JOIN 类型选对,结果才不丢不重

继续上面的例子:如果用 INNER JOIN,部门没员工就不出现在结果里;用 LEFT JOIN,空部门也会显示 0 人、NULL 平均薪资。实际写法:

SELECT d.name, COUNT(e.id) AS emp_cnt, ROUND(AVG(e.salary), 2) AS avg_sal
  FROM dept d
  LEFT JOIN emp e ON d.id = e.dept_id
  GROUP BY d.id, d.name;

  • COUNT(e.id) 自动忽略 NULL,空部门计为 0
  • AVG(e.salary) 对空部门返回 NULL,可加 COALESCE(AVG(e.salary), 0) 转成 0
  • GROUP BY 必须包含主表所有非聚合字段(d.id 和 d.name 都要写)

多层关联+条件过滤,拆开想比硬写更稳

再进阶:查“每个城市中,2023年入职且薪资超8000的员工所在部门的平均薪资”。涉及 city(来自 dept)、emp 入职时间、薪资、部门平均薪资——四层逻辑:

Pixelfox AI
Pixelfox AI

多功能AI图像编辑工具

Pixelfox AI 2108
查看详情 Pixelfox AI
  1. 先筛出 2023 年入职且 salary > 8000 的员工(子查询 or WHERE)
  2. 关联 dept 拿到 city 和 dept_id
  3. 再按 city + dept_id 分组算部门平均薪资(注意:不是全公司平均)
  4. 最后按 city 汇总(如求各城市最高部门均薪)

推荐分步写:先写带 WHERE 的基础 JOIN 查出目标员工+部门+城市,再套一层 GROUP BY city, dept_id,外层再聚合。比单条嵌套三层子查询更易调试。

别忽略 NULL 和去重,统计值才真实

常见坑:

  • COUNT(*) 统计行数,COUNT(字段) 会跳过 NULL —— 想统计“有手机号的员工数”,用 COUNT(phone)
  • 员工表里一个员工可能有多条考勤记录,JOIN 后直接 COUNT(*) 会虚高 —— 加 DISTINCT 或先聚合再 JOIN
  • 部门表和员工表都有 name 字段,SELECT 时必须写表别名(d.name, e.name),否则报错或混淆

基本上就这些。跨表统计不复杂但容易忽略连接语义和空值处理,动手前花两分钟画个表关系草图,比查十次语法更快。

以上就是SQL跨表统计怎么写_真实案例解析强化复杂查询思维【教学】的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号