MySQL UNION 操作(附带实例)
在 MySQL 中,UNION 操作符用于将多个 SELECT 查询的结果合并成一个结果集。它可以将来自多个表或多个查询的结果按行拼接起来。默认情况下,UNION 会去除重复的记录,如果你想保留重复的记录,可以使用 UNION ALL。
1. UNION 操作符的基本语法
SELECT column1, column2, ...
FROM table1
WHERE condition
UNION
SELECT column1, column2, ...
FROM table2
WHERE condition;
SELECT column1, column2, ...:你要从表中选取的列。FROM table1, table2:你要查询的表。WHERE condition:查询条件,限制你要返回的数据。
2. UNION 的使用规则
- 所有的
SELECT查询必须返回相同数量的列,并且每列的顺序和数据类型必须兼容。 - 默认情况下,
UNION会删除重复的记录。如果你希望保留重复记录,应该使用UNION ALL。
3. 实例:UNION 操作符的使用
假设你有两个表:employees 和 managers,它们都有相同的字段结构:id, name, 和 position。
示例 1:使用 UNION 合并来自不同表的数据
SELECT id, name, position FROM employees
UNION
SELECT id, name, position FROM managers;
- 这个查询将从
employees表和managers表中获取id,name, 和position字段的记录,并将它们合并到一个结果集中。结果将去除重复的记录。
示例 2:使用 UNION ALL 保留重复的记录
SELECT id, name, position FROM employees
UNION ALL
SELECT id, name, position FROM managers;
- 这个查询与上面的查询类似,但会保留重复的记录。如果
employees表和managers表中有相同的id,name, 和position组合,UNION ALL会返回它们。
4. UNION 与排序
你可以在 UNION 查询结果的最后使用 ORDER BY 来排序整个结果集。注意,ORDER BY 只能出现在 UNION 查询的最后一个部分,而不能出现在单个 SELECT 查询中。
示例 3:使用 ORDER BY 对合并结果进行排序
SELECT id, name, position FROM employees
UNION
SELECT id, name, position FROM managers
ORDER BY name ASC;
- 这个查询将根据
name字段按升序对结果进行排序。
5. UNION 与 LIMIT
如果你希望限制返回的记录数,可以使用 LIMIT 子句,但要注意 LIMIT 只能限制整个 UNION 查询结果的记录数,而不能单独限制每个 SELECT 子查询的结果。
示例 4:对 UNION 查询结果使用 LIMIT
SELECT id, name, position FROM employees
UNION
SELECT id, name, position FROM managers
LIMIT 10;
- 这个查询将合并来自
employees和managers表的记录,并只返回前 10 条记录。
6. UNION 与 JOIN 的比较
UNION 和 JOIN 都可以用于合并多个表的数据,但它们的工作方式不同:
UNION合并多个查询的结果集,返回的行是不同查询的拼接。JOIN通过基于共同字段连接多个表,返回的是跨表的联合数据。
示例 5:JOIN 与 UNION 的区别
假设有两个表:employees 和 departments,并且你想要获取员工及其部门的信息。
- 使用
JOIN:
SELECT employees.name, employees.position, departments.department_name
FROM employees
JOIN departments ON employees.department_id = departments.id;
- 使用
UNION(假设你有不同的查询,想合并它们):
SELECT name, position FROM employees
UNION
SELECT name, position FROM managers;
JOIN用于根据某个公共字段(如department_id)将表连接在一起,返回跨表的数据。UNION用于合并来自不同查询的结果集,行之间没有直接关系。
7. 注意事项
- 列的数量与数据类型:
UNION的每个查询返回的列数和数据类型必须相同。否则,MySQL 会报错。 - 默认去重:
UNION会去除重复的记录。如果你希望保留重复记录,可以使用UNION ALL。 - 排序与分页:
ORDER BY和LIMIT应放在UNION查询的最后部分。ORDER BY会对整个结果集进行排序,而不是单独的查询。
总结
UNION用于将多个SELECT查询的结果合并成一个结果集,默认去除重复记录。UNION ALL用于将多个查询的结果合并并保留重复记录。UNION查询可以使用ORDER BY来对合并的结果进行排序,并使用LIMIT来限制返回的记录数。UNION和JOIN的使用场景不同,UNION用于合并查询结果,JOIN用于跨表连接数据。