UNION操作用于合并多个SELECT结果集,要求列数相同、数据类型兼容,UNION默认去重而UNION ALL保留所有行,后者性能更高;常见于整合分散数据源或跨表查询,需注意性能损耗、隐式转换风险及列顺序匹配问题。

SQL的
UNION
SELECT
UNION
UNION
UNION
SELECT
SELECT
SELECT
INT
BIGINT
INT
VARCHAR
默认情况下,
UNION
UNION DISTINCT
UNION ALL
基本语法:
SELECT column1, column2, ... FROM table1 WHERE condition1 UNION [ALL | DISTINCT] SELECT column1, column2, ... FROM table2 WHERE condition2;
示例:
假设我们有两张表,
employees_hr
employees_it
id
name
-- 合并两个部门的员工列表,并去除重复的员工(如果ID、姓名、邮箱都相同) SELECT id, name, email FROM employees_hr UNION SELECT id, name, email FROM employees_it; -- 合并所有员工列表,即使有重复也全部显示 SELECT id, name, email FROM employees_hr UNION ALL SELECT id, name, email FROM employees_it;
需要注意的是,最终结果集的列名通常会沿用第一个
SELECT
这是
UNION
UNION DISTINCT
UNION
UNION ALL
UNION DISTINCT
UNION
UNION DISTINCT
UNION
UNION ALL
SELECT
SELECT
UNION ALL
UNION DISTINCT
sales_2022
sales_2023
UNION ALL
UNION ALL
总结: 我个人的经验是,在不确定或者对性能要求不高的情况下,
UNION DISTINCT
UNION ALL
UNION ALL
确保
UNION
1. 列数的一致性:
这是最基础的。如果列数不一致,数据库会直接抛出错误。所以,在写
UNION
SELECT
-- 错误示例:列数不一致 SELECT id, name FROM table1 UNION ALL SELECT id, name, email FROM table2; -- 会报错
2. 数据类型的兼容性与显式转换:
虽然数据库会尝试隐式转换(例如将
INT
VARCHAR
检查数据类型: 在开始编写
UNION
使用 CAST()
CONVERT()
CAST()
CONVERT()
-- 示例:一个表存储了用户ID为INT,另一个表存储了用户ID为VARCHAR,需要统一 SELECT CAST(user_id AS VARCHAR(50)) AS user_identifier, user_name FROM users_int_id UNION ALL SELECT user_id, user_name FROM users_users_varchar_id; -- 示例:一个表存储了日期为DATETIME,另一个存储为DATE,需要统一 SELECT order_id, CAST(order_datetime AS DATE) AS order_date FROM orders_full_time UNION ALL SELECT order_id, order_date FROM orders_only_date;
3. 列的顺序:
UNION
SELECT
SELECT
UNION
-- 示例:列名不同但顺序和类型兼容 SELECT product_id, product_name FROM products_a UNION ALL SELECT item_id, item_description FROM products_b; -- 结果集中,item_id会作为product_id列,item_description作为product_name列
4. 处理不同数量的“逻辑”列:
有时候,你可能需要合并的表在逻辑上是相似的,但其中一张表比另一张表多了一些你不需要的列,或者少了一些你需要的列。这时,可以通过选择性地使用
NULL
-- 示例:一个表有地址信息,另一个没有,但我们想在合并结果中显示一个统一的地址列 SELECT customer_id, customer_name, address, city FROM customers_with_address UNION ALL SELECT customer_id, customer_name, NULL AS address, NULL AS city -- 使用NULL填充缺失的列 FROM customers_without_address; -- 示例:合并不同类型的事件日志,但希望有一个统一的事件类型列 SELECT log_time, 'Login' AS event_type, user_id, ip_address FROM login_logs UNION ALL SELECT log_time, 'Purchase' AS event_type, user_id, product_id FROM purchase_logs;
这些技巧能帮助我在面对各种复杂场景时,依然能灵活且正确地运用
UNION
在我的工作经历中,
UNION
常见的应用场景:
UNION ALL
-- 合并不同区域的销售订单 SELECT order_id, customer_id, total_amount, 'North' AS region FROM sales_north UNION ALL SELECT order_id, customer_id, total_amount, 'South' AS region FROM sales_south;
UNION
active_users
inactive_users
-- 查找所有用户(无论活跃与否)的特定信息 SELECT user_id, user_name, email FROM active_users WHERE user_name LIKE '%John%' UNION SELECT user_id, user_name, email FROM inactive_users WHERE user_name LIKE '%John%';
UNION
-- 结合不同条件的客户列表:既是VIP又是活跃的,或者是新注册的 SELECT customer_id, customer_name, 'VIP_Active' AS status FROM customers WHERE is_vip = TRUE AND is_active = TRUE UNION ALL SELECT customer_id, customer_name, 'New_Registered' AS status FROM customers WHERE registration_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY);
logs_2022
logs_2023
UNION ALL
潜在的陷阱和挑战:
UNION DISTINCT
UNION
UNION DISTINCT
UNION ALL
VARCHAR
INT
NULL
UNION
SELECT
SELECT
SELECT
JOIN
UNION
JOIN
UNION
JOIN
JOIN
UNION
UNION
UNION
SELECT
SELECT
UNION
SELECT
总的来说,
UNION
UNION DISTINCT
UNION ALL
以上就是SQL的UNION操作有何作用?合并查询结果的正确方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号