概述
UNION
和 UNION ALL
都是 sql 中用于将多个 SELECT 语句的结果合并成一个结果集的操作符。它们都适用于需要将多个表或查询结果合并在一起的情况。但是它们的行为略有不同。
区别
UNION
和 UNION ALL
的区别在于,UNION
会将结果集合并成一个不含重复行的结果集,而 UNION ALL
则会保留所有的行,包括重复的行。
因为 UNION
需要去重,所以它需要对结果集进行排序和去重的操作,因此比 UNION ALL
操作要慢,并且消耗更多的系统资源。
使用方法
UNION
UNION
的基本语法如下:
SQL">SELECT column1, column2, ... FROM table1
UNION
SELECT column1, column2, ... FROM table2;
这个语句会返回从 table1
和 table2
中检索的唯一行。注意,两个查询的列数必须相同,并且对应列的数据类型也必须相同。
如果希望在结果集中保留重复的行,需要使用 UNION ALL
。
UNION ALL
UNION ALL
的基本语法如下:
SELECT column1, column2, ... FROM table1
UNION ALL
SELECT column1, column2, ... FROM table2;
这个语句会返回从 table1
和 table2
中检索的所有行,包括重复的行。
与 UNION
不同,UNION ALL
不会对结果集进行排序和去重的操作,因此比 UNION
更快,也更消耗较少的系统资源。
使用例子
以下是一些使用 UNION
和 UNION ALL
的例子。
示例1:使用 UNION 操作符
假设有两个表 employees
和 customers
,它们的结构如下:
employees
| emp_id | first_name | last_name |
|--------|------------|-----------|
| 1 | John | Smith |
| 2 | Jane | Doe |
customers
| cust_id | first_name | last_name |
|---------|------------|-----------|
| 1 | Mary | Jones |
| 2 | Bill | Smith |
如果想要将这两个表中的所有人员的名字和姓氏组合成一个唯一的列表,可以使用 UNION
操作符:
SELECT first_name, last_name FROM employees
UNION
SELECT first_name, last_name FROM customers;
这个语句会返回以下结果:
| first_name | last_name |
|------------|-----------|
| John | Smith |
| Jane | Doe |
| Mary | Jones |
| Bill | Smith |
请注意,UNION
操作符会去重结果集中的重复行,这使得查询更耗费资源和时间。如果不需要去重,请使用 UNION ALL
操作符,这样可以更快地获取结果集。
示例2:使用 UNION ALL 操作符
假设有两个表 sales
和 returns
,它们的结构如下:
sales
| sale_id | product_name | sale_date | sale_amount |
|---------|--------------|-----------|-------------|
| 1 | Product A | 2022-01-01 | 1000 |
| 2 | Product B | 2022-01-02 | 2000 |
| 3 | Product C | 2022-01-03 | 3000 |
returns
| return_id | product_name | return_date | return_amount |
|-----------|--------------|------------|---------------|
| 1 | Product A | 2022-01-05 | 100 |
| 2 | Product B | 2022-01-06 | 200 |
| 3 | Product D | 2022-01-07 | 300 |
如果想要将这两个表中的所有销售和退货记录组合成一个列表,可以使用 UNION ALL
操作符:
SELECT sale_id, product_name, sale_date, sale_amount FROM sales
UNION ALL
SELECT return_id, product_name, return_date, return_amount FROM returns;
这个语句会返回以下结果:
| id | product_name | sale_date | amount |
|-----|--------------|-----------|--------|
| 1 | Product A | 2022-01-01 | 1000 |
| 2 | Product B | 2022-01-02 | 2000 |
| 3 | Product C | 2022-01-03 | 3000 |
| 1 | Product A | 2022-01-05 | 100 |
| 2 | Product B | 2022-01-06 | 200 |
| 3 | Product D | 2022-01-07 | 300 |
请注意,这个结果集包含重复的行,因为 UNION ALL
不会去重。这使得 UNION ALL
更快,因为不需要排序和去重操作。
总结
在 SQL 查询中,UNION
和 UNION ALL
都是将多个查询结果集合并在一起的操作符。UNION
会去除结果集中的重复行,而 UNION ALL
则保留所有的行。在使用 UNION
和 UNION ALL
时需要注意,两个查询的列数必须相同,并且对应列的数据类型也必须相同。此外,如果需要去重,应该使用 UNION
;如果不需要去重,应该使用 UNION ALL
。