Oracle 数据库中,UNION ALL创建视图的利用详解

打印 上一主题 下一主题

主题 915|帖子 915|积分 2749

目次
UNION ALL 的特点
UNION ALL 的作用 
1. 合并结果集
2. 保存重复行
3. 提高性能
UNION ALL 的利用场景
1. 日记或数据拼接
2. 区分数据来源
3. 办理分区表查询
注意事项
 在创建视图中的作用
场景 1:合并多个表的数据到视图
表布局
目标
SQL 实现
解析
场景 2:合并差别类型的数据
表布局
目标
解析
场景 3:合并分区数据
表布局
目标
SQL 实现
场景 4:跨业务体系的数据合并
表布局
目标
SQL 实现
解析
场景 5:多条件动态数据组合
表布局
目标
SQL 实现
解析
总结


在 Oracle 数据库中,UNION ALL 是一种用于将多个查询的结果合并为一个结果集的 SQL 运算符。它的功能是将两个或多个查询的结果 直接合并,包括重复的行。以下是对 UNION ALL 的详细解释
  1. SELECT 列1, 列2, ...
  2. FROM 表1
  3. [WHERE 条件]
  4. UNION ALL
  5. SELECT 列1, 列2, ...
  6. FROM 表2
  7. [WHERE 条件]
复制代码
UNION ALL 的特点



  • 不去重

    • 与 UNION 差别,UNION ALL 不会去除结果会合的重复行,因此效率更高。
    • 如果必要去重,请利用 UNION。

  • 支持列数和数据类型匹配

    • 合并的各个查询必须有 雷同数量的列,且每一列的数据类型必须兼容。
    • 列的名称可以差别,但顺序和类型必须一致。

  • 执行顺序

    • UNION ALL 以查询的誊写顺序逐行合并结果,查询的顺序会直接影响最终的结果。

UNION ALL 的作用 

1. 合并结果集

UNION ALL 适合在明确不必要去重的环境下合并多个查询结果,比方:
  1. SELECT 'Apple' AS Fruit FROM DUAL
  2. UNION ALL
  3. SELECT 'Banana' AS Fruit FROM DUAL;
复制代码
结果:
  1. Fruit
  2. -----
  3. Apple
  4. Banana
复制代码
2. 保存重复行

如果数据中存在重复行,并且必要完备保存(包括重复行),可以利用 UNION ALL:
  1. SELECT 'Apple' AS Fruit FROM DUAL
  2. UNION ALL
  3. SELECT 'Apple' AS Fruit FROM DUAL;
复制代码
结果:
  1. Fruit
  2. -----
  3. Apple
  4. Apple
复制代码
与 UNION 对比:
  1. SELECT 'Apple' AS Fruit FROM DUAL
  2. UNION
  3. SELECT 'Apple' AS Fruit FROM DUAL;
复制代码
结果:
  1. Fruit
  2. -----
  3. Apple
复制代码
3. 提高性能

由于 UNION ALL 不必要去重,因此在处置惩罚大量数据时比 UNION 性能更高。
  1. SELECT employee_id, salary FROM employees
  2. WHERE department_id = 10
  3. UNION ALL
  4. SELECT employee_id, salary FROM employees
  5. WHERE department_id = 20;
复制代码
UNION ALL 的利用场景

1. 日记或数据拼接

将多张日记表的纪录合并为一个结果集:
  1. SELECT log_id, log_date, log_message FROM log_table_2023
  2. UNION ALL
  3. SELECT log_id, log_date, log_message FROM log_table_2024;
复制代码
2. 区分数据来源

通过额外的列标识数据来源:
  1. SELECT '2023年数据' AS 来源, log_id, log_message
  2. FROM log_table_2023
  3. UNION ALL
  4. SELECT '2024年数据' AS 来源, log_id, log_message
  5. FROM log_table_2024;
复制代码
3. 办理分区表查询

分区表的分区查询结果可以用 UNION ALL 合并:
  1. SELECT * FROM sales PARTITION (Q1)
  2. UNION ALL
  3. SELECT * FROM sales PARTITION (Q2);
