有两种基本情况需要使用组合查询:
1、在单个查询中从不同的表返回结构类似的数据;
2、对单个表执行多个查询,按单个查询返回数据。
使用UNION
创建组合查询很简单,所需要做的只是给出每条SELECT语句,然后在各SELECT语句中间放上UNION。
举例:需要查询价格小于等于5的所有物品的一个列表,而且还想包括供应商1001和1002生产的所有物品(不考虑价格)。当然,可以利用WHERE子句来完成此工作。
1)查询价格小于等于5的所有物品的一个列表
mysql> SELECT vend_id,prod_id,prod_price FROM products WHERE prod_price<=5;
结果:
+---------+---------+------------+
| vend_id | prod_id | prod_price |
+---------+---------+------------+
| 1003 | FC | 2.50 |
| 1002 | FU1 | 3.42 |
| 1003 | SLING | 4.49 |
| 1003 | TNT1 | 2.50 |
+---------+---------+------------+
4 rows in set (0.02 sec)
2)查询供应商1001和1002生产的所有物品
mysql> SELECT vend_id,prod_id,prod_price FROM products WHERE vend_id IN (1001,1002);
结果:
+---------+---------+------------+
| vend_id | prod_id | prod_price |
+---------+---------+------------+
| 1001 | ANV01 | 5.99 |
| 1001 | ANV02 | 9.99 |
| 1001 | ANV03 | 14.99 |
| 1002 | FU1 | 3.42 |
| 1002 | OL1 | 8.99 |
+---------+---------+------------+
5 rows in set (0.10 sec)
3)组合返回结果
mysql> 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);
结果:
+---------+---------+------------+
| vend_id | prod_id | prod_price |
+---------+---------+------------+
| 1003 | FC | 2.50 |
| 1002 | FU1 | 3.42 |
| 1003 | SLING | 4.49 |
| 1003 | TNT1 | 2.50 |
| 1001 | ANV01 | 5.99 |
| 1001 | ANV02 | 9.99 |
| 1001 | ANV03 | 14.99 |
| 1002 | OL1 | 8.99 |
+---------+---------+------------+
8 rows in set (0.03 sec)
发现组合查询比分开查询的总结果少了一行,这是因为默认情况下UNION会过滤掉重复的行。
使用UNION的规则
1)必须由多条SELECT语句组成,语句中间用关键词UNION分割。
2)UNION的每个查询必须含有相同的列,表达式或者聚集函数(次序无关紧要)
3)列数据类型必须兼容(例如,不同的数值类型或不同的日期类型)