跳到主要内容

MySQL 联合查询

在MySQL中,联合查询(UNION)是一种将多个SELECT语句的结果集合并为一个结果集的操作。联合查询通常用于从多个表中提取数据,并将这些数据组合成一个统一的视图。本文将详细介绍联合查询的语法、使用场景以及注意事项。

什么是联合查询?

联合查询允许你将两个或多个SELECT语句的结果集合并为一个结果集。每个SELECT语句的结果集必须具有相同的列数,并且列的数据类型必须兼容。联合查询的结果集会自动去除重复的行,除非你使用UNION ALL来保留重复行。

基本语法

sql
SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;
  • UNION:用于合并两个或多个SELECT语句的结果集,并去除重复行。
  • UNION ALL:用于合并两个或多个SELECT语句的结果集,但保留所有行,包括重复行。

联合查询的使用场景

联合查询在以下场景中非常有用:

  1. 合并多个表的数据:当你需要从多个表中提取数据并将它们合并为一个结果集时。
  2. 去除重复数据:当你需要从多个查询中去除重复的行时。
  3. 简化复杂查询:当你需要将多个查询的结果集合并为一个结果集时,可以使用联合查询来简化查询逻辑。

代码示例

假设我们有两个表:employeescontractors,它们分别存储了公司员工和合同工的信息。我们希望将这两个表中的员工姓名合并为一个列表。

表结构

sql
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100)
);

CREATE TABLE contractors (
id INT PRIMARY KEY,
name VARCHAR(100)
);

插入数据

sql
INSERT INTO employees (id, name) VALUES (1, 'Alice'), (2, 'Bob');
INSERT INTO contractors (id, name) VALUES (1, 'Charlie'), (2, 'Alice');

使用联合查询

sql
SELECT name FROM employees
UNION
SELECT name FROM contractors;

输出结果

+---------+
| name |
+---------+
| Alice |
| Bob |
| Charlie |
+---------+

在这个例子中,Alice在两个表中都出现了,但由于我们使用了UNION,结果集中只保留了一个Alice

使用UNION ALL

如果我们希望保留重复的行,可以使用UNION ALL

sql
SELECT name FROM employees
UNION ALL
SELECT name FROM contractors;

输出结果

+---------+
| name |
+---------+
| Alice |
| Bob |
| Charlie |
| Alice |
+---------+

在这个例子中,Alice出现了两次,因为我们使用了UNION ALL

实际应用场景

场景1:合并销售数据

假设我们有两个表:online_salesoffline_sales,分别存储了在线销售和线下销售的数据。我们希望将这两个表中的销售数据合并为一个结果集。

sql
SELECT product_id, quantity, sale_date FROM online_sales
UNION
SELECT product_id, quantity, sale_date FROM offline_sales;

场景2:合并用户数据

假设我们有两个表:active_usersinactive_users,分别存储了活跃用户和非活跃用户的信息。我们希望将这两个表中的用户数据合并为一个结果集。

sql
SELECT user_id, username, email FROM active_users
UNION
SELECT user_id, username, email FROM inactive_users;

注意事项

  1. 列数和数据类型:每个SELECT语句的列数和数据类型必须相同或兼容。
  2. 排序:如果需要对联合查询的结果进行排序,可以在最后一个SELECT语句后添加ORDER BY子句。
  3. 性能:联合查询可能会影响查询性能,尤其是在处理大量数据时。使用UNION ALL可以提高性能,因为它不需要去除重复行。

总结

联合查询是MySQL中一个非常有用的工具,它允许你将多个SELECT语句的结果集合并为一个结果集。通过使用UNIONUNION ALL,你可以灵活地处理数据,并根据需要去除或保留重复行。在实际应用中,联合查询可以帮助你简化复杂的查询逻辑,并提高数据处理的效率。

附加资源

练习

  1. 创建两个表table1table2,分别插入一些数据,然后使用联合查询将这两个表的数据合并为一个结果集。
  2. 修改上述查询,使用UNION ALL来保留重复行,并观察结果。
  3. 尝试在联合查询中使用ORDER BY对结果集进行排序。

通过完成这些练习,你将更好地理解联合查询的使用方法和应用场景。