SQL-案例


SQL CASE 语句

SQL CASE语句是一种条件语句,可以帮助我们根据一组条件做出决策。它评估一组条件并在满足条件时返回相应的值。

CASE 语句的工作方式类似于简化的 IF-THEN-ELSE 语句,并允许测试多个条件。

这以关键字 CASE 开头,后跟多个条件语句。每个条件语句至少由一对 WHEN 和 THEN 语句组成。其中 WHEN 指定条件语句,THEN 指定要采取的操作。

它通常用于根据现有列的值创建具有值的新列。

让我们看一个简单的场景来理解这句话。

例如,当客户的信用额度高于“10,000”时,则该客户将被认定为“高价值客户”;当信用额度高于“5000”时,客户将被认定为“中值客户”;否则客户将被视为“低价值客户”,如下表所示 -

案件

句法

以下是 SQL CASE 语句的语法 -

CASE
   WHEN condition1 THEN statement1,
   WHEN condition2 THEN statement2,
   WHEN condition THEN statementN
   ELSE result
END;

其中,条件1、条件2等是条件语句,语句1、语句2等是条件为真时要采取的操作。

一旦满足条件,CASE语句将停止进一步验证并返回结果。

  • 如果没有满足任何条件 (TRUE),则返回ELSE子句中提到的值。

  • 如果未提及 ELSE 部分并且没有一个条件为 TRUE,则返回 NULL。

例子

假设我们创建了一个名为CUSTOMERS的表,其中包含客户的个人详细信息,包括他们的姓名、年龄、地址和工资等。使用以下查询 -

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),       
   PRIMARY KEY (ID)
); 

现在,使用 INSERT 语句将值插入到该表中,如下所示 -

INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

该表将创建如下 -

ID 姓名 年龄 地址 薪水
1 拉梅什 32 艾哈迈达巴德 2000.00
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00
4 柴塔利 25 孟买 6500.00
5 哈迪克 27 博帕尔 8500.00
6 科马尔 22 海得拉巴 4500.00
7 莫菲 24 印多尔 10000.00

在下面的查询中,我们在 CASE 语句中使用多个 WHEN 和 THEN 条件以及 ELSE 子句。

如果客户的 AGE 大于 30 岁,则返回 Gen X,否则转至进一步的 WHEN 和 THEN 条件。如果没有任何条件与 CUSTOMERS 表匹配,CASE 将返回查询的 ELSE 部分中提到的“Gen Alpha”值 -

SELECT NAME, AGE,
CASE 
WHEN AGE > 30 THEN 'Gen X'
WHEN AGE > 25 THEN 'Gen Y'
WHEN AGE > 22 THEN 'Gen Z'
ELSE 'Gen Alpha' 
END AS Generation
FROM CUSTOMERS;

输出

产生的输出如下 -

姓名 年龄 一代
拉梅什 32 X世代
基兰 25 Z世代
考希克 23 Z世代
柴塔利 25 Z世代
哈迪克 27 Y世代
科马尔 22 阿尔法一代
莫菲 24 Z世代

例子

让我们看一下另一个查询,如果之前创建的 CUSTOMERS 表中的金额小于 4500,我们希望为每个客户提供 25% 的增量 -

SELECT *, CASE 
WHEN SALARY < 4500 THEN (SALARY + SALARY * 25/100) 
END AS INCREMENT FROM CUSTOMERS;

输出

这里,SQL 命令检查工资是否小于 4500。如果满足此条件,新列“INCREMENT”将包含等于工资增量 25% 的值。

由于上面的查询中没有提到 ELSE 部分,并且对于少数客户来说,没有一个条件成立,因此返回 NULL,这表明他们没有获得任何增量。

ID 姓名 年龄 地址 薪水 增量
1 拉梅什 32 艾哈迈达巴德 2000.00 2500.000000
2 基兰 25 德里 1500.00 1875.000000
3 考希克 23 科塔 2000.00 2500.000000
4 柴塔利 25 孟买 6500.00 无效的
5 哈迪克 27 博帕尔 8500.00 无效的
6 科马尔 22 海得拉巴 4500.00 无效的
7 莫菲 24 印多尔 10000.00 无效的

带有 ORDER BY 子句的 CASE 语句

我们可以使用带有 ORDER BY 子句的 CASE 语句。SQL 中的 ORDER BY 子句按升序(默认)或降序对结果进行排序。

例子

在此查询中,CASE 语句用于根据“NAME”列或“ADDRESS”列对结果进行排序,具体取决于“NAME”列的值。如果“NAME”列以“K”开头,则结果按“NAME”列排序;否则,结果按“地址”列排序 -

SELECT * FROM CUSTOMERS
ORDER BY
(CASE
    WHEN NAME LIKE 'k%' THEN NAME
    ELSE ADDRESS
END);

输出

执行上述查询得到的结果如下所示:

ID 姓名 年龄 地址 薪水
1 拉梅什 32 艾哈迈达巴德 2000.00
5 哈迪克 27 博帕尔 8500.00
7 莫菲 24 印多尔 10000.00
3 考希克 23 科塔 2000.00
2 基兰 25 德里 1500.00
6 科马尔 22 海得拉巴 4500.00
4 柴塔利 25 孟买 6500.00