复制代码
注意事项


  • 结果集巨细
    如果利用 UNION ALL 合并了大量重复行,大概会导致结果集变得非常巨大,占用更多的内存和存储。
  • 列的兼容性
    合并的列必要有雷同或兼容的数据类型,比方数值和字符类型不能直接混合。
  • 排序需求
    如果必要对最闭幕果排序,应在最后的结果集利用 ORDER BY:
  1. SELECT column1 FROM table1
  2. UNION ALL
  3. SELECT column1 FROM table2
  4. ORDER BY column1;
复制代码
 性能对比:UNION vs UNION ALL
特性UNIONUNION ALL是否去重是否执行速度较慢(去重耗时)较快(直接合并)内存占用较高(必要排序去重)较低(不必要排序)结果是否包含重复行否是  在创建视图中的作用

在 Oracle SQL 中,UNION ALL 可以在创建复杂视图时起到整合多个数据源的关键作用。通过合并多个查询结果并保存重复数据,UNION ALL 非常适用于必要从多张表、多个分区或差别来源数据中创建整合视图的场景。
以下是一些详细的举例和解析:
场景 1:合并多个表的数据到视图

假设有多个分区表存储了差别年份的销售数据,现在必要创建一个视图,将全部年份的销售数据整合为一个统一的视图。
表布局

每年的销售数据分别存储在以下分区表中:


  • sales_2022 (字段: sale_id, product_id, amount, sale_date)
  • sales_2023 (字段: sale_id, product_id, amount, sale_date)
目标

创建一个视图,能够统一访问全部年的销售数据。
SQL 实现

  1. CREATE OR REPLACE VIEW all_sales AS
  2. SELECT sale_id, product_id, amount, sale_date, '2022年' AS year_label
  3. FROM sales_2022
  4. UNION ALL
  5. SELECT sale_id, product_id, amount, sale_date, '2023年' AS year_label
  6. FROM sales_2023;
复制代码
查询视图数据
  1. SELECT * FROM all_sales WHERE product_id = 101;
复制代码
解析


  • 添加来源标识

    • 利用 '2022年' AS year_label 和 '2023年' AS year_label 区分数据来源。

  • 不去重

    • 由于差别年份的数据不重叠,无需去重,UNION ALL 比 UNION 更高效。

  • 动态扩展

    • 可以通过追加新的 SELECT 块来合并后续年份的数据,而不影响现有视图。


场景 2:合并差别类型的数据

假设公司有两种类型的员工纪录:

  • 正式员工存储在表 full_time_employees 中。
  • 合同工存储在表 contract_employees 中。
表布局



  • full_time_employees (字段: employee_id, name, salary, hire_date, job_type 固定为 '正式员工')
  • contract_employees (字段: employee_id, name, salary, hire_date, job_type 固定为 '合同工')
目标

创建一个统一的视图,显示全部员工的数据,包括其身份类型。
SQL 实现
  1. CREATE OR REPLACE VIEW all_employees AS
  2. SELECT employee_id, name, salary, hire_date, '正式员工' AS job_type
  3. FROM full_time_employees
  4. UNION ALL
  5. SELECT employee_id, name, salary, hire_date, '合同工' AS job_type
  6. FROM contract_employees;
复制代码
查询视图数据
  1. SELECT * FROM all_employees WHERE salary > 5000 ORDER BY hire_date;
复制代码
解析


  • 差别来源的数据整合

    • 数据源表布局类似,UNION ALL 能轻松整合差别表的数据。

  • 字段类型兼容

    • 列数和数据类型需一致,比方两个表中的 salary 均为数值类型。

  • 性能良好

    • 利用 UNION ALL 避免去重操纵,明显提拔查询速度。

场景 3:合并分区数据

假设有一个大型分区表 sales 按季度存储数据(PARTITION BY),必要创建视图合并其中的 Q1 和 Q2 数据。
表布局



  • 分区表 sales (字段: sale_id, region, amount, sale_date)

    • 分区:Q1、Q2、Q3、Q4

