首页
技术小册
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基础教程(中)
### 章节:包含重复行的集合运算——ALL选项 在SQL(Structured Query Language)的广阔领域中,集合运算是数据处理和分析不可或缺的一部分。它允许我们根据特定的逻辑规则将两个或多个查询结果集合并、交集或差集。在这些运算中,处理重复行的方式尤为重要,尤其是当我们使用`ALL`选项时,它会显著改变结果集的表现形式。本章将深入探讨包含重复行的集合运算,特别是聚焦于`UNION ALL`、`INTERSECT ALL`(虽然标准SQL中并不直接支持`INTERSECT ALL`,但我们会讨论其概念及模拟方法)以及如何在特定场景下有效利用这些操作。 #### 一、集合运算基础 在SQL中,集合运算主要包括三种类型:`UNION`、`INTERSECT`和`EXCEPT`(或`MINUS`,取决于数据库系统)。这些操作允许我们根据两个或多个查询结果集之间的关系来生成新的结果集。然而,默认情况下,`UNION`和`INTERSECT`会自动去除结果集中的重复行,而`EXCEPT`则用于找出存在于第一个查询结果集中但不在第二个查询结果集中的记录,同样会去除重复。 - **UNION**:合并两个或多个`SELECT`语句的结果集,去除重复行。 - **INTERSECT**:返回两个或多个`SELECT`语句结果集的交集,去除重复行。 - **EXCEPT**(或**MINUS**):返回存在于第一个`SELECT`语句结果集中但不在后续`SELECT`语句结果集中的记录,去除重复。 #### 二、`UNION ALL`:包含重复行的合并 `UNION ALL`是`UNION`的一个变种,它在合并两个或多个`SELECT`语句的结果集时,不会去除重复的行。这一特性使得`UNION ALL`在处理需要保留所有原始数据行(包括重复项)的场景下尤为有用。 ##### 示例 假设我们有两个表:`employees_2020`和`employees_2021`,它们分别记录了2020年和2021年公司的员工信息。现在,我们想要获取这两年所有员工的完整列表,包括可能的重复记录(比如,某位员工在两年中都出现了)。 ```sql SELECT employee_id, name, year FROM employees_2020 UNION ALL SELECT employee_id, name, '2021' AS year FROM employees_2021; ``` 在这个查询中,如果某位员工在2020年和2021年都存在于这两个表中,那么他的记录将在结果集中出现两次,分别对应两年。这就是`UNION ALL`保留重复行的直接体现。 #### 三、模拟`INTERSECT ALL`:包含重复行的交集 虽然标准SQL不直接支持`INTERSECT ALL`操作,但我们可以通过一些技巧来模拟这一行为。基本思路是,首先使用`UNION ALL`合并两个表,然后通过对合并后的结果进行分组和计数,找出在两个表中都出现的记录(包括重复次数相同的记录)。 ##### 示例 继续使用上述的`employees_2020`和`employees_2021`表,如果我们想要找出这两年都出现的员工(包括他们各自出现的次数),可以这样做: ```sql WITH Combined AS ( SELECT employee_id, name, '2020' AS year, 1 AS count FROM employees_2020 UNION ALL SELECT employee_id, name, '2021' AS year, 1 AS count FROM employees_2021 ), Grouped AS ( SELECT employee_id, name, COUNT(*) AS total_count FROM Combined GROUP BY employee_id, name HAVING COUNT(DISTINCT year) = 2 ) SELECT g.employee_id, g.name, SUM(CASE WHEN c.year = '2020' THEN c.count ELSE 0 END) AS count_2020, SUM(CASE WHEN c.year = '2021' THEN c.count ELSE 0 END) AS count_2021 FROM Grouped g JOIN Combined c ON g.employee_id = c.employee_id AND g.name = c.name GROUP BY g.employee_id, g.name; ``` 这个查询首先通过`WITH`子句创建了一个合并后的临时表`Combined`,它包含了两个表中所有员工的记录及其出现的年份和次数。然后,`Grouped`子查询对合并后的数据进行分组,并筛选出那些在两个年份中都出现的员工。最后,主查询通过连接操作计算每位员工在两年中的具体出现次数。 #### 四、使用场景与性能考量 - **数据审计**:在需要保留完整历史记录进行审计的场景中,`UNION ALL`非常有用。 - **性能优化**:在某些情况下,使用`UNION ALL`可能比使用`UNION`(去除重复行)更高效,因为数据库系统不需要执行额外的去重操作。 - **报表生成**:当报表需要准确反映数据重复情况时(如销售记录、库存变动等),`UNION ALL`和模拟的`INTERSECT ALL`技术就显得尤为重要。 然而,也应当注意,在数据量非常大的情况下,不恰当地使用`UNION ALL`可能会导致结果集异常庞大,影响查询性能和系统的响应能力。因此,在实际应用中,需要根据具体需求和数据特性来选择最合适的集合运算方式。 #### 五、总结 包含重复行的集合运算,特别是`UNION ALL`,以及通过技巧模拟的`INTERSECT ALL`,在SQL数据处理中扮演着重要角色。它们不仅丰富了SQL的查询能力,还使得在处理需要保留原始数据完整性的场景中更加灵活和强大。通过合理运用这些技术,我们可以更加高效地分析和利用数据库中的数据,为决策提供更加准确和全面的支持。
上一篇:
集合运算的注意事项
下一篇:
选取表中公共部分——INTERSECT
该分类下的相关小册推荐:
高性能的Postgres SQL
PostgreSQL入门教程
SQL基础教程(下)
SQL基础教程(上)