在MySQL中合并多个表可以通过以下几种方法实现,具体选择取决于数据结构、是否需要去重以及性能需求:
一、使用 `UNION ALL` 合并结果集
适用于需要合并多个表且希望保留所有记录(包括重复记录)的场景。
语法:
```sql
SELECT column1, column2 FROM table1
UNION ALL
SELECT column1, column2 FROM table2
UNION ALL
SELECT column1, column2 FROM table3
...
```
注意事项:
1. 所有表的列数和数据类型必须完全一致;
2. 结果集会自动去重(默认行为),若需保留重复记录需使用 `UNION ALL`。
示例:
合并 `employees1` 和 `employees2`(假设列结构相同):
```sql
SELECT name, age FROM employees1
UNION ALL
SELECT name, age FROM employees2;
```
二、使用 `INSERT INTO ... SELECT` 复制数据
适用于将一个表的数据复制到另一个表中,可选择覆盖或追加数据。
语法:
```sql
INSERT INTO target_table (column1, column2)
SELECT column1, column2 FROM source_table;
```
若目标表已存在数据,使用 `INSERT ... SELECT` 会覆盖原有数据;
若目标表不存在,将创建新表并插入数据。
三、使用 `JOIN` 进行关联查询
适用于需要根据关联条件合并表数据的场景(如多表关联查询)。
常见类型:
内连接(INNER JOIN) :返回两个表中匹配的记录;左连接(LEFT JOIN):
返回左表所有记录,右表无匹配时填充NULL;
右连接(RIGHT JOIN):
返回右表所有记录,左表无匹配时填充NULL。
示例
查询班级表 `class` 和学生表 `student` 的关联信息:
```sql
SELECT class.name AS class_name, student.name AS student_name
FROM class
JOIN student ON class.id = student.class_id;
```
四、使用 `UNION`(去重)
与 `UNION ALL` 类似,但会自动去除重复记录。默认情况下,`UNION` 和 `UNION ALL` 的区别仅在于是否去重。
总结
保留重复记录:优先使用 `UNION ALL` 或 `INSERT INTO ... SELECT`;
去重需求:使用 `UNION`(默认)或 `UNION ALL` 显式指定;
关联数据:使用 `JOIN`(内/左/右连接)根据条件合并。
根据具体需求选择合适的方法,并注意数据类型和索引优化以提升查询效率。