带有 GROUP BY 子句的 CASE 语句

我们还可以将 CASE 语句与 GROUP BY 子句一起使用。SQL 中的 GROUP BY 子句将一列或多列中具有相同值的行分组,其中应用聚合函数来生成摘要。

例子

在以下查询中,我们根据客户的工资对客户进行分组,并计算指定范围的客户数据的工资总和。

如果 SALARY 中的值小于或等于 4000,则数据将分组为“最低工资”。如果该值大于 4000 且小于或等于 6500,则将被分组为“平均支付”。所有其他值将被分组为“最高报酬”。SUM 函数用于计算每个组的工资总额 -

SELECT 
   CASE 
      WHEN SALARY <= 4000 THEN 'Lowest paid'
      WHEN SALARY > 4000 AND SALARY <= 6500 THEN 'Average paid'
   ELSE 'Highest paid' 
      END AS SALARY_STATUS,
   SUM(SALARY) AS Total
   FROM CUSTOMERS
   GROUP BY 
   CASE 
      WHEN SALARY <= 4000 THEN 'Lowest paid'
      WHEN SALARY > 4000 AND SALARY <= 6500 THEN 'Average paid'
   ELSE 'Highest paid'
END;

输出

以下是上述查询的输出 -

工资状态 全部的
最低工资 5500.00
平均支付 11000.00
薪酬最高 18500.00

带有 WHERE 子句的 CASE 语句

我们也可以将 CASE 语句与 WHERE 子句一起使用。WHERE 子句用于根据指定条件过滤表中的行。

例子

在以下查询中,CASE 语句用于根据客户的年龄返回客户的不同名称。WHERE 子句用于根据 CUSTOMERS 的 SALARY 过滤行 -

SELECT NAME, ADDRESS, 
   CASE 
      WHEN AGE < 25 THEN 'Intern'
      WHEN AGE >= 25 and AGE <= 27 THEN 'Associate Engineer'
      ELSE 'Senior Developer'
   END as Designation
FROM CUSTOMERS
WHERE SALARY >= 2000;

输出

上述查询的输出如下 -

姓名 地址 指定
拉梅什 艾哈迈达巴德 高级开发人员
考希克 科塔 实习生
柴塔利 孟买 副工程师
哈迪克 博帕尔 副工程师
科马尔 海得拉巴 实习生
莫菲 印多尔 实习生

带 UPDATE 的 CASE 语句

我们可以在 UPDATE 语句中使用 CASE 语句对表中的数据执行条件更新。

例子

在下面的查询中,我们根据所有客户的年龄更新他们的工资。

如果客户的年龄等于“25”,他们的工资将更新为“17000”。如果年龄等于“32”,则会更新为“25000”。对于其他年龄的客户,工资将更新为“12000” -

UPDATE CUSTOMERS
SET SALARY= 
CASE AGE
WHEN 25 THEN 17000
WHEN 32 THEN 25000
ELSE 12000
END;

输出

我们得到以下结果。我们可以观察到更改已在 7 行中完成 -

Query OK, 7 rows affected (0.02 sec)
Rows matched: 7  Changed: 7  Warnings: 0

确认

我们可以使用以下查询纠正 CUSTOMERS 表中所做的更改 -

SELECT * FROM CUSTOMERS;

该表显示如下 -

ID 姓名 年龄 地址 薪水
1 拉梅什 32 艾哈迈达巴德 25000.00
2 基兰 25 德里 17000.00
3 考希克 23 科塔 12000.00
4 柴塔利 25 孟买 17000.00
5 哈迪克 27 博帕尔 12000.00
6 科马尔 22 海得拉巴 12000.00
7 莫菲 24 印多尔 12000.00

正如我们在上表中看到的,所有客户的工资都已根据他们的年龄进行了更新。

带 INSERT 的 CASE 语句

我们还可以借助 CASE 语句将数据插入 MySQL 表中。我们需要为 INSERT INTO 语句提供列名和用于数据插入的 VALUES。

例子

这里,如果客户年龄大于等于25岁,那么工资就是23000;否则工资将为 14000 -

INSERT INTO CUSTOMERS (ID, NAME, AGE, ADDRESS, SALARY)
VALUES (10, 'Viren', 28, 'Varanasi', 
   CASE 
      WHEN AGE >= 25 THEN 23000
      ELSE 14000
   END
);

输出

我们得到以下结果。我们可以观察到更改已在 1 行中完成 -

Query OK, 1 row affected (0.01 sec)

确认

我们可以使用以下查询纠正 CUSTOMERS 表中所做的更改 -

SELECT * FROM CUSTOMERS;

该表显示如下 -

ID 姓名 年龄 地址 薪水
1 拉梅什 32 艾哈迈达巴德 2000.00
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00
4 柴塔利 25 孟买 6500.00
5 哈迪克 27 博帕尔 8500.00
6 科马尔 22 海得拉巴 4500.00
7 莫菲 24 印多尔 10000.00
10 维伦 28 瓦拉纳西 23000.00