目录
[UNION ALL](#UNION ALL)
定义
组合查询指将两个或多个SELECT语句的结果集合并为一个结果集返回。
适用场景
从不同表中返回结构相同的数据。
对同一个表执行多个查询,并将结果合并为一个结果集返回。
UNION
语法:在多条独立的SELECT语句之间,用关键字UNION连接。
要求:查询所有来自北京市和上海市的客户信息,合并为一个结果集
sql
SELECT cust_id, cust_name, cust_address
FROM customers
WHERE cust_address LIKE '北京市%'
UNION
SELECT cust_id, cust_name, cust_address
FROM customers
WHERE cust_address LIKE '上海市%';
等价的OR写法:
sql
SELECT cust_id, cust_name, cust_address
FROM customers
WHERE cust_address LIKE '北京市%'
OR cust_address LIKE '上海市%';
OR只适用于同一张表的多条件筛选,UNION作用是合并不同查询的结果集
OR 是条件判断,UNION 是结果合并
UNION的规则是多个被合并的 SELECT 语句,必须返回相同数量的列,并且对应列的数据类型要兼容。字段名可以不同,最终结果集会以第一个SELECT的字段名为准。
要求:现在需要一份完整的联系人列表,既包含客户的电话和邮箱,也包含供应商的电话和地址。
sql
SELECT
cust_id AS id,
cust_name AS name,
cust_phone AS contact_info,
'客户' AS type
FROM customers
UNION
SELECT
vend_id,
vend_name,
vend_phone,
'供应商'
FROM vendors;
UNION ALL
要求:现在需要对比商品的标价(来自 products 表)和实际成交价(来自 orderItems 表)。同一个商品可能有多次成交,需要看到所有的成交记录。
sql
SELECT
prod_id,
prod_name,
prod_price AS price,
'标价' AS price_type
FROM products
UNION ALL
SELECT
oi.prod_id,
p.prod_name,
oi.item_price AS price,
'成交价' AS price_type
FROM orderItems oi
JOIN products p ON oi.prod_id = p.prod_id;
区别
| 特性 | UNION | UNION ALL |
|---|---|---|
| 去重 | 自动对合并后的结果集进行去重 | 直接合并所有结果,不进行去重 |
| 性能 | 较慢 | 更快 |
| 适用场景 | 需要合并结果并确保无重复数据时 | 确定无重复数据,或需要保留重复数据时 |