多数SQL查询都只使用单条SELECT语句。但MySQL也允许执行多个查询(多条SELECT语句),并将结果作为单个查询结果集返回。这些组合查询通常称为并(union)或复合查询(compound query)。
以下两种情况时需要使用到组合查询:
- 单个查询中返回不同表类似结构的数据
- 执行多个查询,按单个查询返回数据
17.1 创建组合查询
使用UNION函数来组合数条单个SELECT语句的SQL查询:
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);
使用UNION来分隔两条SELECT语句,将其各自检索的结果合并后返回称单个查询的结果集
也可以使用WHERE子句,但是对于更复杂的过滤条件或从多表检索数据的情况,使用UNION会更简单而且便于理解
17.2 UNION规则
- UNION用于分隔两条或两条以上的SELECT语句
- UNION中的每个查询必须包含相同的列、表达式或聚集函数
17.3 包含或取消重复行
UNION默认会从查询结果中自动去除重复的行,如果需要更改,返回所有匹配行,那么久需要使用UNION ALL函数
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION ALL
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001, 1002);
17.4 对组合查询结果的排序
在使用UNION时,只能使用一条ORDER BY子句,且必须出现在最后一条SELECT语句之后
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)
ORDER BY vend_id, prod_price;
- 似乎ORDER BY子句只对最后一条SELECT语句的组成部分,但实际上MySQL将其用来排序所有SELECT语句返回的结果