【Mysql-3】条件判断函数-CASEWHEN、IF、IFNULL详解
前⾔
在众多SQL中,统计型SQL绝对是让⼈头疼的⼀类,之所以如此,是因为这种SQL中必然有⼤量的判读对⽐。⽽条件判断函数就是应对这类需求的利器。本⽂重点总结CASE WHEN、IF、IFNULL三种函数。
1 CASE WHEN
Case when语句能在SQL语句中织⼊判断逻辑,类似于Java中的if else语句。
CASE WHEN语句分为简单函数和条件表达式。
1、简单函数
CASE字段WHEN预期值THEN结果1ELSE结果2END
如果字段值等于预期值,则返回结果1,否则返回结果2。
下⾯通过⼀个简单的⽰例来看⼀下具体⽤法。
表score:
场景:在score表中,sex为1表⽰男性,sex=0表⽰⼥性,查询时转换成汉字显⽰。
SQL语句:
SELECT name,(CASE sex WHEN0THEN'⼥'ELSE'男'END) sex FROM score
结果:
2、条件表达式
CASE的简单函数使⽤简便,但⽆法应对较为复杂的场景,这就需要⽤到条件表达式了,其语法结构如下:
CASE
WHEN condition THEN result1 ELSE result2
END
解释⼀下,语句中的condition是条件判断,如果该判断结果为true,那么CASE语句将返回result,否则返回result2,如果没有ELSE,则返回null。CASE与END之间可以有多个WHEN…THEN…ELSE语句。END表⽰CASE语句结束。
场景:score ⼤于等于90为优秀,80-90为良好,60-80为及格,⼩于60为不及格,⽤SQL语句统计出每个学⽣的成绩级别。SQL:
SELECT name,score,(CASE
WHEN score>=90THEN'优秀'
WHEN score>=80THEN'良好'
WHEN score>=60THEN'及格'
ELSE'不及格'END)level
FROM score
结果:
3、综合使⽤
CASE WHEN 和 聚合函数综合使⽤,能实现更加复杂的统计功能。
先看第1个场景
在下表score(sex=1为男,sex=0为⼥)中,统计有多少个男⽣和⼥⽣以及男⼥⽣及格的各有多少个。
SQL:
SELECT
SUM(CASE WHEN sex=0THEN1ELSE0END)AS⼥⽣⼈数,
SUM(CASE WHEN sex=1THEN1ELSE0END)AS男⽣⼈数,
SUM(CASE WHEN score>=60AND sex=0THEN1ELSE0END)男⽣及格⼈数,
SUM(CASE WHEN score>=60AND sex=1THEN1ELSE0END)⼥⽣及格⼈数
FROM score;
结果:
再看第2个场景
将上⾯的score表转换为下⾯形式:
SQL:
SELECT
name,
MAX(CASE course WHEN'语⽂'THEN score ELSE0END)AS'语⽂',
max(CASE course WHEN'数学'THEN score ELSE0END)AS'数学',
max(CASE course WHEN'英语'THEN score ELSE0END)AS'英语',
AVG(score)AS'平均成绩'
FROM score GROUP BY name;
简单的mysql语句结果如下:
2 IF
IF函数也能通过判断条件来返回特定值,它的语法如下:
IF(expr,result_true,result_false)
expr是⼀个条件表达式,如果结果为true,则返回result_true,否则返回result_false。
⽤⼀个⽰例演⽰,还是表score:
使⽤IF函数:
SELECT name,IF(sex=1,'男','⼥')sex FROM students;
可以看出,在⼀些场景中,IF函数和CASE WHEN是有同样效果的,前者相对简单,后者能应对更复杂的判断。
另外,IF函数还可以和聚合函数结合,例如查询班级男⽣⼥⽣分别有多少⼈:
SELECT COUNT(IF(sex=1,1,NULL))男⽣⼈数,COUNT(IF(sex=0,1,NULL))⼥⽣⼈数FROM students
3 IFNULL
在Java程序中调⽤sql语句时,如果返回结果是null,是⾮常容易引发⼀些意外情况的。
因此,我们希望在SQL中做⼀些处理,如果查询结果是null,就转换为特定的值,这就要⽤到Mysql中IFNULL函数。⾸先SQL⼀般写法是这样的:
SELECT price FROM goods WHERE name='light';
使⽤IFNULL改写⼀下:
SELECT IFNULL(price,0) price FROM goods WHERE name='light';
但使⽤IFNULL语句,如果where条件中的name值是不存在的,那么仍将返回null,例如:
-- 返回结果:null
SELECT IFNULL(price,0) price FROM goods WHERE name='aaa';
这时候,需要改写成下⾯的形式:
-- 返回结果:0
SELECT IFNULL((SELECT price FROM goods WHERE name='aaa'),0) price;
在实际应⽤中,如果你确定where条件的值⼀定存在,使⽤前者就可以了,否则要⽤后者。
IFNULL函数也可以结合聚合使⽤,例如:
-- 返回结果:0
SELECT IFNULL(SUM(price),0)FROM goods WHERE status=3;
其他,AVG、COUNT等⽤同样⽅式处理,⽽且,⽆论where条件存在不存在,结果都是会返回0的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论