UNION是SQL中实现数据集垂直合并的操作符,用于将多个SELECT语句的结果集合并为一个结果集,同时自动去除重复行。
一、基础语法SELECT 列1, 列2... FROM 表A WHERE 条件UNION [DISTINCT | ALL]SELECT 列1, 列2... FROM 表B WHERE 条件[ORDER BY 排序字段][LIMIT 数量];语法元素:
SELECT语句:至少两个SELECT语句,必须具有相同数量的列列对应关系:每个SELECT中的相应列必须具有兼容数据类型UNION操作符:连接两个SELECT的指令去重修饰符:DISTINCT:默认值,自动去重ALL:保留所有重复行结果集控制(可选):ORDER BY:整体结果排序LIMIT:限制结果数量数据兼容性要求:数值型、字符型、日期型之间可混合使用,但二进制/BLOB类型需严格匹配
二、语法解析1. 基础结构SELECT 商品ID, 商品名称 FROM 电子产品UNIONSELECT 产品ID, 产品名称 FROM 办公用品;➤ 执行流程:
执行第一个SELECT获取电子产品数据执行第二个SELECT获取办公用品数据自动合并两个结果集消除重复行(默认DISTINCT)2. 含操作选项结构SELECT 员工号, 姓名 FROM 销售部 WHERE 入职日期 > '2020-01-01'UNION ALLSELECT 工号, 员工姓名 FROM 技术部WHERE 职级 >= 'P7'ORDER BY 员工号 DESCLIMIT 10;➤ 关键语法元素:
UNION ALL:保留重复记录ORDER BY:合并后整体排序LIMIT:限制最终输出行数3. 多表联合结构SELECT 学号, 姓名 FROM 大一学生UNIONSELECT 学生证号, 全名 FROM 大二学生UNIONSELECT 学籍号, 姓名 FROM 大三学生;➤ 链式调用规则:
从左到右顺序执行最后统一去重处理排序/限制只能放在最后三、模拟数据1. 创建电商商品表-- 电子产品表CREATE TABLE electronics ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, category VARCHAR(20), price DECIMAL(10,2), brand VARCHAR(20));-- 办公用品表CREATE TABLE office_supplies ( pid INT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50) NOT NULL, type VARCHAR(20), cost DECIMAL(10,2), manufacturer VARCHAR(20));2. 插入模拟数据-- 电子产品数据INSERT INTO electronics (name, category, price, brand) VALUES('iPhone 14', '手机', 6999.00, 'Apple'),('Galaxy S23', '手机', 5999.00, 'Samsung'),('MacBook Pro', '笔记本电脑', 12999.00, 'Apple'),('Surface Pro', '平板电脑', 8999.00, 'Microsoft'),('AirPods Pro', '耳机', 1899.00, 'Apple'),('ThinkPad X1', '笔记本电脑', 9999.00, 'Lenovo');-- 办公用品数据INSERT INTO office_supplies (product_name, type, cost, manufacturer) VALUES('Logitech鼠标', '外设', 299.00, 'Logitech'),('MX Keys键盘', '外设', 799.00, 'Logitech'),('A4打印纸', '耗材', 30.00, 'DoubleA'),('MacBook Pro', '电子产品', 12999.00, 'Apple'),('ThinkPad X1', '电子产品', 9999.00, 'Lenovo'),('惠普打印机', '设备', 1599.00, 'HP');3. 模拟数据预览electronics 表(电子产品)id
name
category
price
brand
1
iPhone 14
手机
6999.00
Apple
2
Galaxy S23
手机
5999.00
Samsung
3
MacBook Pro
笔记本电脑
12999.00
Apple
4
Surface Pro
平板电脑
8999.00
Microsoft
5
AirPods Pro
耳机
1899.00
Apple
6
ThinkPad X1
笔记本电脑
9999.00
Lenovo
office_supplies 表(办公用品)pid
product_name
type
cost
manufacturer
1
Logitech鼠标
外设
299.00
Logitech
2
MX Keys键盘
外设
799.00
Logitech
3
A4打印纸
耗材
30.00
DoubleA
4
MacBook Pro
电子产品
12999.00
Apple
5
ThinkPad X1
电子产品
9999.00
Lenovo
6
惠普打印机
设备
1599.00
HP
注意:MacBook Pro和ThinkPad X1在两个表中同时存在
四、实战示例1、基础去重合并(默认DISTINCT)-- 合并两个表的产品名称SELECT name AS 产品名称, brand AS 制造商FROM electronicsUNIONSELECT product_name, manufacturerFROM office_suppliesORDER BY 产品名称;执行过程:
获取电子表数据:6条记录获取办公用品数据:6条记录合并后总记录:10条(非12条)自动去重:MacBook Pro和ThinkPad X1各出现一次查询结果:
产品名称
制造商
A4打印纸
DoubleA
AirPods Pro
Apple
Galaxy S23
Samsung
iPhone 14
Apple
Logitech鼠标
Logitech
MacBook Pro
Apple
MX Keys键盘
Logitech
Surface Pro
Microsoft
ThinkPad X1
Lenovo
惠普打印机
HP
去重规则:比较所有字段值,完全相同才视为重复
2、保留重复记录(UNION ALL)-- 统计全平台产品(包含重复)SELECT name AS 产品, price AS 价格FROM electronicsWHERE price > 5000UNION ALLSELECT product_name, costFROM office_suppliesWHERE cost > 500ORDER BY 价格 DESC;执行过程:
电子产品筛选:price>5000 → 4条记录办公用品筛选:cost>500 → 3条记录合并总记录:7条(保留重复)查询结果:
产品
价格
MacBook Pro
12999.00
MacBook Pro
12999.00
ThinkPad X1
9999.00
Surface Pro
8999.00
ThinkPad X1
9999.00
iPhone 14
6999.00
惠普打印机
1599.00
性能提示:UNION ALL比DISTINCT快50%以上,因无需去重计算
3、多表复杂联合查询-- 统计全平台Apple产品(带类型标记)SELECT name AS 产品名称, price AS 价格, '电子产品' AS 产品类型 FROM electronicsWHERE brand = 'Apple'UNION ALLSELECT product_name, cost, '办公用品' AS 产品类型FROM office_suppliesWHERE manufacturer = 'Apple'ORDER BY 价格 DESC;执行过程:
电子表筛选Apple产品:3条记录办公用品表筛选Apple产品:1条记录添加产品类型标识列按价格降序排序查询结果:
产品名称
价格
产品类型
MacBook Pro
12999.00
电子产品
MacBook Pro
12999.00
办公用品
iPhone 14
6999.00
电子产品
AirPods Pro
1899.00
电子产品
技巧:通过增加标识列解决"相同产品不同属性"的合并需求
4、结果集分页控制-- 获取价格最高的5个产品(SELECT name, price FROM electronics)UNION ALL(SELECT product_name, cost FROM office_supplies)ORDER BY price DESCLIMIT 5;查询结果:
name
price
MacBook Pro
12999.00
MacBook Pro
12999.00
ThinkPad X1
9999.00
ThinkPad X1
9999.00
Surface Pro
8999.00
五、UNION核心机制1. 去重算法原理实现细节:基于排序的SORT-MERGE算法,时间复杂度O(n log n)
2. 所有类型转换原始类型
兼容类型
转换示例
INT
BIGINT, DECIMAL, CHAR
123 → '123'
VARCHAR
CHAR, TEXT
'text' → TEXT
DECIMAL(8,2)
FLOAT, DOUBLE
123.45 → 123.45
DATE
DATETIME, TIMESTAMP
'2023-01-01' → 时间戳
禁止转换
BINARY ↔ CHAR
二进制数据不支持自动转换
3. 排序与限制执行顺序(SELECT ... ORDER BY X LIMIT 10)UNION(SELECT ... ORDER BY Y LIMIT 5)ORDER BY Z;➤ 实际执行顺序:
分别执行两个SELECT(子ORDER BY/LIMIT有效)合并结果集应用最终ORDER BY排序应用最终LIMIT限制六、高级应用技巧1. 动态列处理技巧-- 处理列数不匹配的表SELECT name, price, category FROM electronicsUNION ALLSELECT product_name, cost, CASE WHEN type='电子产品' THEN '办公电子产品' ELSE type END -- 列转换FROM office_supplies;2. 聚合统计后合并-- 分表统计后合并结果SELECT '电子产品' AS 类型, AVG(price) AS 均价FROM electronicsUNIONSELECT '办公用品' AS 类型, AVG(cost)FROM office_supplies;输出:
类型
均价
电子产品
7479.1667
办公用品
3887.6667
3. 分页性能优化-- 高效分页方案(跳过100行取10条)SELECT * FROM ( SELECT id, name FROM tab1 UNION ALL SELECT pid, product_name FROM tab2) AS combinedORDER BY nameLIMIT 10 OFFSET 100; -- 替代低效的嵌套分页七、常见错误解决方案1. 列数不匹配错误/* 错误代码 */SELECT id, name, price FROM productsUNIONSELECT sku, product_name FROM inventory; -- 列数不一致/* 解决方案 */SELECT id, name, price FROM productsUNIONSELECT sku, product_name, NULL AS price -- 补足列数FROM inventory;2. 数据类型不兼容/* 错误代码 */SELECT 'ID:'+CAST(id AS CHAR) FROM AUNIONSELECT description FROM B; -- VARCHAR与INT混合/* 解决方案 */SELECT CAST(id AS CHAR) FROM AUNIONSELECT description FROM B;3. 性能优化方案对比场景
非优化方案
优化方案
性能提升
大数据集合并
UNION + ORDER BY
分表排序后UNION ALL
300%
分页查询
外层LIMIT/OFFSET
子查询分页后UNION
150%
去重需求
UNION DISTINCT
WHERE NOT EXISTS预过滤
200%
4. 分页性能优化示例-- 低效方案(全量排序)SELECT * FROM ( SELECT a,b FROM t1 UNION SELECT x,y FROM t2) ORDER BY a LIMIT 10 OFFSET 10000;-- 高效方案(分表预筛选)(SELECT a,b FROM t1 ORDER BY a LIMIT 10010)UNION ALL(SELECT x,y FROM t2 ORDER BY x LIMIT 10010)ORDER BY a LIMIT 10 OFFSET 10000;八、真实业务场景电商平台跨库查询-- 用户历史订单+收藏商品联合展示SELECT order_id AS id, product_name, '订单' AS 类型, create_timeFROM orders WHERE user_id = 1001UNION ALLSELECT fav_id, item_name, '收藏' AS 类型, add_timeFROM favoritesWHERE user_id = 1001ORDER BY create_time DESC;企业多系统数据整合-- 人事系统+OA系统员工数据合并SELECT emp_no AS 工号, real_name AS 姓名, '正式员工' AS 状态FROM hr_employeeWHERE status = '在职'UNIONSELECT oa_id, full_name, '外包人员'FROM oa_systemWHERE contract_end > NOW()ORDER BY 工号;总结:SQL去重联合查询UNION操作符知识点:
UNION基础语法结构与执行机制
DISTINCT/ALL选择策略与性能影响
数据类型处理与转换规则
分页排序等高级优化技巧
真实业务场景应用方案
掌握UNION操作符将使我们能应对80%以上的跨数据集合并需求!
转载请注明来自海坡下载,本文标题:《union优化(SQL去重联合查询UNION操作符的基础语法深度解析)》
京公网安备11000000000001号
京ICP备11000001号
还没有评论,来说两句吧...