SQL 合并
1. 引言
在日常的数据库操作中,我们经常需要对不同的表进行合并操作。合并是将两个或多个表中的数据合并为一个结果集的过程,合并操作可以极大地方便我们对数据进行整理和分析。在SQL中,提供了多种合并操作的方法和语句,本文将详细介绍这些方法和语句的使用。
2. UNION 操作
UNION操作是将两个或多个查询的结果合并为一个结果集的操作。合并的结果集中不包含重复的记录,只包含在所有查询结果中出现的记录。
2.1 UNION的基本语法
SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;
2.2 UNION的示例
假设我们有两个表students1
和students2
,它们的结构如下:
表students1
:
id | name | age
---+---------+-----
1 | Alice | 20
2 | Bob | 18
3 | Charlie | 22
表students2
:
id | name | age
---+--------+-----
4 | Danny | 19
5 | Eve | 21
我们可以使用UNION操作将两个表合并为一个结果集:
SELECT id, name, age
FROM students1
UNION
SELECT id, name, age
FROM students2;
合并结果如下:
id | name | age
---+---------+-----
1 | Alice | 20
2 | Bob | 18
3 | Charlie | 22
4 | Danny | 19
5 | Eve | 21
3. UNION ALL 操作
UNION ALL操作与UNION类似,也是将多个查询结果合并为一个结果集。但不同的是,UNION ALL不会去除重复记录,将所有记录都包含在结果集中。
3.1 UNION ALL 的基本语法
SELECT column1, column2, ...
FROM table1
UNION ALL
SELECT column1, column2, ...
FROM table2;
3.2 UNION ALL 的示例
我们继续使用之前的students1
和students2
表进行示例。与之前不同的是,这次我们使用UNION ALL操作:
SELECT id, name, age
FROM students1
UNION ALL
SELECT id, name, age
FROM students2;
合并结果如下:
id | name | age
---+---------+-----
1 | Alice | 20
2 | Bob | 18
3 | Charlie | 22
4 | Danny | 19
5 | Eve | 21
注意到这次结果集中包含了重复的记录。
4. 使用 UNION 进行排序
在进行 UNION 操作时,可以使用 ORDER BY 子句对结果集进行排序。
4.1 使用 UNION 进行排序的基本语法
SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2
ORDER BY column1, column2, ...;
4.2 使用 UNION 进行排序的示例
我们继续使用之前的students1
和students2
表进行示例,并假设我们希望按照age
字段进行升序排序:
SELECT id, name, age
FROM students1
UNION
SELECT id, name, age
FROM students2
ORDER BY age;
排序结果如下:
id | name | age
---+---------+-----
2 | Bob | 18
4 | Danny | 19
1 | Alice | 20
5 | Eve | 21
3 | Charlie | 22
5. 使用UNION合并不同结构的表
在进行UNION操作时,被合并的表并不一定要有相同的字段数目和字段类型,只需要保证字段在相应位置上的数据类型兼容即可。
5.1 使用UNION合并不同结构的表的示例
假设我们有两个不同结构的表students
和teachers
:
表students
:
id | name | age
---+---------+-----
1 | Alice | 20
2 | Bob | 18
3 | Charlie | 22
表teachers
:
id | name | subject
---+-------+--------
4 | Danny | Math
5 | Eve | English
我们可以使用UNION操作将这两个表合并为一个结果集:
SELECT id, name, age, NULL AS subject
FROM students
UNION
SELECT id, name, NULL AS age, subject
FROM teachers;
合并结果如下:
id | name | age | subject
---+---------+-----+---------
1 | Alice | 20 | NULL
2 | Bob | 18 | NULL
3 | Charlie | 22 | NULL
4 | Danny | NULL| Math
5 | Eve | NULL| English
注意到在合并结果中,字段age
在teachers
表中为空,字段subject
在students
表中为空。
6. INTERSECT 操作
INTERSECT操作用于获取多个查询结果的交集。交集是指同时在所有查询结果中出现的记录。
6.1 INTERSECT的基本语法
SELECT column1, column2, ...
FROM table1
INTERSECT
SELECT column1, column2, ...
FROM table2;
6.2 INTERSECT的示例
为了演示INTERSECT的使用,我们创建两个表numbers1
和numbers2
,它们的结构如下:
表numbers1
:
num
---
1
2
3
4
表numbers2
:
num
---
3
4
5
6
我们可以使用INTERSECT操作获取这两个表的交集:
SELECT num
FROM numbers1
INTERSECT
SELECT num
FROM numbers2;
交集结果如下:
num
---
3
4
7. EXCEPT 操作
EXCEPT操作用于从第一个查询结果中排除在其他查询结果中出现的记录。
7.1 EXCEPT的基本语法
SELECT column1, column2, ...
FROM table1
EXCEPT
SELECT column1, column2, ...
FROM table2;
7.2 EXCEPT的示例
继续使用之前的numbers1
和numbers2
表,我们可以使用EXCEPT操作获取这两个表的差集:
SELECT num
FROM numbers1
EXCEPT
SELECT num
FROM numbers2;
差集结果如下:
num
---
1
2
注意到这次结果集中仅包含在numbers1
表中出现的记录。
8. 结论
本文介绍了SQL中常用的合并操作和相应的语句。通过这些合并操作,我们可以方便地将多个表的数据合并为一个结果集,进行数据整理和分析。主要介绍了以下内容:
- UNION操作:将多个查询的结果合并为一个结果集,去除重复记录。
- UNION ALL操作:将多个查询的结果合并为一个结果集,包含重复记录。
- 使用UNION进行排序:在进行UNION操作时,可以使用ORDER BY子句对结果集进行排序。
- 使用UNION合并不同结构的表:合并不同结构的表时,只需要保证字段在相应位置上的数据类型兼容即可。
- INTERSECT操作:获取多个查询结果的交集,即同时在所有查询结果中出现的记录。
- EXCEPT操作:从第一个查询结果中排除在其他查询结果中出现的记录,获取差集。
这些合并操作在实际的数据库查询中非常有用,可以帮助我们提取出需要的数据,进行汇总和分析。当我们需要合并多个表的数据时,可以根据实际需求选择合适的操作进行处理。