持续创作,加速成长!这是我参与「掘金日新计划 · 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;
| name | salary | details |
|---|---|---|
| xiaoming | 6500 | 高工资 |
| xiaomei | 3900 | 低工资 |
这里使用了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;
| name | salary | details | annual_sal |
|---|---|---|---|
| xiaoming | 6500 | 0.00 | 78000.00 |
| xiaomei | 3900 | 0.40 | 65520.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;
| name | commission_pct | details |
|---|---|---|
| xiaoming | NULL | 0.00 |
| xiaomei | 0.40 | 0.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;
| name | salary | details |
|---|---|---|
| xiaoming | 6500 | 高工资 |
| xiaomei | 3900 | 低工资 |
语句类似于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;
| name | salary | details |
|---|---|---|
| xiaoming | 6500 | 高工资 |
| xiaomei | 3900 | 低工资 |
可以看到上面的语句就省略了最后的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;
| name | salary | details |
|---|---|---|
| xiaoming | 6500 | 高工资 |
| xiaomei | 3900 | 低工资 |
语句类似于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;
| name | department_id | salary | details |
|---|---|---|---|
| xiaoming | 10 | 6500.00 | 7150.00 |
| xiaomei | 30 | 3900.00 | 5070.00 |
| xiaobing | 50 | 10000.00 | 14000.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);
| name | department_id | salary | details |
|---|---|---|---|
| xiaoming | 10 | 6500.00 | 7150.00 |
| xiaomei | 30 | 3900.00 | 5070.00 |
这里只查询了部门号是10,20,30的员工信息,所以CASE语句去掉了最后的ELSE的情况。
今天先学习到这里,明天继续。