GROUP BY可以按照某一列的不同值进行分组,然后将不同组的数据可以利用聚合函数进行汇总取值。
--我们可以在老师表里面求解不同班级的老师分别有多少名
SELECT class_id,COUNT(teacher_id)
FROM teacher
GROUP BY class_id;
--我们可以在老师表里面求解每个班级里面最小的年龄和最大的年龄
SELECT class_id,MAX(age),MIN(age)
FROM teacher
GROUP BY class_id;
--我们可以在老师表里面求解每个班级老师们的工资总和
SELECT class_id,SUM(salary)
FROM teacher
GROUP BY class_id;
现在我们考虑一个新的问题,我们想要求解每个班级男老师的人数,正常来讲我们分组利用已有的函数只能汇总全部数据,想要进行部分汇总可以借助于IF函数:IF(condition, value_if_true, value_if_false),这里用下面的例子解释为:如果性别是男,则该行数据返回1,否则,返回0,利用SUM进行汇总就得到了男性的总数量,也就是整体的部分数量。
--我们可以在老师表里面求解每个班级男老师的数目
SELECT class_id,SUM(IF(sex='男',1,0))
FROM teacher
GROUP BY class_id;
Tips1
除了IF函数以外,我们还可以搭配CASE...WEHN...来实现,下面是其两种表达方式:
--第一种表达方式
CASE <单值表达式>
WHEN <表达式值> THEN <SQL语句或返回值>
WHEN <表达式值> THEN <SQL语句或返回值>
...
WHEN <表达式值> THEN <SQL语句或返回值>
ELSE <SQL语句或返回值>
END
--第二种表达方式
CASE
WHEN <判断表达式> THEN <SQL语句或返回值>
WHEN <判断表达式> THEN <SQL语句或返回值>
...
WHEN <判断表达式> THEN <SQL语句或返回值>
ELSE <SQL语句或返回值>
END
--我们来用这种方式替换前面的IF函数
SELECT class_id,SUM(CASE sex WHEN '男' THEN 1 ELSE 0 END)
FROM teacher
GROUP BY class_id;
SELECT class_id,SUM(CASE WHEN sex = '男' THEN 1 ELSE 0 END)
FROM teacher
GROUP BY class_id;
Tips2
上面我们都是采用的SUM来计算,那么这里我们区分一下为什么不用COUNT来计算:COUNT是对结果集的数目进行汇总,SUM是对结果集中的数值进行加和,即使COUNT搭配CASE或者IF函数,结果也是不正确的,因为COUNT计数的是行数,无论里面的数值为0或者1,都会计入,所以这里不能用COUNT,而数值为0或1会影响SUM加和的结果。
标签:GROUP,--,SUM,WHEN,id,使用,部分,class From: https://www.cnblogs.com/YaoMa/p/17041368.html