执行多个查询(多条SELECT语句),并将结果作为单个查询结果集返回,这些组合查询通常称为并( union) 或复合查询(compound query)。
有两种基本情况,其中需要使用组合查询:
- 在单个查询中从不同的表返回类似结构的数据;
- 对单个表执行多个查询,按单个查询返回数据。
UNION的使用很简单。所需做的只是给出每条SELECT语句,在各条语句之间放上关键字UNION。
# 检索语句 1
select vend_id,prod_id,prod_price
from products
where prod_price <= 5;
# 检索语句 2
select vend_id,prod_id,prod_price
from products
where vend_id in (1001,1002);
# 使用UNION 操作符组合两条语句 ,搜索结果将被整合在一起返回
select vend_id,prod_id,prod_price
from products
where prod_price <= 5
union
select vend_id,prod_id,prod_price
from products
where vend_id in (1001,1002);
# 或者考虑这样实现
select vend_id,prod_id,prod_price
from products
where prod_price <= 5 or vend_id in (1001,1002);
- UNION 使用规则
- UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔(因此,如果组合4条SELECT语句,将要使用3个UNION关键字)
- UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)
- 列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型(例如,不同的数值类型或不同的日期类型)
- UNION从查询结果集中自动去除了重复的行,这是UNION的默认行为,但是如果需要,可以改变它。事实上,如果想返回所有匹配行,可使用UNION ALL而不是UNION。
- SELECT语句的输出用ORDER BY子句排序。在用UNION组合查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后。对于结果集,不存在用一种方式排序一部分,而又用另一种方式排序另一部分的情况,因此不允许使用多条ORDER BY子句
使用UNION的组合查询可以应用不同的表。 保证上述规则就不会出错。