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

计算员工性别占比的两条SQL查询结果差异原因解析

男女员工占比查询结果差异原因分析

员工表数据

+-------+---------+--------+--------+----------+
| EmpID | EmpName | Gender | Salary | city     |
+-------+---------+--------+--------+----------+
|     1 | Arjun   | M      |  75000 | Pune     |
|     2 | Ekdanta | M      | 125000 | Banglore |
|     3 | Lalita  | F      | 150000 | Mathura  |
|     4 | Madhav  | M      | 250000 | Delhi    |
|     5 | Visakha | F      | 120000 | Mathura  |
+-------+---------+--------+--------+----------+

两个差异查询

查询1(包含FROM employee)

SELECT
(SELECT COUNT(*) FROM employee WHERE gender = 'M') * 100.0 / COUNT(*) AS MalePercentage,
(SELECT COUNT(*) FROM employee WHERE gender = 'F') * 100.0 / COUNT(*) AS FemalePercentage
FROM employee;

查询2(移除FROM employee)

SELECT
(SELECT COUNT(*) FROM employee WHERE gender = 'M') * 100.0 / COUNT(*) AS MalePercentage,
(SELECT COUNT(*) FROM employee WHERE gender = 'F') * 100.0 / COUNT(*) AS FemalePercentage;

结果差异的核心原因

两者的本质区别在于COUNT(*)的统计对象完全不同:

  • 查询1:指定FROM employee后,查询基于员工表生成结果集,这里的COUNT(*)统计的是员工表的总记录数(5条)。虽然查询会为表中每一行计算一次占比,但由于没有分组,数据库会自动去重,最终返回一行正确结果:男性占60%,女性占40%。
  • 查询2:无FROM子句属于无表查询,此时COUNT(*)统计的是当前查询自身生成的结果行数——这个查询只返回1行,所以COUNT(*)的值是1。计算出来的结果就变成了300%和200%,完全偏离预期。

总结来说,带FROM employee时除数是员工总数,不带时除数是查询返回的行数,这就是结果不同的根本原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:46:20