目标

创建视图只合并第一季度和第二季度的数据。
SQL 实现

  1. CREATE OR REPLACE VIEW sales_h1 ASSELECT * FROM sales PARTITION (Q1)
  2. UNION ALL
  3. SELECT * FROM sales PARTITION (Q2);
复制代码
 查询视图数据
  1. SELECT region, SUM(amount) AS total_sales
  2. FROM sales_h1
  3. GROUP BY region;
复制代码
 解析

  • 分区查询的整合

    • 利用 UNION ALL 按分区提取数据,避免全表扫描。

  • 优化性能

    • 分区表与 UNION ALL 配合能够高效处置惩罚特定数据的整合。

场景 4:跨业务体系的数据合并

假设一家企业的 HR 和财政体系分别存储员工的根本信息和薪资信息,现在必要创建一个视图整合这两部分数据。
表布局



  • HR 体系:hr_employees (字段: employee_id, name, department, position)
  • 财政体系:finance_employees (字段: employee_id, name, salary, pay_date)
目标

创建视图合并员工的全部信息,保存重复行以便后续分析。
SQL 实现

  1. CREATE OR REPLACE VIEW unified_employees AS
  2. SELECT employee_id, name, department, position, NULL AS salary, NULL AS pay_date
  3. FROM hr_employees
  4. UNION ALL
  5. SELECT employee_id, name, NULL AS department, NULL AS position, salary, pay_date
  6. FROM finance_employees;
复制代码
查询视图数据 
  1. SELECT employee_id, name, MAX(salary) AS max_salary
  2. FROM unified_employees
  3. WHERE name IS NOT NULL
  4. GROUP BY employee_id, name;
复制代码
解析


  • 字段对齐

    • 两个表字段不完全一致,利用 NULL 补齐不存在的列。

  • 数据整合

    • 利用 UNION ALL 合并差别体系中的数据,方便后续在统一视图中分析。

场景 5:多条件动态数据组合

假设必要将客户的订单数据按照地区和时间分别进行合并,提供给差别的业务部门利用。
表布局



  • orders (字段: order_id, customer_id, region, order_date, amount)
目标

创建视图,分别合并北方和南方地区的数据,并按年份标识来源。
SQL 实现

  1. CREATE OR REPLACE VIEW regional_orders AS
  2. SELECT order_id, customer_id, region, order_date, amount, '北方' AS region_label
  3. FROM orders
  4. WHERE region IN ('北方')
  5. UNION ALL
  6. SELECT order_id, customer_id, region, order_date, amount, '南方' AS region_label
  7. FROM orders
  8. WHERE region IN ('南方');
复制代码
查询视图数据
  1. SELECT region_label, SUM(amount) AS total_sales
  2. FROM regional_orders
  3. WHERE order_date >= TO_DATE('2024-01-01', 'YYYY-MM-DD')
  4. GROUP BY region_label;
复制代码
解析


  • 动态整合

    • 按条件动态分区和标志数据来源,方便后续业务利用。

  • 聚合分析

    • 在视图基础上进行统计分析,减少重复查询复杂性。

总结

在复杂视图的创建中,UNION ALL 的作用可以总结为以下几点:

  • 高效整合多数据源:适合合并大规模数据且无需去重的场景。
  • 动态扩展性:轻松添加新的查询来源而不破坏视图。
  • 保存数据完备性:不会丢失重复行,适合必要完备纪录的分析场景。
  • 优化性能:避免去重操纵,处置惩罚速度快,特别是对大表或分区表的整合。
在计划复杂视图时,根据实际业务需求选择是否利用 UNION ALL,结合字段对齐、动态标识等方式,使视图更灵活高效!
UNION ALL 是 Oracle SQL 中非常实用的工具,尤其在以下环境下结果最佳:


  • 不必要去重时。
  • 数据量较大且对性能要求高时。
  • 必要保存重复数据时。
如需去重,请改用 UNION。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王國慶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表