Mysql8 SQL流程控制函数
流程处理函数可以根据不同的条件,执行不同的处理流程,可以在SQL语句中实现不同的条件选择。
MySQL中的流程处理函数主要包括IF()、IFNULL()和CASE()函数。
函数 | 用法 |
---|---|
IF(value,value1,value2) | 如果value的值为TRUE,返回value1,否则返回value2 |
IFNULL(value1, value2) | 如果value1不为NULL,返回value1,否则返回value2 |
CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2.... [ELSE resultn] END | 相当于Java的if...else if...else... |
CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值1 THEN 值1 .... [ELSE 值n] END | 相当于Java的switch...case... |
IF
SELECT IF(1 > 0,'正确','错误')
->正确
IFNULL
SELECT IFNULL(null,'Hello Word')
->Hello Word
CASE WHEN
SELECT CASE
WHEN 1 > 0
THEN '1 > 0'
WHEN 2 > 0
THEN '2 > 0'
ELSE '3 > 0'
END
->1 > 0
流程控制
/* IF单条件使用 /
/**如果大于等于8000算高工资,否则算低工资*/
select last_name ,salary ,if(salary >= 8000 ,'高工资' ,'低工资')
from employees;
IF多条件使用
/**如果 commission_pct不等于null,那就取它本身的值,如果等于null,则给它默认为0*/
select last_name ,commission_pct ,if(commission_pct is not null ,commission_pct ,0) 'details',
/**并且计算它一年赚了多少钱*/
salary * 12 * ( 1 +if(commission_pct is not null ,phone_number ,0)) 'annual_sal'
from employees
IFNULL使用
/** 判断commission_pct为null 则输出0*/
select last_name ,commission_pct ,ifnull(commission_pct,0) 'details'
from employees
CASE WHEN 使用
基本语法
CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2.... [ELSE resultn] END
相当于Java的if...else if...else...
示例SQL1
SELECT last_name ,salary ,
/** 判断salary >= 15000 = 高薪 salary >=10000 ='种薪 salary >=8000 ='底薪' 否则等于 贫困户 END:代表结束 */
CASE WHEN salary >=15000 THEN '高薪'
WHEN salary >=10000 THEN '中新'
WHEN salary >=8000 THEN '底薪'
ELSE '贫困户' END 'Salary'
from employees ;
示例SQL2
需求:
/**
查询部门号为 10,20, 30 的员工信息, 若部门号为 10, 则打印其工资的 1.1 倍, 20 号部门, 则打印其
工资的 1.2 倍, 30 号部门打印其工资的 1.3 倍数。
*/
select employee_id ,last_name ,department_id ,salary,
CASE department_id WHEN 10 THEN salary * 1.1
WHEN 20 THEN salary * 1.2
WHEN 20 THEN salary * 1.3
ELSE salary * 1.4
END "details" /**details是别名*/
from employees
where department_id in(10 ,20 ,30) ;
示例SQL3
/**
查询部门号为 10,20, 30 的员工信息, 若部门号为 10, 则打印其工资的 1.1 倍, 20 号部门, 则打印其
工资的 1.2 倍, 30 号部门打印其工资的 1.3 倍数。
*/
select employee_id ,last_name ,department_id ,salary,
CASE department_id WHEN 10 THEN salary * 1.1
WHEN 20 THEN salary * 1.2
WHEN 20 THEN salary * 1.3
ELSE salary * 1.4
END "details" /**details是别名*/
from employees
where department_id in(10 ,20 ,30) ;
示例SQL4
SELECT oid,
`status`,
CASE `status`
WHEN 1 THEN '未付款'
WHEN 2 THEN '已付款'
WHEN 3 THEN '已发货'
WHEN 4 THEN '确认收货'
ELSE '无效订单' END
FROM t_order;
示例SQL5
多个Count统计,统计未发货,已发货和已结完的订单
SELECT count(CASE WHEN state = 0 THEN 'noCount' END) AS noCount, /** 未发货*/
count(CASE WHEN state = 1 THEN 'yesCount' END) AS yesCount, /**已发货*/
count(CASE WHEN state = 2 THEN 'finishCount' END) AS finishCount /**已完结*/
FROM `order` ;
from LOAN.LOAN_CASE_CENTRE loan_case_centre
输出
+-------+--------+-----------+
|noCount|yesCount|finishCount|
+-------+--------+-----------+
|2 |4 |1 |
+-------+--------+-----------+