MySQL面试–按照班级查询,并统计各班级男、女的人数和总人数
场景
现在有一张学生表,字段如下。请按照班级查询,并统计各班级男、女的人数和总人数。
CREATETABLE`Student`(`ID`intNOTNULL,`NAME`varchar(255)DEFAULTNULLCOMMENT'姓名',`SEX`varchar(255)DEFAULTNULLCOMMENT'性别',`CLASS`varchar(255)DEFAULTNULLCOMMENT'班级',PRIMARYKEY(`ID`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb3;
INSERTINTO`test`.`Student`(`ID`,`NAME`,`SEX`,`CLASS`)VALUES(1,'Jack','男','1');INSERTINTO`test`.`Student`(`ID`,`NAME`,`SEX`,`CLASS`)VALUES(2,'Tom','男','2');INSERTINTO`test`.`Student`(`ID`,`NAME`,`SEX`,`CLASS`)VALUES(3,'Lily','女','1');INSERTINTO`test`.`Student`(`ID`,`NAME`,`SEX`,`CLASS`)VALUES(4,'Rose','女','2');
解决
-- 按照班级统计男、女的人数SELECT
t1.CLASS,COUNT( ID )AS 班级人数,SUM(CASEWHEN t1.sex ='男'THEN1ELSE0END)AS male,SUM(CASEWHEN t1.SEX ='女'THEN1ELSE0END)AS female
FROM
Student t1
GROUPBY t1.CLASS;
重点分析
Group by
SQL GROUP BY 子句用来根据指定的字段对结果集(选取的数据)进行分组,如果某些记录的指定字段具有相同的值,那么它们将被合并为一条数据。
通俗地理解,GROUP BY 子句将根据指定的字段合并数据行。
借助 SQL 聚合函数,您可以对分组的数据进行再次加工,例如:
SUM( )
函数可以对指定字段的值进行求和;COUNT( )
函数可以计算某个分组内数据的条数;AVG( )
函数可以对指定字段的值求平均数。
流程控制语句
完整的流程控制语句的讲解:MySQL流程控制语句详解 (biancheng.net)。下面之会涉及到
CASE
。
SUM(CASEWHEN
t1.sex ='男'THEN1ELSE0END)AS male
CASE
语句也是用来进行条件判断的,它提供了多个条件进行选择,可以实现比
IF
语句更复杂的条件判断。
CASE
语句的基本形式如下:
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list]...[ELSE statement_list]ENDCASE其中:
case_value
参数表示条件判断的变量,决定了哪一个WHEN
子句会被执行;when_value
参数表示变量的取值,如果某个when_value
表达式与case_value
变量的值相同,则执行对应的THEN
关键字后的statement_list
中的语句;statement_list
参数表示when_value
值没有与case_value
相同值时的执行语句。CASE
语句都要使用END CASE
结束。
CASE
语句还有另一种形式。该形式的语法如下:
CASEWHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list]...[ELSE statement_list]ENDCASE
其中,
search_condition
参数表示条件判断语句;
statement_list
参数表示不同条件的执行语句。
与上述语句不同的是,该语句中的
WHEN
语句将被逐个执行,直到某个
search_condition
表达式为真,则执行对应
THEN
关键字后面的
statement_list
语句。如果没有条件匹配,
ELSE
子句里的语句被执行。
注意⚠️:这里介绍的
CASE
语句与“控制流程函数”里描述的 SQL CASE 表达式的 CASE 语句有轻微的不同。这里的 CASE 语句不能有
ELSE NULL
语句,并且用
END CASE
替代
END
来终止。
版权归原作者 丁川 所有, 如有侵权,请联系我们删除。