首页
技术小册
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基础教程(中)
### 章节标题:CASE表达式的使用方法 在SQL的世界里,`CASE`表达式是一种极其强大且灵活的工具,它允许你在查询中执行条件逻辑,类似于编程语言中的`if-else`语句。无论是进行数据转换、条件聚合,还是实现复杂的业务规则,`CASE`表达式都能提供简洁而高效的解决方案。本章节将深入探讨`CASE`表达式的语法、用法以及其在不同场景下的应用实例。 #### 一、CASE表达式基础 `CASE`表达式有两种基本形式:简单`CASE`表达式和搜索`CASE`表达式。尽管它们在功能上相似,但语法上有所区别。 ##### 1.1 简单CASE表达式 简单`CASE`表达式用于比较单个表达式与一系列值,并返回与第一个匹配值相关联的结果。其语法结构如下: ```sql CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ... ELSE default_result END ``` - `expression`是要与`valueN`进行比较的表达式。 - `valueN`是与`expression`进行比较的值。 - `resultN`是当`expression = valueN`时返回的结果。 - `default_result`是当没有任何`valueN`与`expression`匹配时返回的结果(可选)。 ##### 1.2 搜索CASE表达式 搜索`CASE`表达式提供了更灵活的条件检查方式,允许你使用不同的条件表达式而非单一表达式与值进行比较。其语法结构如下: ```sql CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE default_result END ``` - `conditionN`是要评估的条件表达式。 - `resultN`是当`conditionN`为真时返回的结果。 - `default_result`是当所有`conditionN`均为假时返回的结果(可选)。 #### 二、CASE表达式的应用场景 `CASE`表达式在SQL查询中有着广泛的应用场景,包括但不限于数据转换、条件聚合、排序以及报表生成等。 ##### 2.1 数据转换 在数据检索过程中,经常需要根据某些条件改变字段的显示值。例如,根据员工的绩效评分显示不同的绩效等级: ```sql SELECT employee_id, name, score, CASE WHEN score >= 90 THEN '优秀' WHEN score >= 75 THEN '良好' WHEN score >= 60 THEN '及格' ELSE '不及格' END AS performance_level FROM employees; ``` ##### 2.2 条件聚合 在聚合查询中,`CASE`表达式可以用来根据条件对数据进行分组统计。例如,统计不同销售区域的销售额占比: ```sql SELECT region, SUM(CASE WHEN region = '北区' THEN sales ELSE 0 END) / SUM(sales) AS north_ratio, SUM(CASE WHEN region = '南区' THEN sales ELSE 0 END) / SUM(sales) AS south_ratio FROM sales GROUP BY region; ``` 注意:上述查询中的`SUM(sales)`实际上在SQL中可能需要作为子查询或窗口函数来确保分母正确计算。 ##### 2.3 复杂排序 使用`CASE`表达式,你可以根据复杂的业务规则对数据进行排序。比如,根据员工的入职年份和绩效评分进行排序,先按入职年份升序排列,若年份相同则按绩效评分降序排列: ```sql SELECT employee_id, name, hire_year, score FROM employees ORDER BY hire_year ASC, CASE WHEN score IS NULL THEN 0 ELSE score END DESC; ``` ##### 2.4 报表生成 在生成报表时,`CASE`表达式可以用来动态创建列或计算新的统计指标,使得报表更加灵活和多样化。例如,计算产品类别的销售额占比并直接展示在报表中: ```sql SELECT product_category, SUM(sales) AS total_sales, ROUND(SUM(sales) * 100.0 / (SELECT SUM(sales) FROM sales), 2) AS sales_percentage FROM sales GROUP BY product_category UNION ALL SELECT '总计', SUM(sales) AS total_sales, 100.0 AS sales_percentage FROM sales; ``` 虽然这个例子没有直接使用`CASE`表达式来创建报表列,但展示了如何通过聚合和子查询来计算报表中常用的统计指标,而`CASE`表达式可以很容易地融入这些计算中,用于生成更复杂的报表内容。 #### 三、性能考虑 虽然`CASE`表达式功能强大且灵活,但在使用时也需要注意其对查询性能的影响。特别是在处理大数据集时,复杂的`CASE`表达式可能会增加查询的执行时间和资源消耗。因此,建议: - 尽量避免在`WHERE`子句中使用`CASE`表达式,因为它们可能无法有效利用索引。 - 评估`CASE`表达式中条件的复杂性和数量,考虑是否可以通过其他方式(如视图、计算列或应用层逻辑)来简化查询。 - 使用执行计划分析器(如SQL Server的查询分析器)来评估和优化包含`CASE`表达式的查询。 #### 四、总结 `CASE`表达式是SQL中不可或缺的一部分,它为查询提供了强大的条件逻辑处理能力。通过灵活使用简单`CASE`和搜索`CASE`表达式,你可以轻松实现数据转换、条件聚合、复杂排序以及报表生成等多种需求。然而,在享受其带来的便利性的同时,也应注意其对性能的影响,并采取适当的优化措施以确保查询的高效执行。希望本章内容能够帮助你更好地理解和运用`CASE`表达式,在SQL查询中更加游刃有余。
上一篇:
CASE表达式的语法
下一篇:
第7章 集合运算
该分类下的相关小册推荐:
SQL基础教程(下)
SQL基础教程(上)
PostgreSQL入门教程
高性能的Postgres SQL