第十七章组合查询
17.1组合查询
MySQL允许执行多个查询(多条SELECT语句),并将结果作为单个查询结果集返回。这些组合查询通常称为并(union)或复合查询(compound query)。
以下几种情况需要使用组合查询:
- 在单个查询中从不同的表返回类似结构的数据。
- 对单个表执行多个查询,按单个查询返回数据。
- 任何具有多个多个WHERE子句的SELECT语句都可以作为一个组合查询给出。
17.2创建组合查询
17.2.1使用UNION
需求:查询价格小于等于5的所有物品和供应商1001和1002生产的所有商品(不考虑价格)。
输入:
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001,1002)
OR prod_price <= 5;
输出:
说明:这里使用多个WHERE条件进行的查询。
输入:
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;
输出:
输入:
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操作符来组合数条SQL查询,将多条SELECT语句的结果组合成单个结果集。
17.2.2UNION规则
并是非常容易使用的,但要注意以下几条规则。
- UNION必须由两条或两条以上的SELECT语句组成,语句之间使用UNION分隔。
- UNION中的每个查询必须包含相同的列、表达式或聚集函数(不需要完全相同的顺序)。
- 列数据类型必须兼容,类型不必完全相同。
17.2.3包含或取消重复的行
输入:
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);
输出:
说明:UNION在使用时会自动去掉重复的行,如果需要返回所有行可以使用UNION ALL,而这是WHERE完成不了的工作。
17.2.4对组合查询结果排序
输入:
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;
输出:
说明:在使用UNION组合查询时,只能使用一条ORDER BY子句,且必须出现在最后一条SELECT语句之后,不存在一部分按照一种方式排序,另一部分按照另一种方式排序的情况。