计算员工性别占比的两条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
相关产品推荐
相关产品推荐

