SQL 中的 Case 语句 ?查询代码示例

2021-08-26 15:21:29 浏览数 (4767)

如果您需要根据其他单元格有条件地向单元格添加值,则将使用 SQL 的 case 语句。如果您了解其他语言,则 SQL 中的 case 语句类似于 if 语句或 switch 语句。它允许您有条件地指定一个值,以便根据满足的条件,在单元格中获得不同的值。这在数据分析中非常重要,因此在介绍案例陈述之后,我们将看到几个示例,说明如何使用它以简单的方式分析数据。

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在示例中使用该语句。我们有一个表格,上面列出了学生及其考试成绩。我们需要给每个学生打分,我们可以使用case语句自动完成。

ID姓名分数
1西米索拉60
2伊万80
3梅托迪亚52
4卡勒姆98
5莱娅84
6阿帕雷西达82
7乌苏拉69
8斋月78
9电晕87
10爱丽丝57
11凯兰崔尔89
12梅雷尔99
13雪莉丝55
14尼提亚81
15埃尔萨德71
16利斯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语句后,我们将把它添加到查询中。然后我们将grade使用AS关键字为列命名:

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伊万80乙-
3梅托迪亚52F
4卡勒姆98一种
5莱娅84
6阿帕雷西达82乙-
7乌苏拉69D+
8斋月78C+
9电晕87乙+
10爱丽丝57F
11凯兰崔尔89乙+
12梅雷尔99一种
13雪莉丝55F
14尼提亚81乙-
15埃尔萨德71C-
16利斯90一种-
17约翰娜90一种-
18安菲萨90一种-
19凉介97一种
20沙猜61D
21埃尔伯特63D
22凯特琳51F

更复杂的 Case 语句示例

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

我们得到的表格如下所示:

姓名年级
梅雷尔一种
卡勒姆一种
凉介一种
利斯一种-
约翰娜一种-
安菲萨一种-
凯兰崔尔乙+
电晕乙+
莱娅
阿帕雷西达乙-
尼提亚乙-
伊万乙-
斋月C+
埃尔萨德C-
乌苏拉D+
埃尔伯特D
沙猜D
西米索拉D
爱丽丝F
雪莉丝F
梅托迪亚F
凯特琳F

Case 语句示例 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从高到低的顺序对等级进行排序,我们使用score它是一个数值(因为按grade列排序将使用字母顺序,这与按等级的值排序不同)。

年级NUMBER_OF_STUDENTS
一种3
一种-3
乙+2
1
乙-3
C+1
C-1
D+1
D3
F4

案例陈述示例 3

让我们对这些数据做一些不同的分析。我们可以使用GROUP BYandCOUNT和一个不同的 case 语句来计算有多少学生通过了考试。然后我们可以使用ORDER BY我们喜欢的顺序排列列,通过顶部的学生人数。

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 名学生可能需要一些帮助。

结果NUMBER_OF_STUDENTS
通过18
失败的4

结论

case 语句是一个强大的工具,当您需要根据特定条件获取值时,您可以使用它。

在本文中,您已经学习了如何使用它,并且您已经看到了一些关于如何将其用于数据分析的示例。