开发工具:
- mysql-8.0
- DataGrip
数据源:chapter8.csv
id,name,class,score E001,张通,一班,98 E002,李谷,一班,68 E003,孙凤,一班,57 E004,赵恒,二班,47 E005,王娜,二班,84 E006,李伟,二班,70 E007,刘杰,三班,50 E008,薛李,三班,92 E009,裴军,三班,35
(1)if函数
现在我们要对某个分数进行判断,如果分数大于或等于60分,则返回“及格”,否则返回“不及格”,可以通过如下代码实现:
select if(50>=60,"及格","不及格")
-- 比如,我们要对chapter8表中的每位同学的成绩进行判断,可以通过如下代码实现: select id,score,if(score >= 60,'及格','不及格') sorce_rst from demo.chapter8; select id,score,if(score >= 60,if(score >= 70 ,'优秀','良好'),'不及格') sorce_rst from demo.chapter8;
(2)case when函数
上面我们讲了多层if嵌套,就是先判断condition是否满足某个条件,如果满足,则返回一个值或进行下一个if判断;如果不满足,则返回一个值或进行下一个if判断。虽然多层嵌套的原理比较简单,但是如果层数太多,读者还是会容易写混的,基于此,就有了这一节要讲的case when函数。case when函数主要有如下两种书写形式。
形式1:
case列名 when条件1 then返回值1 when条件2 then返回值2 ...... when条件n then返回值n else返回默认值 end
现在我们有这样一个需求,对chapter8表中class列的值进行替换,如果是一班,则返回class1;如果是二班,则返回class2;如果是三班,则返回class3,否则返回其他。这个需求可以通过如下代码实现:
select id,class,(case class when '一班' then 'class1' when '二班' then 'class2' when '三班' then 'class3' else '其他' end ) class_result from demo.chapter8;
形式2:
case when列名满足条件1 then返回值1 when列名满足条件2 then返回值2 ...... when列名满足条件n then返回值n else返回默认值 end
形式1不支持对列名进行比较运算,但是形式2是支持的,比如,前面讲过的多层if嵌套就可以通过形式2来实现,具体实现代码如下:
select id,score,(case when score < 60 then '不及格' when score < 80 then '良好' else '优秀' end ) sorce_rst from demo.chapter8;
在形式2中对列名进行比较运算时,我们除了可以利用小于运算,还可以利用在比较运算章节中介绍的其他运算,比如,我们可以把上面的多层if嵌套换一种实现方式来写,具体实现代码如下:
select id ,score , (case when score between 0 and 59 then "不及格" when score between 60 and 79 then "良好" else "优秀" end)score_result from demo.chapter8