SQL中的case语句--查询实例

323 阅读6分钟

如果你需要根据其他单元格的情况有条件地将一个值添加到一个单元格中,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名称分数
1Simisola60
2伊万80
3ǞǞǞ52
4卡鲁姆98
5莱亚84
6阿帕西达82
7乌苏拉69
8拉马赞78
9科罗纳87
10爱丽舍57
11Galadriel89
12姆雷尔99
13谢丽斯55
14尼特亚81
15Elşad71
16Liisi90
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西米索拉60D
2伊万80B-
3梅托迪亚52F
4卡鲁姆98A
5莱亚84B
6阿帕西达82B-
7乌苏拉69D+
8拉马赞78C+
9科罗纳87B+
10爱丽舍57F
11Galadriel89B+
12梅里尔99A
13谢丽斯55F
14Nithya81B-
15Elşad71C-
16Liisi90A-
17约翰娜90A-
18安菲萨90A-
19良介97A
20坂井61D
21艾尔伯特63D
22卡特林51F

更复杂的案例语句例子

我们还可以根据我们的需要,使用除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 关键字来呈现降序,最高的值在最上面。

我们得到的表格看起来像下面这样:

名称等级
MerelA
卡勒姆A
良介A
LiisiA-
约翰娜A-
安菲萨A-
加拉德里尔B+
科罗娜B+
莱亚B
阿帕西达B-
尼特亚B-
伊万B-
拉马赞C+
埃尔萨德C-
乌苏拉D+
艾尔伯特D
SakchaiD
西米索拉D
AliseF
樱桃F
医学博士F
KatelynF

案例陈述示例2

让我们对这些数据做一下分析。我们可以用GROUP BYCOUNT来计算有多少学生获得了每个等级:

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 列排序会使用字母顺序,这与按成绩的数值排序不一样):

成绩学生人数
A3
A-3
B+2
B1
B-3
C+1
C-1
D+1
D3
F4

案例声明示例3

让我们对这些数据做一下不同的分析。我们可以使用GROUP BYCOUNT以及不同的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语句是一个强大的工具,当你需要根据某些条件获得数值时,你可以使用它。

在这篇文章中,你已经学会了如何使用它,并且你已经看到了一些如何使用它进行数据分析的例子。