面试常问:写sql语句对某列数据进行归类,比如给大于90分的标上优秀,80-80良等,怎么写,会给你一个具体的题目。
这时候就需要用到case when了,case when 我之前觉得很麻烦,后来拿熟悉的Java代码去对比理解,发现记忆更深更理解了。
case when的语法的重要性,可以类比java代码。写代码的人都知道,程序有3种结构。顺序结构、选择判断结构、循环结构。对于初学写代码的人会写很多if else的语句,在SQL中case when就等于于Java中的if else
int i = 1; if(i == 1){ System.out.println("1"); } else if(i == 2){ System.out.println("2"); }同样SQL中也有if,if只能做一类判断,不能多类判断。有个很简单的if语句的解释
IF( expr1 , expr2 , expr3 )
expr1 的值为 TRUE,则返回值为 expr2
示例:
mysql> select if(true,1,2); +--------------+ | if(true,1,2) | +--------------+ | 1 | +--------------+ 1 row in set (0.00 sec)expr1 的值为FALSE,则返回值为 expr3 示例
mysql> select if(true,2,1); +--------------+ | if(true,2,1) | +--------------+ | 2 | +--------------+ 1 row in set (0.00 sec)实际中这样的情形很少,所以我们很少用if语句。只有一类的刷选,case when也可以替代if
再说case when,对某列进行分类,其实也相当于行转列了。
有个实际统计例子:统计各学历的人数
随意建的一个表如下:
mysql> select * from student; +--------+------+------+--------+ | city | name | age | edu | +--------+------+------+--------+ | 深圳 | aa | 20 | 本科 | | 深圳 | bb | 20 | 硕士 | | 惠州 | cc | 20 | 博士 | | 深圳 | dd | 20 | 本科 | | 深圳 | dd | 20 | 本科 | | 广州 | aa | 20 | 本科 | | 上海 | bb | 20 | 硕士 | | 深圳 | cc | 20 | 博士 | | 北京 | dd | 20 | 本科 | +--------+------+------+--------+ 9 rows in set (0.00 sec)要求:统计每个城市、每个年龄段本科人数、硕士人数、博士人数
mysql> SELECT city ,age ,sum(CASE WHEN edu = '本科' THEN 1 ELSE 0 END) AS '本科' ,sum(CASE WHEN edu = '硕士' THEN 1 ELSE 0 END) AS '硕士' ,sum(CASE WHEN edu = '博士' THEN 1 ELSE 0 END) AS '博士' FROM student GROUP BY city,age;结果显示
+--------+------+--------+--------+--------+ | city | age | 本科 | 硕士 | 博士 | +--------+------+--------+--------+--------+ | 上海 | 20 | 0 | 1 | 0 | | 广州 | 20 | 1 | 0 | 0 | | 北京 | 20 | 1 | 0 | 0 | | 深圳 | 20 | 3 | 1 | 1 | | 惠州 | 20 | 0 | 0 | 1 | +--------+------+--------+--------+--------+ 5 rows in set (0.00 sec)case when有两种写法
格式一说明
case 列名 when 条件值1 then 选项1 when 条件值2 then 选项2 ... else 默认值 end格式二
case when 列名= 条件值1 then 选项1 when 列名=条件值2 then 选项2 ... else 默认值 end个人觉得其实没什么区别,喜欢哪种写法就用哪一种。需要留意的反而是格式,else要有默认值,不要忘记end。和Java中的if else一样,遇到满足的条件就退出去了,剩下的不执行。有个很典型的例子: 对不同年龄段的学历统计:
if(age > 24){ System.out.println("大学毕业"); } else if (age > 20){ System.out.println("高中毕业"); } else if (age > 17){ System.out.println("初中毕业"); } else if (age > 14){ System.out.println("小学毕业"); } else if (age > 8){ System.out.println("小学"); } else { System.out.println("没上小学"); }在SQL中用case when表示
SELECT CASE WHEN age > 24 then '大学毕业' WHEN age > 20 then '高中毕业' WHEN age > 17 then '初中毕业' WHEN age > 14 then '小学毕业' WHEN age > 8 then '小学' else '没上小学' end as '学历' from table显而易见,其中when条件的判断顺序是不能换的,当满足一个条件,语句就执行推出case when了。
case when 其实很简单的,之前觉得很麻烦,是没有拿熟悉的东西去对比,比如说java代码。
