Mysql查询时casewhen语句的使⽤
前⾔
前⼏天在技术论坛论坛上发现⼀个求助帖,⼤体意思就是要把⼀个表中的数据按条件分成两类,每⼀类排序⽅式不同,然后整体作为查询的结果集,乍⼀看这问题不是很难,很多⼈给出的答案是分别查询排序后再 union合并到⼀起,但是后来楼主明确指出不想使⽤ union 操作,这时有⼀位⾼⼈巧⽤ case when 语句解决了问题,其实这是我第⼀次接触 case when 语句,于是查询了⼀下具体⽤法,在此做个⼩结,⽅便⽇后查询使⽤。
创建⽰例表格
数据库表格结构很简单,马上要期末了,就以学习成绩为数据来建⽴⼀张数据表,表中包含唯⼀ID、学号、姓名、性别、分数等列,其中性别这⼀列⽤整数代表,0表⽰男,1表⽰⼥,建⽴表格的sql语句如下:
CREATE TABLE`grade` (
`id`int(4) NOT NULL AUTO_INCREMENT,
`number`int(4) NOT NULL DEFAULT'0',
`name` varbinary(32) NOT NULL DEFAULT'',
`sex`int(4) NOT NULL DEFAULT'0',
简单的mysql语句`score`int(4) NOT NULL DEFAULT'0',
PRIMARY KEY (`id`),
KEY`find_index` (`number`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=binary ROW_FORMAT=DYNAMIC;
插⼊测试数据
表格建⽴完成可以使⽤可视化⼯具或者insert语句插⼊测试数据,插⼊测试数据后查询结果如下:
mysql> select number,name,sex,score from grade;
+----------+----------+-----+-------+
| number  | name    | sex | score |
+----------+----------+-----+-------+
| 20180001 | xiaoming |  0 |    68 |
| 20180002 | xiaohong |  1 |    98 |
| 20180003 | xiaobing |  0 |    78 |
| 20180004 | xiaoli  |  0 |    88 |
| 20180005 | zhangsan |  0 |    32 |
| 20180006 | zhaosi  |  0 |    58 |
| 20180007 | marry    |  1 |    78 |
| 20180008 | tom      |  0 |  100 |
| 20180009 | feifei  |  1 |    90 |
| 20180010 | lili    |  1 |    92 |
| 20180011 | xiaozhao |  0 |    52 |
| 20180012 | xiaowang |  0 |    62 |
+----------+----------+-----+-------+
12 rows in set (0.00 sec)
获取平均成绩
班主任们坐在⼀起做喜欢做的事就是⽐⼀下⾃⼰的学⽣和别⼈班的差距,谁让他们每个⼈带的学⽣都是⼀届不如⼀届呢!(你们是我带过的学⽣中最差的⼀届)说到⽐成绩⼀般都是⽐较并均分,sql语句可能会写成下⾯这样:
mysql> select avg(score) as平均分from grade;
+-----------+
| 平均分    |
+-----------+
|  74.6667 |
+-----------+
1 row in set (0.0
2 sec)
是的,很简单就能获得班级的平均分,如果要分组呢?⽐如分别查⼀下男⽣和⼥⽣的平均分,因为我们知道表中的sex表⽰性别,所以直接按照sex分组就可以实现,可以将语句简单写成这样:
mysql> select sex as性别, avg(score) as平均分from grade group by sex;
+--------+-----------+
| 性别  | 平均分    |
+--------+-----------+
|      0 |  67.2500 |
|      1 |  89.5000 |
+--------+-----------+
2 rows in set (0.00 sec)
是不是很简单?可是性别显⽰成0和1确实不利于阅读,但是表中⼜没有保存0、1与男、⼥的对应关系,应该怎么办呢?这就要⽤到我们今天所要⽤到的case when语句了,语法上共有两种写法,看着具体例⼦体会⼀下吧。
case when 语句的使⽤
1. 第⼀种⽤法:case后⾯跟列名,when后⾯跟对应值
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END
这种⽤法正好解决我们刚刚提出的问题,当sex值为0时当前列显⽰“男”,否则显⽰“⼥”,sql写法如下:
mysql> select (case sex when0then'男'else'⼥'end) as性别, avg(score) as平均分
-> from grade group by sex;
+--------+-----------+
| 性别  | 平均分    |
+--------+-----------+
| 男    |  67.2500 |
| ⼥    |  89.5000 |
+--------+-----------+
2 rows in set (0.00 sec)
2. 第⼆种⽤法:case后⾯空⽩,when后⾯跟着判断条件
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END
针对于这种写法,我们考虑这样⼀种需求,学⽣成绩是有评分的,⼤于等于90分的学⽣是A,⼩于90分⼤于等于60分的学⽣是B,其余的学⽣是C,现在要查询评分为A、B、C的学⽣成绩的平均分分别是多少,因为成绩评分并不是单独的⼀列,所以不能简单的 使⽤ group by 来分组实现了,但是可以利⽤ case when 语句实现,写起来也很简单,看看下⾯的sql语句就知道了!
mysql> select (case when score >= 90then'A'when score < 60then'C'else'B'end) as等级,
-> avg(score) as平均分from grade group by等级;
+--------+-----------+
| 等级  | 平均分    |
+--------+-----------+
| A      |  95.0000 |
| B      |  74.8000 |
| C      |  47.3333 |
+--------+-----------+
3 rows in set (0.00 sec)
总结
1. case when 语句共有两种写法,使⽤时要区别两种⽤法的差异。
2. 使⽤ case when 语句可以实现修改数值的对应关系,还可以按照复杂的条件进⾏分组。
3. 关于 case when 语句的详细⽤法,有兴趣的同学可以参考⼀下官⽅⽂档:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。