在 SQL 中,UNION
操作符是一个非常强大的工具,它允许我们将多条SELECT
语句的结果组合成一个单一的结果集。这在很多实际应用场景中都非常有用,比如整合来自不同表但具有相似结构的数据,或者从同一个表中按照不同条件查询数据并将结果合并。
一、UNION
操作符的基本语法
UNION
操作符的基本语法如下:
SELECT column1, column2, column3 FROM table1
UNION
SELECT column1, column2, column3 FROM table2;
在这个语法中,我们首先有一条SELECT
语句从table1
中选择特定的列(column1
,column2
,column3
),然后使用UNION
操作符连接另一条从table2
中选择相同列的SELECT
语句。
二、UNION
操作符的规则和注意事项
1. 列数和数据类型匹配
- 列数必须相同:在使用
UNION
时,被组合的SELECT
语句所选择的列数必须相同。例如,如果第一条SELECT
语句选择了 3 列,那么第二条SELECT
语句也必须选择 3 列。 - 数据类型兼容:相应位置的列的数据类型应该是兼容的。虽然不需要完全相同,但必须能够进行隐式转换。例如,可以将
INT
类型和DECIMAL
类型的列进行UNION
操作,因为它们在数值上是兼容的。
2. 去除重复行
- 默认情况下,
UNION
操作符会自动去除结果集中的重复行。如果想要保留所有的行,包括重复的行,可以使用UNION ALL
操作符。UNION ALL
的语法与UNION
相同,只是它不会对结果进行去重处理。
三、示例应用
1. 整合来自不同表的数据
假设我们有两个表:employees
表和contractors
表。employees
表包含公司正式员工的信息,有employee_id
,first_name
,last_name
,department
等列;contractors
表包含公司临时工的信息,有contractor_id
,first_name
,last_name
,project
等列。
如果我们想要获取所有员工(包括正式员工和临时工)的姓名列表,我们可以使用UNION
操作符如下:
SELECT first_name, last_name FROM employees
UNION
SELECT first_name, last_name FROM contractors;
在这个示例中,我们从两个不同的表中选择了first_name
和last_name
列,并使用UNION
操作符将结果组合成一个单一的姓名列表。由于我们只关心姓名,所以不需要选择其他列,并且UNION
操作会自动去除可能存在的重复姓名(如果有的话)。
2. 从同一个表中按照不同条件查询并合并结果
假设我们有一个sales
表,其中包含销售记录,有sales_id
,product_name
,quantity
,sales_date
等列。我们想要获取在某个特定时间段内销售量大于 100 的产品列表,以及在另一个时间段内销售额排名前 10 的产品列表,并将这两个结果合并。
我们可以使用UNION
操作符如下:
-- 获取销售量大于100的产品列表
SELECT product_name FROM sales WHERE quantity > 100 AND sales_date BETWEEN '2023-01-01' AND '2023-03-31'
UNION
-- 获取销售额排名前10的产品列表
SELECT product_name FROM sales WHERE sales_date BETWEEN '2023-04-01' AND '2023-06-30' ORDER BY sales_amount DESC LIMIT 10;
在这个示例中,我们首先从sales
表中选择在 2023 年第一季度销售量大于 100 的产品名称,然后使用UNION
操作符连接从同一表中选择在 2023 年第二季度销售额排名前 10 的产品名称。需要注意的是,这里的代码可能需要根据实际表结构调整销售额的计算和排名方式等。