Sql 简明教程
SQL - CASE
The SQL CASE Statement
SQL CASE 语句是一个条件语句,它帮助我们基于一组条件进行决策。它评估条件集,并在满足条件时返回各自的值。
CASE 语句的工作方式类似于简化的 IF-THEN-ELSE 语句,并允许测试多个条件。
它经常用于基于现有列的值创建具有值的列。
让我们看一个简单的场景来理解这个声明。
例如,当客户的信用额度高于“10,000”时,则客户将被认为是“高价值客户”;当信用额度高于“5000”时,则客户将被认为是“中价值客户”;否则,客户将被认为是“低价值客户”,如下表所示:
Syntax
以下是 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。
Example
假设我们已使用以下查询创建了一个名为 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 条件。如果客户表中没有与查询 − 中 ELSE 部分提到的条件匹配,CASE 返回“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;
Output
输出结果如下:
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 |
Example
让我们看另一个查询,其中我们想要为每个客户提供 25% 的增量,如果金额小于先前创建的 CUSTOMERS 表中的 4500 −
SELECT *, CASE
WHEN SALARY < 4500 THEN (SALARY + SALARY * 25/100)
END AS INCREMENT FROM CUSTOMERS;
Output
此处,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 |
CASE Statement with ORDER BY Clause
我们可以在 ORDER BY 子句中使用 CASE 语句。SQL 中的 ORDER BY 子句按升序(默认)或降序对结果进行排序。
CASE Statement with GROUP BY Clause
我们还可以在 GROUP BY 子句中使用 CASE 语句。SQL 中的 GROUP BY 子句对一个或多个列中的值相同的行进行分组,并将聚合函数应用于这些行以生成汇总。
Example
在以下查询中,我们根据客户的工资对客户进行分组,并计算指定范围客户数据的工资总和。
如果 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;
CASE Statement with WHERE Clause
我们还可以在 WHERE 子句中使用 CASE 语句。WHERE 子句用于根据指定条件筛选表中的行。
CASE Statement with UPDATE
我们可以在 UPDATE 语句内使用 CASE 语句对表中的数据执行条件更新。
Example
在以下查询中,我们根据客户的年龄更新所有客户的工资。
如果客户的年龄等于“25”,则他们的工资将更新为“17000”。如果年龄等于“32”,则更新为“25000”。对于其他年龄的客户,工资将更新为“12000” −
UPDATE CUSTOMERS
SET SALARY=
CASE AGE
WHEN 25 THEN 17000
WHEN 32 THEN 25000
ELSE 12000
END;
Output
我们得到以下结果。我们可以观察到,这些更改已在 7 行中完成 -
Query OK, 7 rows affected (0.02 sec)
Rows matched: 7 Changed: 7 Warnings: 0
Verification
我们可以使用以下查询更正 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 已根据其年龄进行更新。
CASE Statement with INSERT
我们还可以借助 CASE 语句将数据插入 MySQL 表中。我们需要提供插入数据所用列名称和 VALUES 的 INSERT INTO 语句。
Example
在这里,如果客户的年龄大于或等于 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
);
Verification
我们可以使用以下查询更正 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 |