跳到主要内容

MySQL CASE表达式

在MySQL中,CASE表达式是一种强大的工具,用于在查询中进行条件判断和数据转换。它类似于编程语言中的if-else语句,允许你根据不同的条件返回不同的值。CASE表达式可以用于SELECTUPDATEDELETE等语句中,帮助你更灵活地处理数据。

基本语法

CASE表达式有两种形式:简单CASE表达式和搜索CASE表达式。

简单CASE表达式

简单CASE表达式的语法如下:

sql
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE resultN
END
  • expression:要评估的表达式或列。
  • WHEN value THEN result:当expression等于value时,返回result
  • ELSE resultN:如果没有任何WHEN条件匹配,则返回resultN

搜索CASE表达式

搜索CASE表达式的语法如下:

sql
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE resultN
END
  • WHEN condition THEN result:当condition为真时,返回result
  • ELSE resultN:如果没有任何WHEN条件为真,则返回resultN

代码示例

示例1:简单CASE表达式

假设我们有一个students表,其中包含学生的成绩。我们想根据成绩给学生打分:

sql
SELECT 
name,
score,
CASE score
WHEN 90 THEN 'A'
WHEN 80 THEN 'B'
WHEN 70 THEN 'C'
ELSE 'D'
END AS grade
FROM students;

输入:

namescore
Alice95
Bob85
Carol75
Dave65

输出:

namescoregrade
Alice95D
Bob85B
Carol75C
Dave65D
备注

注意:在这个例子中,score为95的Alice没有得到'A',因为CASE表达式只匹配精确的值。如果你需要范围匹配,应该使用搜索CASE表达式。

示例2:搜索CASE表达式

现在,我们使用搜索CASE表达式来实现范围匹配:

sql
SELECT 
name,
score,
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
WHEN score >= 70 THEN 'C'
ELSE 'D'
END AS grade
FROM students;

输入:

namescore
Alice95
Bob85
Carol75
Dave65

输出:

namescoregrade
Alice95A
Bob85B
Carol75C
Dave65D
提示

提示:搜索CASE表达式更加灵活,可以处理复杂的条件判断。

实际应用场景

场景1:数据分类

假设你有一个orders表,其中包含订单金额。你想根据订单金额将订单分类为“小订单”、“中订单”和“大订单”:

sql
SELECT 
order_id,
amount,
CASE
WHEN amount < 100 THEN '小订单'
WHEN amount BETWEEN 100 AND 500 THEN '中订单'
ELSE '大订单'
END AS order_type
FROM orders;

场景2:动态列值

假设你有一个employees表,其中包含员工的工资和奖金。你想计算每个员工的总收入,并根据总收入给员工评级:

sql
SELECT 
employee_id,
salary,
bonus,
salary + bonus AS total_income,
CASE
WHEN salary + bonus > 100000 THEN '高收入'
WHEN salary + bonus BETWEEN 50000 AND 100000 THEN '中等收入'
ELSE '低收入'
END AS income_level
FROM employees;

总结

CASE表达式是MySQL中非常有用的工具,可以帮助你在查询中进行条件判断和数据转换。通过简单CASE表达式和搜索CASE表达式,你可以根据不同的条件返回不同的值,从而实现更灵活的数据处理。

警告

注意:在使用CASE表达式时,确保条件的顺序正确,因为MySQL会按顺序评估条件,一旦找到匹配的条件,就会返回相应的结果。

附加资源与练习

  • 练习1:在students表中,添加一列attendance(出勤率),并使用CASE表达式将出勤率分为“优秀”、“良好”、“及格”和“不及格”。
  • 练习2:在orders表中,添加一列order_date,并使用CASE表达式将订单分为“新订单”(最近30天内)和“旧订单”(超过30天)。

通过练习,你可以更好地掌握CASE表达式的使用,并在实际项目中灵活应用。