如果你需要根据其他单元格的情况有条件地将一个值添加到一个单元格中,SQL的case语句就是你要使用的。
如果你了解其他语言,SQL中的case语句类似于if语句或switch语句。它允许你有条件地指定一个值,这样,根据条件的满足情况,你可以在单元格中得到一个不同的值。
这在数据分析中非常重要,所以在介绍完case语句后,我们将看到几个例子,说明如何使用它以简单的方式分析数据。
SQL Case 语句的语法
语法中有很多内容,但还是比较直观的:关键字CASE ,表示一个case语句的开始,关键字END ,表示其结束。
然后,对于一个单一的条件,你可以写关键词WHEN ,后面是必须满足的条件。之后是关键词THEN 和该条件的值,如WHEN <condition> THEN <stuff> 。
然后可以在后面加上其他WHEN/THEN 语句。
在结尾处,你可以添加一个值,在条件都不成立的情况下,用关键字ELSE ,作为默认使用,如下图所示:
CASE
WHEN condition1 THEN stuff
WHEN condition2 THEN other stuff
...
ELSE default stuff
END
让我们来实践一下,以便更好地理解它。
SQL案例语句示例
让我们在一个例子中使用CASE 语句。我们有一个表,上面有一个学生名单和他们在考试中的分数。我们需要给每个学生一个分数,我们可以使用case语句来自动完成。
| id | 名称 | 分数 |
|---|---|---|
| 1 | Simisola | 60 |
| 2 | 伊万 | 80 |
| 3 | ǞǞǞ | 52 |
| 4 | 卡鲁姆 | 98 |
| 5 | 莱亚 | 84 |
| 6 | 阿帕西达 | 82 |
| 7 | 乌苏拉 | 69 |
| 8 | 拉马赞 | 78 |
| 9 | 科罗纳 | 87 |
| 10 | 爱丽舍 | 57 |
| 11 | Galadriel | 89 |
| 12 | 姆雷尔 | 99 |
| 13 | 谢丽斯 | 55 |
| 14 | 尼特亚 | 81 |
| 15 | Elşad | 71 |
| 16 | Liisi | 90 |
| 17 | 约翰娜 | 90 |
| 18 | 安菲萨 | 90 |
| 19 | 良介 | 97 |
| 20 | 坂井 | 61 |
| 21 | 艾尔伯特 | 63 |
| 22 | 卡特林 | 51 |
我们可以使用CASE 语句来给每个学生打分,我们将把这个分数添加到一个名为grade 的新列中。
让我们先写一下CASE 语句,在该语句中我们将写出每个年级的分类。当score 为94或更高时,该行的值为A 。如果分数反而为90或更高,它的值为A- ,以此类推:
CASE
WHEN score >= 94 THEN "A"
WHEN score >= 90 THEN "A-"
WHEN score >= 87 THEN "B+"
WHEN score >= 83 THEN "B"
WHEN score >= 80 THEN "B-"
WHEN score >= 77 THEN "C+"
WHEN score >= 73 THEN "C"
WHEN score >= 70 THEN "C-"
WHEN score >= 67 THEN "D+"
WHEN score >= 60 THEN "D"
ELSE "F"
END
在我们写完CASE 语句后,我们将把它添加到一个查询中。然后,我们将使用AS 关键字给该列命名为grade :
SELECT *,
CASE
WHEN score >= 94 THEN "A"
WHEN score >= 90 THEN "A-"
WHEN score >= 87 THEN "B+"
WHEN score >= 83 THEN "B"
WHEN score >= 80 THEN "B-"
WHEN score >= 77 THEN "C+"
WHEN score >= 73 THEN "C"
WHEN score >= 70 THEN "C-"
WHEN score >= 67 THEN "D+"
WHEN score >= 60 THEN "D"
ELSE "F"
END AS grade
FROM students_grades;
我们从这个查询中得到的表格看起来就像下面这样--现在每个学生都有一个基于他们分数的等级:
| id | 名称 | 分数 | 分数 |
|---|---|---|---|
| 1 | 西米索拉 | 60 | D |
| 2 | 伊万 | 80 | B- |
| 3 | 梅托迪亚 | 52 | F |
| 4 | 卡鲁姆 | 98 | A |
| 5 | 莱亚 | 84 | B |
| 6 | 阿帕西达 | 82 | B- |
| 7 | 乌苏拉 | 69 | D+ |
| 8 | 拉马赞 | 78 | C+ |
| 9 | 科罗纳 | 87 | B+ |
| 10 | 爱丽舍 | 57 | F |
| 11 | Galadriel | 89 | B+ |
| 12 | 梅里尔 | 99 | A |
| 13 | 谢丽斯 | 55 | F |
| 14 | Nithya | 81 | B- |
| 15 | Elşad | 71 | C- |
| 16 | Liisi | 90 | A- |
| 17 | 约翰娜 | 90 | A- |
| 18 | 安菲萨 | 90 | A- |
| 19 | 良介 | 97 | A |
| 20 | 坂井 | 61 | D |
| 21 | 艾尔伯特 | 63 | D |
| 22 | 卡特林 | 51 | F |
更复杂的案例语句例子
我们还可以根据我们的需要,使用除case语句外的其他语句,以不同的方式对表格进行操作。
案例语句示例1
例如,我们可以用 ORDER BY来对行进行排序,让最高的成绩在上面:
SELECT name,
CASE
WHEN score >= 94 THEN "A"
WHEN score >= 90 THEN "A-"
WHEN score >= 87 THEN "B+"
WHEN score >= 83 THEN "B"
WHEN score >= 80 THEN "B-"
WHEN score >= 77 THEN "C+"
WHEN score >= 73 THEN "C"
WHEN score >= 70 THEN "C-"
WHEN score >= 67 THEN "D+"
WHEN score >= 60 THEN "D"
ELSE "F"
END AS grade
FROM students_grades
ORDER BY score DESC;
我们根据score ,这是一个数字,而不是grade 列来排序,因为按字母顺序排列的成绩与根据其数值排列的成绩不一样。我们使用DESC 关键字来呈现降序,最高的值在最上面。
我们得到的表格看起来像下面这样:
| 名称 | 等级 |
|---|---|
| Merel | A |
| 卡勒姆 | A |
| 良介 | A |
| Liisi | A- |
| 约翰娜 | A- |
| 安菲萨 | A- |
| 加拉德里尔 | B+ |
| 科罗娜 | B+ |
| 莱亚 | B |
| 阿帕西达 | B- |
| 尼特亚 | B- |
| 伊万 | B- |
| 拉马赞 | C+ |
| 埃尔萨德 | C- |
| 乌苏拉 | D+ |
| 艾尔伯特 | D |
| Sakchai | D |
| 西米索拉 | D |
| Alise | F |
| 樱桃 | F |
| 医学博士 | F |
| Katelyn | F |
案例陈述示例2
让我们对这些数据做一下分析。我们可以用GROUP BY 和COUNT来计算有多少学生获得了每个等级:
SELECT
CASE
WHEN score >= 94
THEN "A"
WHEN score >= 90 THEN "A-"
WHEN score >= 87 THEN "B+"
WHEN score >= 83 THEN "B"
WHEN score >= 80 THEN "B-"
WHEN score >= 77 THEN "C+"
WHEN score >= 73 THEN "C"
WHEN score >= 70 THEN "C-"
WHEN score >= 67 THEN "D+"
WHEN score >= 60 THEN "D"
ELSE "F"
END AS grade,
COUNT(*) AS number_of_students
FROM students_grades
GROUP BY grade
ORDER BY score DESC;
我们用 [ORDER BY](https://www.freecodecamp.org/news/sql-order-by-statement-example-sytax/)将成绩从高到低排序,我们使用score ,因为它是一个数值(因为按grade 列排序会使用字母顺序,这与按成绩的数值排序不一样):
| 成绩 | 学生人数 |
|---|---|
| A | 3 |
| A- | 3 |
| B+ | 2 |
| B | 1 |
| B- | 3 |
| C+ | 1 |
| C- | 1 |
| D+ | 1 |
| D | 3 |
| F | 4 |
案例声明示例3
让我们对这些数据做一下不同的分析。我们可以使用GROUP BY 和COUNT以及不同的case语句来计算有多少学生通过了考试。然后我们可以用 [ORDER BY](https://www.freecodecamp.org/news/sql-order-by-statement-example-sytax/)来让这一列按照我们喜欢的顺序排列,将通过考试的学生人数放在上面:
SELECT
CASE
WHEN score >= 60
THEN "passed"
ELSE "failed"
END AS result,
COUNT(*) AS number_of_students
FROM students_grades
GROUP BY result
ORDER BY result DESC;
我们得到的表格看起来像下面这样。这个班级的成绩并不差,22个学生中有18个成绩合格--但另外4个学生可能需要一些帮助:
| 结果 | 学生人数 |
|---|---|
| 通过 | 18 |
| 不及格 | 4 |
总结
case语句是一个强大的工具,当你需要根据某些条件获得数值时,你可以使用它。
在这篇文章中,你已经学会了如何使用它,并且你已经看到了一些如何使用它进行数据分析的例子。