组合查询

  多个SQL查询都只包含从一个或多个表中返回数据的单条SELECT语句。MYSQL也允许执行多条SELECT语句,并将结果作为单个查询结果集返回。这些组合查询通常称为并(UNION)或复合查询。

  有两种基本情况,其中需要使用组合查询:

1.  在单个查询中从不同的表返回类似结构的数据

2.对单个表执行多个查询,按单个查询返回数据。

   组合查询和多个WHERE条件

  多数情况下,组合相同表的两个查询完成的工作与具有多个WHERE子句条件查询完成的工作相同。换句话说,任何具有多个WHERE子句的SELECT语句都可以作为一个组合查询给出,但是这两种技术在不同的查询中性能也不同。


SELECT vend_id,prod_id,prod_price  FROM products WHERE prod_price<=5;
    SELECT vend_id,prod_id,prod_price  FROM products WHERE vend_id IN (1001,1005);

第一条SELECT检索价格不高于5的所有物品。第二条SELECT使用IN 找出供应商1001和1002生产的所有物品。为了组合这两条语句,按如下进行:

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 );

作为参考,这里给出使用多条WHERE子句而不是使用UNION的相同查询:

SELECT  vend_id,prod_id,prod_price  FROM products  WHERE prod_price<=5  OR  vend_in IN  (1001,1002);

这个简单的例子中,使用UNION可能比使用WHERE子句更为复杂,但是对于更为复杂的过滤条件,或者多个表中检索数据的情形,使用UNION可能会处理更简单。


使用UNION的几条规则需要注意:

1. UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔(因此,如果组合4条SELECT语句,将要使用3个UNION关键字)

2.UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过不同的列不需要以相同的次序列出)。

3.列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型。(例如,不同的数值类型或不同的日期类型)。


包含或取消重复的行:

UNION从查询结果集中自动去除了重复的行。如果想取消重复的行可以使用UNION  ALL关键字

UNION ALL为UNION的一种形式,它完成WHERE子句完成不了的工作。如果确实需要每个条件的匹配行全部出现(包括重复行),则必须使用UNION  ALL而不是WHERE语句。

对组合查询结果排序

在使用UNION组合查询时只能使用一条ORDER  BY子句,它必须出现在最后一条SELECT语句之后。