MySQL学习-函数(九)

176 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

前言

上篇我们又学习了一部分MySQL中的函数。有兴趣的小伙伴可以阅读(# MySQL学习-函数(八))。
下面继续学习MySQL中的函数。

流程控制函数

定义

流程处理函数可以根据不同的条件,执行不同的处理流程,可以在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 常量值2 THEN 值2 ... [ELSE 值n] END相当于java的switch...case...

IF(value,value1,value2)

示例一

SELECT name, salary, IF(salary >= 6000, '高工资', '低工资') "details"
FROM employees;
namesalarydetails
xiaoming6500高工资
xiaomei3900低工资

这里使用了IF语句,薪资大于等于的6000的属于高工资,低于的属于低工资,可以看到查询的结果也是经过计算的。这里使用了表达式">=",表达式的值为true,也就是高工资,值是false的话,就是低工资。

示例二

使用IF可以解决之前遇到的数据库字段为NULL时不能计算的问题。

SELECT name, salary, IF(commission_pct IS NOT NULL, commission_pct, 0) "details"
salary * 12 * (1 + IF(commission_pct IS NOT NULL, commission_pct, 0)) "annual_sal"
FROM employees;
namesalarydetailsannual_sal
xiaoming65000.0078000.00
xiaomei39000.4065520.00

上面的SQL语句,如果碰到commission_pct是NULL的情况,就会用0来替换,进而可以进行计算得出结果。

IFNULL(value1,value2)

IFNULL(value1,value2):可以看做是IF(value,value1,value2)的特殊情况。即这里value中字段是和value1相同的。

示例三

SELECT name, commission_pct, IFNULL(commission_pct, 0) "details"
FROM employees;
namecommission_pctdetails
xiaomingNULL0.00
xiaomei0.400.40

这里的IFNULL(commission_pct, 0)相当于是IF(commission_pct IS NOT NULL, commission_pct, 0),可以看到value中的字段commission_pct与value1的commission_pct是相同的字段。

CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 ...[ELSE resultn] END

示例四

SELECT name, salary, CASE WHEN salary >= 6000 THEN '高工资'
                          ELSE '低工资' END "details"
FROM employees;
namesalarydetails
xiaoming6500高工资
xiaomei3900低工资

语句类似于java的IF ELSE。只不过这里SQL中需要使用END结尾。而且函数语句之间没有标点符号。
这里也可以和java的IF ELSE一样,省略最后的ELSE。

示例五

SELECT name, salary, CASE WHEN salary >= 6000 THEN '高工资'
                          WHEN salary < 6000 THEN  '低工资' END "details"
FROM employees;
namesalarydetails
xiaoming6500高工资
xiaomei3900低工资

可以看到上面的语句就省略了最后的ELSE。

CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值2 THEN 值2 ... [ELSE 值n] END

示例六

SELECT name, salary, CASE salary WHEN 6500 THEN '高工资'
                          ELSE '低工资' END "details"
FROM employees;
namesalarydetails
xiaoming6500高工资
xiaomei3900低工资

语句类似于java的SWITCH CASE。而且函数语句之间没有标点符号。

练习一

查询所有的员工信息,若部门号为10,则打印其工资的1.1倍,若部门号为20,则打印其工资的1.2倍,若部门号为30,则打印其工资的1.3倍,其他部门的,则打印其工资的1.4倍。

SELECT name, department_id, salary, CASE department_id WHEN 10 THEN salary * 1.1
                                                       WHEN 20 THEN salary * 1.2
                                                       WHEN 30 THEN salary * 1.3
                                                       ELSE salary * 1.4 END "details"
FROM employees;
namedepartment_idsalarydetails
xiaoming106500.007150.00
xiaomei303900.005070.00
xiaobing5010000.0014000.00

可以看到结果根据条件做了对应计算。

练习一

查询部门号为10,20,30的员工信息,若部门号为10,则打印其工资的1.1倍,若部门号为20,则打印其工资的1.2倍,若部门号为30,则打印其工资的1.3倍,其他部门的,则打印其工资的1.4倍。

SELECT name, department_id, salary, CASE department_id WHEN 10 THEN salary * 1.1
                                                       WHEN 20 THEN salary * 1.2
                                                       WHEN 30 THEN salary * 1.3
                                                       END "details"
FROM employees
WHERE department_id IN (10,20,30);
namedepartment_idsalarydetails
xiaoming106500.007150.00
xiaomei303900.005070.00

这里只查询了部门号是10,20,30的员工信息,所以CASE语句去掉了最后的ELSE的情况。

今天先学习到这里,明天继续。