MySQL常用函数详解之流程函数
-
- 一、流程函数概述
-
- [1.1 流程函数的作用](#1.1 流程函数的作用)
- [1.2 流程函数分类](#1.2 流程函数分类)
- 二、条件判断函数
-
- [2.1 IF(expr, v1, v2)](#2.1 IF(expr, v1, v2))
- [2.2 CASE语句](#2.2 CASE语句)
- 三、空值处理函数
-
- [3.1 ISNULL(expr)](#3.1 ISNULL(expr))
- [3.2 COALESCE(expr1, expr2, ...)](#3.2 COALESCE(expr1, expr2, ...))
- 四、值比较与选择函数
-
- [4.1 GREATEST(expr1, expr2, ...)](#4.1 GREATEST(expr1, expr2, ...))
- [4.2 LEAST(expr1, expr2, ...)](#4.2 LEAST(expr1, expr2, ...))
- 五、实战案例
-
- [5.1 电商订单状态统计](#5.1 电商订单状态统计)
- [5.2 用户等级划分](#5.2 用户等级划分)
- [5.3 处理缺失数据](#5.3 处理缺失数据)
数据处理和业务逻辑中常常需要根据不同条件执行不同操作,或对数据进行条件判断与转换,MySQL的流程函数允许我们在SQL语句中实现类似编程中的条件判断、分支控制等逻辑,极大地增强了SQL的表达能力和灵活性。本文我将全面介绍MySQL常用流程函数的语法、功能及应用场景,并结合实战案例,帮你全面掌握这些实用工具。
一、流程函数概述
1.1 流程函数的作用
MySQL流程函数主要用于实现数据处理中的条件判断和流程控制,其核心作用包括:
- 条件判断与分支处理 :根据不同条件返回不同结果,实现类似
if-else
的逻辑。 - 数据转换与映射:将数据按照特定规则进行转换,如将数值映射为文本描述。
- 空值处理:对可能存在的空值进行统一处理,避免数据异常。
- 复杂业务逻辑实现:在SQL层面完成复杂的业务规则计算,减少应用层的处理压力。
1.2 流程函数分类
根据功能特性,MySQL流程函数可分为以下几类:
- 条件判断函数 :如
IF
、CASE
- 空值处理函数 :如
ISNULL
、COALESCE
- 值比较与选择函数 :如
GREATEST
、LEAST
二、条件判断函数
2.1 IF(expr, v1, v2)
IF
函数根据条件表达式expr
的结果进行判断:
- 若
expr
为TRUE
,返回v1
- 若
expr
为FALSE
或NULL
,返回v2
示例1 :在students
表中,根据score
字段判断学生成绩是否及格(60分为及格线)
sql
SELECT student_name, score,
IF(score >= 60, '及格', '不及格') AS pass_status
FROM students;
示例2 :统计orders
表中不同订单状态(status
字段)的订单数量,并将状态代码转换为中文描述
sql
SELECT
IF(status = 1, '待支付',
IF(status = 2, '已支付',
IF(status = 3, '已发货',
IF(status = 4, '已完成', '未知状态'))) AS status_desc,
COUNT(*) AS order_count
FROM
orders
GROUP BY
status;
2.2 CASE语句
CASE
语句提供了更强大的多条件分支判断能力,有两种语法形式:
简单CASE语句:
sql
CASE expr
WHEN v1 THEN r1
WHEN v2 THEN r2
...
ELSE r_default
END
根据expr
的值依次与v1
、v2
...比较,返回第一个匹配的r
值,若都不匹配则返回r_default
。
搜索CASE语句:
sql
CASE
WHEN cond1 THEN r1
WHEN cond2 THEN r2
...
ELSE r_default
END
根据条件表达式cond1
、cond2
...依次判断,返回第一个满足条件的r
值,若都不满足则返回r_default
。
示例1 :使用简单CASE
语句将employees
表中的department_id
转换为部门名称
sql
SELECT employee_name,
CASE department_id
WHEN 1 THEN '销售部'
WHEN 2 THEN '技术部'
WHEN 3 THEN '财务部'
ELSE '其他部门'
END AS department_name
FROM employees;
示例2 :使用搜索CASE
语句统计products
表中不同价格区间的产品数量
sql
SELECT
CASE
WHEN price < 100 THEN '价格<100'
WHEN price BETWEEN 100 AND 500 THEN '100≤价格≤500'
WHEN price > 500 THEN '价格>500'
ELSE '未知价格'
END AS price_range,
COUNT(*) AS product_count
FROM
products
GROUP BY
price_range;
三、空值处理函数
3.1 ISNULL(expr)
ISNULL
函数用于判断表达式expr
是否为NULL
:
- 若
expr
为NULL
,返回1
(TRUE
) - 若
expr
不为NULL
,返回0
(FALSE
)
示例 :在customers
表中,查找phone_number
字段为NULL
的客户
sql
SELECT customer_name
FROM customers
WHERE ISNULL(phone_number);
3.2 COALESCE(expr1, expr2, ...)
COALESCE
函数返回参数列表中第一个非NULL
的值:
sql
SELECT COALESCE(NULL, '默认值', '其他值') AS result; -- 返回'默认值'
示例 :在orders
表中,若shipping_address
字段为NULL
,则使用billing_address
字段代替
sql
SELECT order_id,
COALESCE(shipping_address, billing_address) AS address
FROM orders;
四、值比较与选择函数
4.1 GREATEST(expr1, expr2, ...)
GREATEST
函数返回参数列表中的最大值,支持数值、字符串、日期等类型:
sql
SELECT GREATEST(10, 20, 15) AS max_value; -- 返回20
SELECT GREATEST('apple', 'banana', 'cherry') AS max_string; -- 返回'cherry'
4.2 LEAST(expr1, expr2, ...)
LEAST
函数返回参数列表中的最小值:
sql
SELECT LEAST(10, 20, 15) AS min_value; -- 返回10
SELECT LEAST('apple', 'banana', 'cherry') AS min_string; -- 返回'apple'
五、实战案例
5.1 电商订单状态统计
在orders
表中,根据order_status
字段(1-待支付,2-已支付,3-已发货,4-已完成)统计各状态订单数量,并生成友好的状态描述。
sql
SELECT
CASE order_status
WHEN 1 THEN '待支付订单'
WHEN 2 THEN '已支付订单'
WHEN 3 THEN '已发货订单'
WHEN 4 THEN '已完成订单'
ELSE '异常订单'
END AS status_desc,
COUNT(*) AS order_count
FROM
orders
GROUP BY
order_status;
5.2 用户等级划分
在users
表中,根据points
字段(积分)划分用户等级:
- 积分<100:普通用户
- 100≤积分<500:银卡用户
- 500≤积分<1000:金卡用户
- 积分≥1000:钻石用户
sql
SELECT user_name, points,
CASE
WHEN points < 100 THEN '普通用户'
WHEN points < 500 THEN '银卡用户'
WHEN points < 1000 THEN '金卡用户'
ELSE '钻石用户'
END AS user_level
FROM users;
5.3 处理缺失数据
在products
表中,discount_rate
字段可能存在NULL
值,若为NULL
则视为无折扣(折扣率为0),计算每个产品的折后价格。
sql
SELECT product_name, price,
COALESCE(discount_rate, 0) AS actual_discount,
price * (1 - COALESCE(discount_rate, 0)) AS discounted_price
FROM products;
若这篇内容帮到你,动动手指支持下!关注不迷路,干货持续输出!
ヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノ