首页
技术小册
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基础教程(中)
### 表的加法——UNION 在SQL的世界里,数据表是存储和处理信息的基本单位。当我们需要从多个表中提取数据,并将它们合并为一个结果集时,`UNION` 操作符便成为了我们的得力助手。`UNION` 被形象地称为“表的加法”,因为它允许我们将两个或多个 `SELECT` 语句的结果集合并成一个结果集,同时自动去除重复的行。这种能力在处理跨表查询、汇总数据或报告生成时尤其有用。 #### 一、UNION 的基本概念 `UNION` 操作符用于合并两个或多个 `SELECT` 语句的结果集,但要求每个 `SELECT` 语句必须拥有相同数量的列,并且对应列的数据类型也需要兼容。合并的结果集默认不包含重复行,并且结果集中的列名来自第一个 `SELECT` 语句。 ##### 1.1 语法结构 ```sql SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2; ``` - `column_name(s)`:指定要从表中检索的列。 - `table1, table2`:表示要从中检索数据的表名。 - `UNION`:关键字,用于合并两个或多个 `SELECT` 语句的结果集。 ##### 1.2 注意事项 - 每个 `SELECT` 语句中的列数必须相同。 - 对应列的数据类型必须兼容,以便能够合并。 - `UNION` 默认去除重复行;若需包含重复行,可使用 `UNION ALL`。 - 列名是从第一个 `SELECT` 语句中获取的,因此即使后续 `SELECT` 语句的列名不同,结果集中的列名也将基于第一个 `SELECT` 语句。 #### 二、UNION 的应用场景 `UNION` 在多种场景下都能发挥其独特的作用,以下是一些常见的应用场景: ##### 2.1 跨表数据汇总 假设我们有两个表,`sales_2022` 和 `sales_2023`,分别记录了2022年和2023年的销售数据。现在,我们想要汇总这两年的销售记录到一个表中,以便进行进一步分析。 ```sql SELECT year, product_id, total_sales FROM sales_2022 UNION SELECT year, product_id, total_sales FROM sales_2023; ``` 这里,`year`、`product_id`、`total_sales` 是两个表中都存在的列,我们利用 `UNION` 将它们合并成一个大的销售记录表。 ##### 2.2 数据清洗与整合 在处理大量数据时,经常需要从不同来源整合数据。比如,我们有两个表 `user_info_a` 和 `user_info_b`,它们分别存储了用户信息的一部分,现在我们想要获取一个完整的用户信息表。 ```sql SELECT user_id, name, email FROM user_info_a UNION SELECT user_id, name, email FROM user_info_b WHERE email IS NOT NULL; -- 假设我们只想合并包含邮箱的记录 ``` 注意,这里使用了 `WHERE` 子句来过滤 `user_info_b` 表中不包含邮箱的记录,以确保合并后的数据质量。 ##### 2.3 报告生成 在生成季度或年度报告时,经常需要将多个数据表或查询结果合并为一个综合报表。比如,将第一季度、第二季度、第三季度和第四季度的销售数据合并,以展示全年销售情况。 ```sql SELECT 'Q1' AS quarter, SUM(sales) AS total_sales FROM sales_q1 UNION ALL SELECT 'Q2', SUM(sales) FROM sales_q2 UNION ALL SELECT 'Q3', SUM(sales) FROM sales_q3 UNION ALL SELECT 'Q4', SUM(sales) FROM sales_q4; ``` 这里使用了 `UNION ALL` 来保留所有结果,包括可能的重复行(在这个场景下,季度标识 `quarter` 确保了不会有真正的重复行,但保留 `UNION ALL` 可以使查询更明确其意图)。 #### 三、进阶使用:UNION 与 JOIN 的区别 虽然 `UNION` 和 `JOIN` 都可以用于合并数据,但它们的用途和场景截然不同。 - **UNION**:主要用于合并多个 `SELECT` 语句的结果集,要求每个 `SELECT` 语句的列数和列的数据类型相同,结果集是行的并集,默认去除重复行。 - **JOIN**:用于根据两个或多个表中的列之间的关系,将这些表连接起来,从而进行更复杂的查询。JOIN 操作是在表与表之间进行的,而不是在结果集之间。 #### 四、性能考虑 使用 `UNION` 时,需要注意其对性能的影响。特别是当合并的数据集非常大时,SQL 引擎需要额外的处理来去除重复行,这可能会增加查询的响应时间。因此,在可能的情况下,考虑使用 `UNION ALL`(如果不需要去除重复行)以提高性能。 此外,优化查询逻辑和索引策略也是提高 `UNION` 查询性能的重要手段。例如,确保参与合并的列上有适当的索引,可以显著加快查询速度。 #### 五、总结 `UNION` 作为SQL中强大的数据合并工具,在跨表数据汇总、数据清洗与整合、报告生成等多个方面发挥着重要作用。通过合理使用 `UNION` 和 `UNION ALL`,我们可以灵活地合并多个数据表或查询结果,以满足各种复杂的数据处理需求。然而,在使用过程中,我们也需要注意其对性能的影响,并采取适当的优化措施来确保查询的高效执行。
上一篇:
什么是集合运算
下一篇:
集合运算的注意事项
该分类下的相关小册推荐:
SQL基础教程(下)
高性能的Postgres SQL
SQL基础教程(上)
PostgreSQL入门教程