SQL中的UNION和UNION ALL的区别及用法详解、“提高SQL查询效率:UNION和UNION ALL的比较、使用实例详解SQL中的UNION和UNION ALL操作符
作者:mmseoamin日期:2023-12-05

概述

UNION 和 UNION ALL 都是 SQL 中用于将多个 SELECT 语句的结果合并成一个结果集的操作符。它们都适用于需要将多个表或查询结果合并在一起的情况。但是它们的行为略有不同。

区别

UNION 和 UNION ALL 的区别在于,UNION 会将结果集合并成一个不含重复行的结果集,而 UNION ALL 则会保留所有的行,包括重复的行。

因为 UNION 需要去重,所以它需要对结果集进行排序和去重的操作,因此比 UNION ALL 操作要慢,并且消耗更多的系统资源。

使用方法

UNION

UNION 的基本语法如下:

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。