- SQL 教程
- SQL - 首页
- SQL - 概述
- SQL - RDBMS 概念
- SQL - 数据库
- SQL - 语法
- SQL - 数据类型
- SQL - 运算符
- SQL - 表达式
- SQL 数据库
- SQL - 创建数据库
- SQL - 删除数据库
- SQL - 选择数据库
- SQL - 重命名数据库
- SQL - 显示数据库
- SQL - 备份数据库
- SQL 表
- SQL - 创建表
- SQL - 显示表
- SQL - 重命名表
- SQL - 清空表
- SQL - 克隆表
- SQL - 临时表
- SQL - 修改表
- SQL - 删除表
- SQL - 删除表
- SQL - 约束
- SQL 查询
- SQL - 插入查询
- SQL - 选择查询
- SQL - Select Into
- SQL - Insert Into Select
- SQL - 更新查询
- SQL - 删除查询
- SQL - 排序结果
- SQL 视图
- SQL - 创建视图
- SQL - 更新视图
- SQL - 删除视图
- SQL - 重命名视图
- SQL 运算符和子句
- SQL - Where 子句
- SQL - Top 子句
- SQL - Distinct 子句
- SQL - Order By 子句
- SQL - Group By 子句
- SQL - Having 子句
- SQL - AND & OR
- SQL - BOOLEAN (BIT) 运算符
- SQL - LIKE 运算符
- SQL - IN 运算符
- SQL - ANY, ALL 运算符
- SQL - EXISTS 运算符
- SQL - CASE语句
- SQL - NOT 运算符
- SQL - 不等于
- SQL - IS NULL
- SQL - IS NOT NULL
- SQL - NOT NULL
- SQL - BETWEEN 运算符
- SQL - UNION 运算符
- SQL - UNION vs UNION ALL
- SQL - INTERSECT 运算符
- SQL - EXCEPT 运算符
- SQL - 别名
- SQL 连接
- SQL - 使用连接
- SQL - 内连接
- SQL - 左连接
- SQL - 右连接
- SQL - 交叉连接
- SQL - 全连接
- SQL - 自连接
- SQL - 删除连接
- SQL - 更新连接
- SQL - 左连接 vs 右连接
- SQL - Union vs Join
- SQL 键
- SQL - 唯一键
- SQL - 主键
- SQL - 外键
- SQL - 组合键
- SQL - 备选键
- SQL 索引
- SQL - 索引
- SQL - 创建索引
- SQL - 删除索引
- SQL - 显示索引
- SQL - 唯一索引
- SQL - 聚簇索引
- SQL - 非聚簇索引
- 高级 SQL
- SQL - 通配符
- SQL - 注释
- SQL - 注入
- SQL - 托管
- SQL - Min & Max
- SQL - 空函数
- SQL - 检查约束
- SQL - 默认约束
- SQL - 存储过程
- SQL - NULL 值
- SQL - 事务
- SQL - 子查询
- SQL - 处理重复项
- SQL - 使用序列
- SQL - 自动递增
- SQL - 日期和时间
- SQL - 游标
- SQL - 公共表表达式
- SQL - Group By vs Order By
- SQL - IN vs EXISTS
- SQL - 数据库调优
- SQL 函数参考
- SQL - 日期函数
- SQL - 字符串函数
- SQL - 聚合函数
- SQL - 数值函数
- SQL - 文本和图像函数
- SQL - 统计函数
- SQL - 逻辑函数
- SQL - 游标函数
- SQL - JSON 函数
- SQL - 转换函数
- SQL - 数据类型函数
- SQL 有用资源
- SQL - 问答
- SQL - 快速指南
- SQL - 有用函数
- SQL - 有用资源
- SQL - 讨论
SQL - CASE语句
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;
其中,condition1, condition2, 等是条件语句,statement1, statement2, 等是在条件为真时要执行的操作。
满足条件后,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 | NAME | AGE | ADDRESS | SALARY |
|---|---|---|---|---|
| 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 |
在以下查询中,我们对 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;
输出
产生的输出如下所示:
| NAME | AGE | Generation |
|---|---|---|
| Ramesh | 32 | Gen X |
| Khilan | 25 | Gen Z |
| Kaushik | 23 | Gen Z |
| Chaitali | 25 | Gen Z |
| Hardik | 27 | Gen Y |
| Komal | 22 | Gen Alpha |
| Muffy | 24 | Gen Z |
示例
让我们看看另一个查询,我们希望为之前创建的 CUSTOMERS 表中每个客户的金额小于 4500 的情况提供 25% 的加薪:
SELECT *, CASE WHEN SALARY < 4500 THEN (SALARY + SALARY * 25/100) END AS INCREMENT FROM CUSTOMERS;
输出
在这里,SQL 命令检查薪水是否小于 4500。如果满足此条件,则新列“INCREMENT”将包含等于薪水加 25% 增量的值。
由于上述查询中未提及 ELSE 部分,并且某些 CUSTOMERS 的条件均不为真,因此返回 NULL,这表明他们没有获得任何加薪。
| ID | NAME | AGE | ADDRESS | SALARY | INCREMENT |
|---|---|---|---|---|---|
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 | 2500.000000 |
| 2 | Khilan | 25 | Delhi | 1500.00 | 1875.000000 |
| 3 | Kaushik | 23 | Kota | 2000.00 | 2500.000000 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 | NULL |
| 5 | Hardik | 27 | Bhopal | 8500.00 | NULL |
| 6 | Komal | 22 | Hyderabad | 4500.00 | NULL |
| 7 | Muffy | 24 | Indore | 10000.00 | NULL |
带有 ORDER BY 子句的 CASE 语句
我们可以将 CASE 语句与 ORDER BY 子句一起使用。SQL 中的 ORDER BY 子句按升序(默认)或降序对结果进行排序。
示例
在此查询中,CASE 语句用于根据“NAME”列的值按“NAME”列或“ADDRESS”列对结果进行排序。如果“NAME”列以“K”开头,则按“NAME”列对结果进行排序;否则,按“ADDRESS”列对结果进行排序:
SELECT * FROM CUSTOMERS
ORDER BY
(CASE
WHEN NAME LIKE 'k%' THEN NAME
ELSE ADDRESS
END);
输出
执行上述查询获得的结果如下所示:
| ID | NAME | AGE | ADDRESS | SALARY |
|---|---|---|---|---|
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
| 3 | Kaushik | 23 | Kota | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 6 | Komal | 22 | Hyderabad | 4500.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
带有 GROUP BY 子句的 CASE 语句
我们还可以将 CASE 语句与 GROUP BY 子句一起使用。SQL 中的 GROUP BY 子句将具有相同值的行的分组到一个或多个列中,其中应用聚合函数以生成汇总。
示例
在以下查询中,我们根据客户的薪水对客户进行分组,并计算指定客户数据范围内的薪水总和。
如果 SALARY 中的值小于或等于 4000,则数据将被分组为“最低薪”。如果该值大于 4000 且小于或等于 6500,则将其分组为“平均薪”。所有其他值将被分组为“最高薪”。SUM 函数用于计算每个组的 SALARY 总和:
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;
输出
以下是上述查询的输出:
| SALARY_STATUS | Total |
|---|---|
| Lowest paid | 5500.00 |
| Average paid | 11000.00 |
| Highest paid | 18500.00 |
带有 WHERE 子句的 CASE 语句
我们也可以将 CASE 语句与 WHERE 子句一起使用。WHERE 子句用于根据指定的条件筛选表中的行。
示例
在以下查询中,CASE 语句用于根据客户的 AGE 返回客户的不同职位。WHERE 子句用于根据客户的 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;
输出
上述查询的输出如下所示:
| NAME | ADDRESS | Designation |
|---|---|---|
| Ramesh | Ahmedabad | Senior Developer |
| Kaushik | Kota | Intern |
| Chaitali | Mumbai | Associate Engineer |
| Hardik | Bhopal | Associate Engineer |
| Komal | Hyderabad | Intern |
| Muffy | Indore | Intern |
带有 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 | NAME | AGE | ADDRESS | SALARY |
|---|---|---|---|---|
| 1 | Ramesh | 32 | Ahmedabad | 25000.00 |
| 2 | Khilan | 25 | Delhi | 17000.00 |
| 3 | Kaushik | 23 | Kota | 12000.00 |
| 4 | Chaitali | 25 | Mumbai | 17000.00 |
| 5 | Hardik | 27 | Bhopal | 12000.00 |
| 6 | Komal | 22 | Hyderabad | 12000.00 |
| 7 | Muffy | 24 | Indore | 12000.00 |
如上表所示,所有客户的 SALARY 都已根据其年龄进行了更新。
带有 INSERT 的 CASE 语句
我们还可以借助 CASE 语句将数据插入 MySQL 表中。我们需要为数据插入提供带有列名和值的 INSERT INTO 语句。
示例
在这里,如果客户的年龄大于或等于 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 | NAME | AGE | ADDRESS | SALARY |
|---|---|---|---|---|
| 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 |
| 10 | Viren | 28 | Varanasi | 23000.00 |