温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SQL中UNION关键字怎么用

发布时间:2022-03-03 14:32:04 来源:亿速云 阅读:306 作者:小新 栏目:数据库
# SQL中UNION关键字怎么用 ## 1. UNION概述 ### 1.1 什么是UNION UNION是SQL中用于合并两个或多个SELECT语句结果集的操作符。它能够将多个查询结果垂直堆叠成一个单一的结果集,同时自动去除重复行(除非使用UNION ALL)。 ### 1.2 UNION的主要特点 - **结果集合并**:将多个SELECT语句的结果合并为一个结果集 - **列数相同**:所有SELECT语句必须有相同数量的列 - **数据类型兼容**:对应列的数据类型必须兼容 - **默认去重**:UNION会自动去除重复行(UNION ALL保留重复行) - **排序应用**:ORDER BY子句只能出现在最后一个SELECT语句后 ## 2. 基本语法结构 ```sql SELECT column1, column2, ... FROM table1 UNION [ALL] SELECT column1, column2, ... FROM table2 [UNION [ALL] SELECT column1, column2, ... FROM table3] ... [ORDER BY column1, column2, ...]; 

2.1 语法说明

  • UNION:合并结果集并去除重复行
  • UNION ALL:合并结果集但保留重复行
  • ORDER BY:对整个合并后的结果集进行排序(只能出现在最后)

3. UNION的使用方法

3.1 基本使用示例

假设我们有两个表:employees_eastemployees_west,结构相同,都包含员工信息。

-- 合并东西部员工表,去除重复 SELECT employee_id, name, department FROM employees_east UNION SELECT employee_id, name, department FROM employees_west; 

3.2 使用UNION ALL保留重复行

-- 合并结果并保留所有记录(包括重复的) SELECT product_id, product_name FROM current_products UNION ALL SELECT product_id, product_name FROM discontinued_products; 

3.3 多表UNION操作

-- 合并三个地区的销售数据 SELECT sale_id, amount, sale_date FROM north_sales UNION SELECT sale_id, amount, sale_date FROM east_sales UNION SELECT sale_id, amount, sale_date FROM south_sales; 

4. UNION的注意事项

4.1 列数和数据类型要求

所有SELECT语句必须有相同数量的列,且对应列的数据类型必须兼容:

-- 错误的UNION使用(列数不同) SELECT id, name, salary FROM employees UNION SELECT id, name FROM contractors; -- 报错 -- 正确的UNION使用 SELECT id, name, NULL AS salary FROM contractors UNION SELECT id, name, salary FROM employees; 

4.2 列名和别名处理

UNION结果集的列名取自第一个SELECT语句的列名或别名:

-- 结果集列名为employee_id和full_name SELECT emp_id AS employee_id, emp_name AS full_name FROM staff UNION SELECT person_id, CONCAT(first_name, ' ', last_name) FROM contractors; 

4.3 排序处理

ORDER BY只能出现在最后一个SELECT语句后,作用于整个结果集:

-- 正确排序方式 SELECT product_id, product_name FROM active_products UNION SELECT product_id, product_name FROM inactive_products ORDER BY product_name; 

5. UNION与UNION ALL的性能比较

5.1 去重操作的开销

  • UNION:需要执行去重操作,对大数据集可能很耗资源
  • UNION ALL:直接拼接结果,性能更好

5.2 使用场景建议

  • 当确定结果没有重复或需要保留重复时,使用UNION ALL
  • 当需要去除重复记录时,使用UNION
-- 性能对比示例 -- 较慢(需要去重) SELECT customer_id FROM online_orders UNION SELECT customer_id FROM in_store_orders; -- 较快(已知没有重复或需要保留重复) SELECT customer_id FROM online_orders UNION ALL SELECT customer_id FROM in_store_orders; 

6. 高级UNION技巧

6.1 使用UNION实现PIVOT效果

-- 使用UNION模拟数据透视表 SELECT 'Q1' AS quarter, SUM(q1_sales) AS total_sales FROM sales_data UNION SELECT 'Q2', SUM(q2_sales) FROM sales_data UNION SELECT 'Q3', SUM(q3_sales) FROM sales_data UNION SELECT 'Q4', SUM(q4_sales) FROM sales_data; 

6.2 结合CASE WHEN使用

-- 分类统计 SELECT 'High Salary' AS category, COUNT(*) AS count FROM employees WHERE salary > 100000 UNION SELECT 'Medium Salary', COUNT(*) FROM employees WHERE salary BETWEEN 50000 AND 100000 UNION SELECT 'Low Salary', COUNT(*) FROM employees WHERE salary < 50000; 

6.3 与聚合函数配合

-- 合并不同粒度的统计数据 SELECT 'Department' AS level, department, AVG(salary) AS avg_salary FROM employees GROUP BY department UNION SELECT 'Company', NULL, AVG(salary) FROM employees; 

