MySQL Case 表达式和 Case 语句区别
在 MySQL 中,Case 表达式和 Case 语句都是非常有用和常见的工具,它们可以帮助我们动态地转换和聚合数据。虽然这两者的名称和概念十分相似,但它们之间还是存在着一定的区别。
阅读更多:MySQL 教程
Case Expression
Case 表达式在 MySQL 中经常用来为一个文本或者数字型字段动态设定值。例如,我们有一个名为 score
的字段,它可以有不同的分值。如果我们希望将这些分值转化为等级,可以使用 Case 表达式:
SELECT score,
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
WHEN score >= 70 THEN 'C'
WHEN score >= 60 THEN 'D'
ELSE 'F'
END AS grade
FROM grade_book
在以上的例子中,我们使用 CASE
关键字后面加上分支条件来判断分值属于 A、B、C、D 还是 F,然后将对应的等级赋给另外一个字段 grade
输出。如果某个记录的 score
字段值为 85,则上述查询会返回:
score grade
-------------
85 B
Case Statement
与 Case 表达式不同,Case 语句的使用场景更为灵活。它可以用于动态生成有条件的 SQL 语句,从而避免复杂的 if 语句的使用。例如,我们有一个 students
表和一个 scores
表,它们之间通过学生编号(stu_id
)关联。现在,我们需要统计每个学生的平均分数,并找出分数超过平均分的科目。我们可以这样写:
SELECT students.name,
CASE
WHEN avg_score >= scores.score THEN scores.subject
END AS high_score_subject
FROM students
JOIN scores
ON students.stu_id = scores.stu_id
JOIN (SELECT stu_id, AVG(score) AS avg_score FROM scores GROUP BY stu_id) AS avg_scores
ON students.stu_id = avg_scores.stu_id
在以上的例子中,我们使用 JOIN
将 students
表和 scores
表关联,并使用子查询来计算每个学生的平均分数。在主查询中,我们使用 CASE
关键字来为每个学生筛选出分数超过平均分的科目。如果某个记录的学生名字为“张三”,平均分数为 90,其中英语分数为 92,数学分数为 86,则上述查询会返回:
name high_score_subject
--------------------------
张三 英语
总结
- Case 表达式常用于将一个字段的值转换为另一个值,并返回一个新的字段。
- Case 语句常用于动态生成有条件的 SQL 语句,并根据条件返回不同的结果。
- 虽然 Case 表达式和 Case 语句在语法和名称上很相似,但它们使用概念和场景存在差异,需要根据实际需要选择使用。