首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第4章 数据更新
4-1 数据的插入(INSERT语句的使用方法)
什么是INSERT
INSERT语句的基本语法
列清单的省略
插入NULL
插入默认值
从其他表中复制数据
4-2 数据的删除(DELETE语句的使用方法)
DROP TABLE语句和DELETE语句
DELETE语句的基本语法
指定删除对象的DELETE语句(搜索型DELETE)
4-3 数据的更新(UPDATE语句的使用方法)
UPDATE语句的基本语法
指定条件的UPDATE语句(搜索型UPDATE)
使用NULL进行更新
多列更新
4-4 事务
什么是事务
创建事务
ACID特性
第5章 复杂查询
5-1 视图
视图和表
创建视图的方法
视图的限制① ——定义视图时不能使用ORDER BY子句
视图的限制② ——对视图进行更新
删除视图
5-2 子查询
子查询和视图
子查询的名称
标量子查询
标量子查询的书写位置
使用标量子查询时的注意事项
5-3 关联子查询
普通的子查询和关联子查询的区别
关联子查询也是用来对集合进行切分的
结合条件一定要写在子查询中
第6章 函数、谓词、CASE表达式
6-1 各种各样的函数
函数的种类
算术函数
字符串函数
日期函数
转换函数
6-2 谓词
什么是谓词
LIKE谓词——字符串的部分一致查询
BETWEEN谓词——范围查询
IS NULL、IS NOT NULL——判断是否为NULL
IN谓词——OR的简便用法
使用子查询作为IN谓词的参数
EXIST谓词
6-3 CASE表达式
什么是CASE表达式
CASE表达式的语法
CASE表达式的使用方法
第7章 集合运算
7-1 表的加减法
什么是集合运算
表的加法——UNION
集合运算的注意事项
包含重复行的集合运算——ALL选项
选取表中公共部分——INTERSECT
记录的减法——EXCEPT
7-2 联结(以列为单位对表进行联结)
什么是联结
内联结——INNER JOIN
外联结——OUTER JOIN
3张以上的表的联结
交叉联结——CROSS JOIN
联结的特定语法和过时语法
当前位置:
首页>>
技术小册>>
SQL基础教程(中)
小册名称:SQL基础教程(中)
### 6-3 CASE表达式 在SQL中,`CASE`表达式是一种强大的条件逻辑工具,它允许在查询的单个字段内执行复杂的条件判断,并根据这些条件返回不同的结果。这种灵活性使得`CASE`表达式在数据分析和报表生成中尤为有用,特别是在需要根据特定条件对数据进行分类或转换时。本章节将深入探讨`CASE`表达式的语法、用法、示例以及其在实践中的应用。 #### 6.3.1 CASE表达式基础 `CASE`表达式有两种基本形式:简单`CASE`表达式和搜索`CASE`表达式。尽管在功能上它们可以相互替代,但在语法和某些使用场景下,选择最适合的一种可以提高代码的可读性和效率。 ##### 简单CASE表达式 简单`CASE`表达式基于单个表达式的值进行比较,并返回与之匹配的结果。其基本语法如下: ```sql CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ... ELSE default_result END ``` 这里,`expression`是要与各个`valueN`进行比较的表达式,如果`expression = valueN`为真,则返回`resultN`。如果没有任何`valueN`匹配,则返回`default_result`(如果存在的话)。 ##### 搜索CASE表达式 搜索`CASE`表达式提供了更灵活的条件判断机制,它允许直接使用布尔表达式作为条件。其语法如下: ```sql CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE default_result END ``` 在这里,`conditionN`是任何返回布尔值的表达式。如果`conditionN`为真,则返回`resultN`。如果所有条件都不满足,则返回`default_result`(如果存在)。 #### 6.3.2 使用CASE表达式的场景 `CASE`表达式在SQL查询中的应用非常广泛,包括但不限于以下场景: 1. **数据分类**:根据数据列的值将数据行分类到不同的类别中。 2. **数据转换**:基于某些条件将数据从一个值转换为另一个值。 3. **条件聚合**:在`GROUP BY`查询中,根据分组内的条件计算不同的聚合值。 4. **条件排序**:在`ORDER BY`子句中使用`CASE`表达式实现复杂的排序逻辑。 5. **计算字段**:在查询结果中动态创建新的计算字段。 #### 6.3.3 示例 以下是一些使用`CASE`表达式的具体示例,以展示其在实际应用中的强大功能。 ##### 示例1:数据分类 假设有一个名为`employees`的表,包含员工的ID、姓名和部门ID。我们要根据部门ID将员工分类为“销售”、“技术”或“其他”。 ```sql SELECT employee_id, name, CASE department_id WHEN 1 THEN '销售' WHEN 2 THEN '技术' ELSE '其他' END AS department_name FROM employees; ``` ##### 示例2:数据转换 假设我们有一个名为`grades`的表,记录了学生的成绩(以百分制表示)。我们想要将成绩转换为等级制(A、B、C、D、F)。 ```sql SELECT student_id, score, CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' WHEN score >= 70 THEN 'C' WHEN score >= 60 THEN 'D' ELSE 'F' END AS grade FROM grades; ``` ##### 示例3:条件聚合 考虑一个销售数据表`sales`,包含销售日期、产品ID和销售额。我们想要计算每个产品的总销售额,并区分哪些是“高销售额”产品(销售额超过平均值)。 ```sql WITH avg_sales AS ( SELECT AVG(sales_amount) AS avg_amount FROM sales ) SELECT product_id, SUM(sales_amount) AS total_sales, CASE WHEN SUM(sales_amount) > (SELECT avg_amount FROM avg_sales) THEN '高销售额' ELSE '低销售额' END AS sales_category FROM sales GROUP BY product_id; ``` 注意:此示例使用了公用表表达式(CTE)来计算销售额的平均值,以便在`CASE`表达式中使用。 ##### 示例4:条件排序 假设我们想要根据员工的入职年份对员工进行排序,但想要将特定年份(如2020年)入职的员工排在最前面。 ```sql SELECT employee_id, name, hire_year, CASE WHEN hire_year = 2020 THEN 1 ELSE 2 END AS sort_order FROM employees ORDER BY sort_order, hire_year; ``` 这里,我们通过为特定条件(2020年入职)的员工分配较低的排序值(1),实现了将这些员工排在最前面的目的。 #### 6.3.4 总结 `CASE`表达式是SQL中一个非常强大的工具,它允许在查询中执行复杂的条件逻辑,并根据这些条件返回不同的结果。无论是进行数据分类、转换、条件聚合,还是在排序时使用复杂的逻辑,`CASE`表达式都能提供灵活且强大的解决方案。通过熟练掌握`CASE`表达式的使用,你可以编写出更加高效、可读且功能丰富的SQL查询。
上一篇:
EXIST谓词
下一篇:
什么是CASE表达式
该分类下的相关小册推荐:
SQL基础教程(上)
SQL基础教程(下)
PostgreSQL入门教程
高性能的Postgres SQL