现在有一张学生表,字段如下。请按照班级查询,并统计各班级男、女的人数和总人数。
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;
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
来终止。