MySQL面试–按照班级查询,并统计各班级男、女的人数和总人数

场景

现在有一张学生表,字段如下。请按照班级查询,并统计各班级男、女的人数和总人数。

image-20220718122739177

CREATE TABLE `Student` (
  `ID` int NOT NULL,
  `NAME` varchar(255) DEFAULT NULL COMMENT '姓名',
  `SEX` varchar(255) DEFAULT NULL COMMENT '性别',
  `CLASS` varchar(255) DEFAULT NULL COMMENT '班级',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
INSERT INTO `test`.`Student` (`ID`, `NAME`, `SEX`, `CLASS`) VALUES (1, 'Jack', '男', '1');
INSERT INTO `test`.`Student` (`ID`, `NAME`, `SEX`, `CLASS`) VALUES (2, 'Tom', '男', '2');
INSERT INTO `test`.`Student` (`ID`, `NAME`, `SEX`, `CLASS`) VALUES (3, 'Lily', '女', '1');
INSERT INTO `test`.`Student` (`ID`, `NAME`, `SEX`, `CLASS`) VALUES (4, 'Rose', '女', '2');

解决

-- 按照班级统计男、女的人数
SELECT
	t1.CLASS,
	COUNT( ID ) AS 班级人数,
	SUM( CASE WHEN t1.sex = '男' THEN 1 ELSE 0 END ) AS male,
	SUM( CASE WHEN t1.SEX = '女' THEN 1 ELSE 0 END ) AS female 
FROM
	Student t1 
GROUP BY t1.CLASS;

image-20220718140151937

重点分析

Group by

SQL GROUP BY 子句用来根据指定的字段对结果集(选取的数据)进行分组,如果某些记录的指定字段具有相同的值,那么它们将被合并为一条数据。

通俗地理解,GROUP BY 子句将根据指定的字段合并数据行。

借助 SQL 聚合函数,您可以对分组的数据进行再次加工,例如:

  • SUM( ) 函数可以对指定字段的值进行求和
  • COUNT( ) 函数可以计算某个分组内数据的条数
  • AVG( ) 函数可以对指定字段的值求平均数

流程控制语句

完整的流程控制语句的讲解:MySQL流程控制语句详解 (biancheng.net)。下面之会涉及到CASE

SUM(CASE WHEN 
							t1.sex = '男' 
						THEN 
							1 
						ELSE 
						0 END )
AS male

CASE 语句也是用来进行条件判断的,它提供了多个条件进行选择,可以实现比 IF 语句更复杂的条件判断。

CASE 语句的基本形式如下:

CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list]...
    [ELSE statement_list]
END CASE其中:
  • case_value 参数表示条件判断的变量,决定了哪一个 WHEN 子句会被执行;
  • when_value 参数表示变量的取值,如果某个 when_value 表达式与 case_value 变量的值相同,则执行对应的 THEN 关键字后的 statement_list 中的语句;
  • statement_list 参数表示 when_value 值没有与 case_value 相同值时的执行语句。
  • CASE 语句都要使用 END CASE 结束。

CASE 语句还有另一种形式。该形式的语法如下:

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE

其中,search_condition 参数表示条件判断语句;statement_list 参数表示不同条件的执行语句。

与上述语句不同的是,该语句中的 WHEN 语句将被逐个执行,直到某个 search_condition 表达式为真,则执行对应 THEN 关键字后面的 statement_list 语句。如果没有条件匹配,ELSE 子句里的语句被执行。

注意⚠️:这里介绍的 CASE 语句与“控制流程函数”里描述的 SQL CASE 表达式的 CASE 语句有轻微的不同。这里的 CASE 语句不能有 ELSE NULL 语句,并且用 END CASE 替代 END 来终止。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