
7.6 合并查询结果
利用UNION关键字可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同。各个SELECT语句之间使用UNION或UNION ALL关键字分隔。UNION不使用关键字ALL,执行的时候删除重复的记录,所有返回的行都是唯一的。使用关键字ALL的作用是不删除重复行,也不对结果进行自动排序。基本语法格式如下:

【例7.62】查询所有价格小于9的水果的信息,查询s_id等于101和103的所有水果的信息,使用UNION连接查询结果,SQL语句如下:

合并查询结果如下:

如前所述,UNION将多个SELECT语句的结果组合成一个结果集合。可以分开查看每个SELECT语句的结果:

由分开查询的结果可以看到,第1条SELECT语句查询价格小于9的水果,第2条SELECT语句查询供应商101和103提供的水果。使用UNION将两条SELECT语句分隔开,执行完毕之后把输出结果组合成单个的结果集,并删除重复的记录。
使用UNION ALL包含重复的行,在前面的例子中,分开查询时,两个返回结果中有相同的记录。UNION从查询结果集中自动去除了重复的行,如果要返回所有匹配行,而不进行删除,可以使用UNION ALL。
【例7.63】查询所有价格小于9的水果的信息,查询s_id等于101和103的所有水果的信息,使用UNION ALL连接查询结果,SQL语句如下:

查询结果如下:

由结果可以看到,这里总的记录数等于两条SELECT语句返回的记录数之和,连接查询结果并没有去除重复的行。
提示
UNION和UNION ALL的区别:使用UNION ALL的功能是不删除重复行,加上ALL关键字语句执行时所需要的资源少,所以尽可能地使用它。在知道有重复行但是想保留这些行,确定查询结果中不会有重复数据或者不需要去掉重复数据的时候,应当使用UNION ALL以提高查询效率。