尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SQL:如何用一个SQL统计出全校男生个数、女生个数以及总人数

SQL:如何用一个SQL统计出全校男生个数、女生个数以及总人数 摘要本文介绍五种不同的SQL查询方法用于统计全校学生中男生、女生以及总人数的统计需求。每种方法都有其适用场景和优缺点读者可以根据自己的数据库环境和具体需求选择合适的方法。一、问题背景在实际的学校管理系统中经常需要统计全校学生的性别分布情况。假设我们有一个学生表students需要同时获取男生人数、女生人数以及学生总人数。二、数据表结构学生表结构如下table : students columns : studentID char(40) NOT NULL studentNAME char(40) NULL sexID char(20) NULL (1:boy; 2:girl)说明sexID字段中1表示男生2表示女生。三、统计方法对比方法一分别查询最简单直接这是最直观的方法分别执行三个查询语句-- 总人数 SELECT COUNT(1) AS allcount FROM students; -- 男生人数 SELECT COUNT(1) AS boycount FROM students WHERE sexID 1; -- 女生人数 SELECT COUNT(1) AS girlcount FROM students WHERE sexID 2;优点逻辑简单易于理解缺点需要执行三次查询效率较低方法二使用LEFT JOIN通过子查询和LEFT JOIN将三个统计结果合并到一行SELECT a.allcount, b.boycount, c.girlcount FROM (SELECT COUNT(1) AS allcount FROM students) AS a LEFT JOIN (SELECT COUNT(1) AS boycount FROM students WHERE sexID 1) b ON 11 LEFT JOIN (SELECT COUNT(1) AS girlcount FROM students WHERE sexID 2) c ON 11优点一次查询返回所有结果缺点SQL语句较复杂可读性一般方法三使用DUAL表Oracle风格通过子查询从DUAL表中获取统计结果SELECT (SELECT COUNT(1) AS allcount FROM students) AS a, (SELECT COUNT(1) AS boycount FROM students WHERE sexID 1) AS b, (SELECT COUNT(1) AS girlcount FROM students WHERE sexID 2) AS c FROM DUAL适用场景Oracle数据库或支持DUAL表的数据库注意MySQL也支持DUAL但通常可以省略方法四使用GROUP BY按性别分组统计SELECT sexID, COUNT(1) AS count FROM students GROUP BY sexID结果示例sexID | count1 | 450 (男生人数)2 | 550 (女生人数)说明这种方法只能得到男生和女生分别的人数需要额外计算总人数方法五使用CASE WHENMySQL或DECODEOracle这是最优雅的解决方案一行SQL完成所有统计-- MySQL版本 SELECT COUNT(1) AS allcount, SUM(CASE WHEN sexID 1 THEN 1 ELSE 0 END) AS boycount, SUM(CASE WHEN sexID 2 THEN 1 ELSE 0 END) AS girlcount FROM students -- Oracle版本 SELECT COUNT(1) AS allcount, SUM(DECODE(sexID, 1, 1, 0)) AS boycount, SUM(DECODE(sexID, 2, 1, 0)) AS girlcount FROM students优点1. 单次查询效率最高2. 代码简洁逻辑清晰3. 兼容性好主流数据库都支持四、方法对比与选择建议方法查询次数代码复杂度性能推荐度分别查询3次简单较低★☆☆☆☆LEFT JOIN1次中等中等★★★☆☆使用DUAL1次中等中等★★★☆☆GROUP BY1次简单高★★☆☆☆CASE WHEN/DECODE1次简单最高★★★★★五、最佳实践建议优先使用方法五CASE WHEN/DECODE这是最优雅高效的解决方案考虑数据量对于超大数据表可以添加适当的索引优化查询注意NULL值如果sexID可能存在NULL值需要在CASE WHEN中处理数据库兼容性不同数据库的语法略有差异请根据实际环境调整六、扩展思考如果需要统计更多维度的数据如各年级、各班级的性别分布可以在现有SQL基础上添加GROUP BY子句-- 按班级统计性别分布 SELECT classID, COUNT(1) AS total, SUM(CASE WHEN sexID 1 THEN 1 ELSE 0 END) AS boys, SUM(CASE WHEN sexID 2 THEN 1 ELSE 0 END) AS girls FROM students GROUP BY classID ORDER BY classID本文为技术分享转载自SQL:如何用一个sql统计出全校男生个数、女生个数以及总人数_编写sql语句,查询每个班级学生的男生人数、女生人数。-CSDN博客
返回列表