MySQL 联合查询 UNION
一、
在 MySQL 中,UNION
操作符用于合并两个或多个SELECT
语句的结果集,与使用JOIN
不同,UNION
操作符将结果集中的行进行垂直堆叠,而不是水平连接。UNION
操作符常用于从多个表中获取数据并组合成一个结果集。
二、基本语法
SELECT column1, column2, ... FROM table1 UNION SELECT column1, column2, ... FROM table2;
column1, column2, ...
: 要选择的列名。
table1
,table2
: 数据来源的表名。
三、使用示例
假设我们有两个表:employees
和contractors
,它们分别存储了公司员工和合同工的信息,我们希望获取所有人员的名字和职位。
表结构
employees 表
id | name | position |
1 | Alice | Engineer |
2 | Bob | Manager |
contractors 表
id | name | position |
3 | Charlie | Consultant |
4 | Dave | Analyst |
SQL 查询
SELECT name, position FROM employees UNION SELECT name, position FROM contractors;
结果集
name | position |
Alice | Engineer |
Bob | Manager |
Charlie | Consultant |
Dave | Analyst |
四、注意事项
1、列数必须匹配:每个SELECT
语句返回的列数必须相同。
2、数据类型必须匹配:对应位置的数据类型必须兼容。
3、默认去重:UNION
默认会去除重复的行,如果需要保留重复行,可以使用UNION ALL
。
4、排序:可以在最后一个SELECT
语句后添加ORDER BY
子句,以对整个结果集进行排序。
五、使用 UNION ALL
UNION ALL
与UNION
类似,但它不会去除重复的行,适用于明确知道不会有重复数据的情况,可以提高查询性能。
SELECT name, position FROM employees UNION ALL SELECT name, position FROM contractors;
六、复杂查询示例
假设我们需要从三个表中获取数据:full_time_employees
、part_time_employees
和interns
,我们希望获取所有人员的名字、职位和工作状态。
表结构
full_time_employees 表
id | name | position | status |
1 | Alice | Engineer | FullTime |
2 | Bob | Manager | FullTime |
part_time_employees 表
id | name | position | status |
3 | Charlie | Consultant | PartTime |
4 | Dave | Analyst | PartTime |
interns 表
id | name | position | status |
5 | Eve | Intern | Intern |
6 | Frank | Trainee | Intern |
SQL 查询
SELECT name, position, status FROM full_time_employees UNION SELECT name, position, status FROM part_time_employees UNION SELECT name, position, status FROM interns;
结果集
name | position | status |
Alice | Engineer | FullTime |
Bob | Manager | FullTime |
Charlie | Consultant | PartTime |
Dave | Analyst | PartTime |
Eve | Intern | Intern |
Frank | Trainee | Intern |
七、性能优化建议
1、索引:确保参与UNION
的列上有适当的索引,以提高查询性能。
2、LIMIT:在每个SELECT
语句中使用LIMIT
,以减少临时结果集的大小。
3、避免大数据集:尽量避免对非常大的数据集使用UNION
,因为它可能会导致内存不足或查询超时。
4、分页:对于大量数据,考虑使用分页技术来逐步获取数据。
八、常见问题与解答
问题1:如何在UNION
结果集中进行排序?
答:可以在最后一个SELECT
语句后面添加ORDER BY
子句,以对整个结果集进行排序。
SELECT name, position, status FROM full_time_employees UNION SELECT name, position, status FROM part_time_employees UNION SELECT name, position, status FROM interns ORDER BY name;
这将根据名字对整个结果集进行排序。
问题2:如何确保UNION
结果集中不包含重复行?
答:默认情况下,UNION
会自动去除重复的行,如果你希望保留重复行,可以使用UNION ALL
。
SELECT name, position, status FROM full_time_employees UNION ALL SELECT name, position, status FROM part_time_employees;
这将保留所有重复的行。
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/91155.html