7. UNION与其他操作符的区别

7.1 UNION vs JOIN

特性 UNION JOIN
操作方向 垂直合并(行) 水平合并(列)
结果结构 相同列结构 扩展列结构
重复处理 默认去重 保留所有数据

7.2 UNION vs UNION ALL

特性 UNION UNION ALL
重复处理 去除重复行 保留所有行
性能 较慢(需排序) 较快
结果集大小 ≤输入集总和 =输入集总和

8. 实际应用案例

8.1 合并多表相似数据

-- 合并客户数据(来自不同系统) SELECT customer_id, name, email, 'SystemA' AS source FROM system_a_customers UNION SELECT client_id, full_name, email_address, 'SystemB' FROM system_b_clients; 

8.2 创建综合报表

-- 生成月度综合报表 SELECT 'January' AS month, SUM(amount) AS total FROM sales WHERE sale_date BETWEEN '2023-01-01' AND '2023-01-31' UNION SELECT 'February', SUM(amount) FROM sales WHERE sale_date BETWEEN '2023-02-01' AND '2023-02-28' -- ...其他月份... ORDER BY total DESC; 

8.3 数据清洗与转换

-- 标准化不同格式的联系人数据 SELECT id, LOWER(TRIM(email)) AS standardized_email, REGEXP_REPLACE(phone, '[^0-9]', '') AS cleaned_phone FROM contacts_primary UNION ALL SELECT contact_id, LOWER(email_address), REPLACE(REPLACE(phone_number, '-', ''), ' ', '') FROM secondary_contacts; 

9. 各数据库系统中的UNION

9.1 MySQL中的UNION

  • 支持UNION和UNION ALL
  • 默认不区分大小写去重
  • 可以使用LIMIT限制结果
(SELECT * FROM table1 LIMIT 10) UNION (SELECT * FROM table2 LIMIT 10) LIMIT 15; 

9.2 SQL Server中的UNION

  • 支持UNION和UNION ALL
  • 可以使用TOP限制行数
  • 支持UNION与EXCEPT/INTERSECT组合
SELECT TOP 5 * FROM products1 UNION SELECT TOP 5 * FROM products2; 

9.3 Oracle中的UNION

  • 支持UNION和UNION ALL
  • 可以使用ROWNUM限制结果
  • 对LOB数据类型有特殊限制
SELECT * FROM ( SELECT * FROM table1 WHERE ROWNUM <= 100 UNION SELECT * FROM table2 WHERE ROWNUM <= 100 ) WHERE ROWNUM <= 150; 

10. 常见错误与解决方案

10.1 列数不匹配错误

错误示例

SELECT id, name, salary FROM employees UNION SELECT id, name FROM contractors; -- 列数不同 

解决方案

SELECT id, name, salary FROM employees UNION SELECT id, name, NULL AS salary FROM contractors; 

10.2 数据类型不兼容错误

错误示例

SELECT id, name, CAST(salary AS VARCHAR) FROM employees UNION SELECT id, name, hire_date FROM employees; -- 第三列类型不匹配 

解决方案

SELECT id, name, CAST(salary AS VARCHAR) FROM employees UNION SELECT id, name, TO_CHAR(hire_date, 'YYYY-MM-DD') FROM employees; 

10.3 错误放置ORDER BY

错误示例

SELECT * FROM table1 ORDER BY col1 UNION SELECT * FROM table2; -- ORDER BY不能出现在第一个SELECT后 

正确写法

SELECT * FROM table1 UNION SELECT * FROM table2 ORDER BY col1; 

11. 性能优化建议

  1. 优先使用UNION ALL:除非确实需要去重
  2. 减少UNION操作数量:合并多个UNION为单个查询
  3. 添加适当索引:特别是在UNION列上
  4. 限制结果集大小:使用WHERE条件或LIMIT/TOP
  5. 考虑临时表:对复杂UNION操作可考虑使用临时表
-- 优化示例:使用WHERE减少UNION数据量 SELECT id, name FROM large_table1 WHERE status = 'active' UNION SELECT id, name FROM large_table2 WHERE is_valid = 1; 

12. 总结

UNION是SQL中强大的数据合并工具,掌握其使用方法可以:

  1. 整合分散在不同表中的相似数据
  2. 创建综合报表和统计分析
  3. 实现数据清洗和标准化
  4. 构建更复杂的查询逻辑

关键要点: - 理解UNION和UNION ALL的区别 - 确保列数和数据类型兼容 - 注意性能影响,特别是大数据集 - 合理使用排序和限制条件

通过本文的详细讲解和丰富示例,您应该已经全面掌握了SQL中UNION关键字的使用方法和最佳实践。 “`

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI