- 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 - 选择进入
- SQL - 插入选择
- SQL - 更新查询
- SQL - 删除查询
- SQL - 对结果进行排序
- SQL 视图
- SQL - 创建视图
- SQL - 更新视图
- SQL - 删除视图
- SQL - 重命名视图
- SQL 运算符和子句
- SQL-Where 子句
- SQL - 顶部子句
- SQL - 不同子句
- SQL - Order By 子句
- SQL - Group By 子句
- SQL-Having 子句
- SQL - 与与或
- SQL - 布尔(位)运算符
- SQL - LIKE 运算符
- SQL - IN 运算符
- SQL - ANY、ALL 运算符
- SQL - EXISTS 运算符
- SQL-案例
- SQL - NOT 运算符
- SQL - 不等于
- SQL - 为空
- SQL - 不为空
- SQL - 非空
- SQL - BETWEEN 运算符
- SQL - UNION 运算符
- SQL - UNION 与 UNION ALL
- SQL - 相交运算符
- SQL - EXCEPT 运算符
- 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 - 非聚集索引
- 高级SQL
- SQL - 通配符
- SQL - 注释
- SQL-注入
- SQL-托管
- SQL - 最小值和最大值
- SQL - 空函数
- SQL - 检查约束
- SQL - 默认约束
- SQL-存储过程
- SQL - NULL 值
- SQL - 事务
- SQL - 子查询
- SQL - 处理重复项
- SQL - 使用序列
- SQL-自动递增
- SQL - 日期和时间
- SQL-游标
- SQL - 公用表表达式
- SQL - 分组依据与排序依据
- SQL - IN 与 EXISTS
- SQL——数据库调优
- SQL 函数参考
- SQL - 日期函数
- SQL - 字符串函数
- SQL - 聚合函数
- SQL - 数字函数
- SQL - 文本和图像函数
- SQL - 统计函数
- SQL - 逻辑函数
- SQL - 游标函数
- SQL-JSON 函数
- SQL - 转换函数
- SQL - 数据类型函数
- SQL 有用资源
- SQL - 问题与解答
- SQL - 快速指南
- SQL - 有用的函数
- SQL - 有用的资源
- SQL - 讨论
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 |