SQL UNION运算符
SQL UNION运算符用于通过删除重复行(如果有的话)来组合多个表的数据。
要在多个表上使用UNION运算符,所有这些表都必须是联合兼容的。只有满足以下条件,它们才被认为是联合兼容的:
- 选择了相同数量的列,并且它们具有相同的数据类型。
- 这些列还必须按相同的顺序。
- 它们不需要具有相同数量的行。
一旦满足了这些条件,UNION运算符将从多个表中返回行,作为一个结果表,其中不含来自这些表的重复值。
注意 - 最终结果集中的列名将基于第一个SELECT语句中选择的列名。如果您想在最终结果集中为列使用不同的名称,您可以在SELECT语句中使用别名。
语法
UNION运算符的基本语法如下:
这里,给定的条件可以是基于您的要求的任何给定表达式。
在单个字段上进行UNION操作
如果我们想要使用UNION来组合两个或多个SELECT语句的结果集在单个字段上,我们可以简单地在每个查询的SELECT语句中包含该字段。UNION操作符将自动删除最终结果集中的任何重复值。
注意: 需要注意的是,当在单个字段上使用UNION时,结果集中的列名将由第一个SELECT语句中的列名确定。因此,您可能需要在SELECT语句中使用别名,以确保列名对于最终的结果集是有意义的。
示例
假设我们使用CREATE TABLE语句在SQL数据库中创建了一个名为CUSTOMERS的表,如下所示:
以下查询使用INSERT语句将值插入到这个表中 –
如果我们使用SELECT语句验证CUSTOMERS表的内容,我们可以观察到插入的记录如下所示:
表1 - CUSTOMERS表如下所示。
现在,根据以下的CREATE TABLE语句创建第二个表ORDERS
以下查询使用INSERT语句将值插入到此表中 –
如果我们使用SELECT语句验证ORDERS表的内容,我们可以观察到如下插入的记录−
表2 − ORDERS表如下所示。
使用以下查询,让我们尝试将 CUSTOMERS 表中的 SALARY 列和 ORDERS 表中的 AMOUNT 列进行合并,因为这些列具有相似的数据类型。
输出
上述查询的输出如下:
多个字段上的UNION操作
当我们在多个字段上使用UNION操作时,每个SELECT语句中字段的数量和顺序必须匹配。此外,每个SELECT语句中字段的数据类型必须兼容,以确保UNION操作能够正确运行。如果数据类型不兼容,您可能需要使用转换函数,如CAST或CONVERT,以确保数据类型匹配。
示例
由于CUSTOMERS和ORDERS表在个别情况下不具备联合兼容性,让我们首先使用左连接和右连接将这两个表连接成一个更大的表。连接后的表具有相同数量和相同数据类型的列,从而具备了联合兼容性。现在,使用下面所示的UNION查询组合这些表 –
输出
这将产生以下结果 –
UNION带WHERE子句
我们可以使用带WHERE子句的UNION运算符,在组合之前过滤每个SELECT语句的结果。
语法
使用带WHERE子句的UNION运算符的语法如下:
示例
在以下查询中,我们试图检索’CUTOMERS’和’ORDERS’表中ID大于5和2的客户ID。
输出
以下是生成的结果:
UNION with ORDER BY clause
当我们在使用UNION和ORDER BY子句时,它会将所有SELECT语句的排序结果集合并,并产生一个排序的结果集。
示例
在这个例子中,我们试图从’CUTOMERS’表和’ORDERS’表中检索id大于5和2的客户的id,按照工资从低到高排序。
输出
以下是上述查询的输出结果 –
注意 :在UNION语句中,ORDER BY子句应用于整个结果集,而不仅仅是最后一个SELECT语句。
带有别名的UNION
我们可以在UNION运算符的SELECT语句中使用别名,为表或列提供临时名称。当处理具有相似名称的多个表或列时,这非常有用。
使用带有别名的UNION时,需要注意列别名是通过第一个SELECT语句确定的。因此,如果要在不同的SELECT语句中为同一列使用不同的别名,需要在所有SELECT语句中使用列别名,以确保最终结果集中的列名称一致。
语法
下面是使用带有别名的Union的语法:
示例
以下查询从两个表中检索所有的ID,并显示每个ID是客户还是订单的指示-
输出
以下是生成的结果-
有另外两个类似于UNION操作符的操作符。
-
SQL INTERSECT Operator - 用于结合两个SELECT语句,只返回第一个SELECT语句与第二个SELECT语句中相同的行。
-
SQL EXCEPT Operator - 结合两个SELECT语句,并返回第一个SELECT语句中不被第二个SELECT语句返回的行。