到目前为止,我们接触的查询都是只有一个select的查询语句,其实,MySQL也允许通过多个select语句来执行多个查询,并将结果作为单个结果集返回。这种组合查询通过称为并(union)或是复合查询。
有如下两种情况,需要使用组合查询:
- 在单个查询中从不同的表中返回结构类似的数据结果。
- 在单个表中多次查询,按单个查询返回数据。
创建组合查询比较简单,直接用 union将多个查询语句组合起来即可。
下面举个例子来讲解组合查询。
现在有一个student表,里面学生ID、姓名、成绩。
现在我们想查询及格的学生的信息以及我特别关注的人(wu,wuran)这两个人的信息。那面对这个需要我们应该怎么实现呢???
对于这个需求,我们都知道,可以直接利用多个where 条件来实现即可。
的确,用where条件确实可以来实现,如下:
除了利用多个where条件来实现之外,我们也可以利用组合查询来完成。
组合查询就是将单条查询语句通过union组合起来即可。
例如:查询及格的学生信息的查询语句如下所示:
select name,score from student where score>=60;
而查询我特别关注的学生(wu,wuran)这两个人的信息的查询语句如下:
select name,score from student where name in ('wu','wuran');
上面两个单独的查询结果如下:
组合查询就是将上面介绍的两个查询语句用 union连接起来就可以了。
如下:
从结果可以看出两点
第一点为:通过组合查询和通过where查询的结果是一样的。
第二点为:直接用union 来连接单个的select语句,是将重复的结果进行了过滤的。
如果我们想不过滤重复的结果(即允许结果多次显示),应该怎么做呢?
用多个where条件语句是没有办法做到的,因为where语句是直接将多余的行进行了过滤。而组合查询就能够做到这一点。
直接用union all来连接单个的select语句即可。
如下:
上面对union和union all进行了应用,下面对应用组合查询的规则进行一个介绍。
1、union连接两个select语句。如果有3个select语句,则要2个union关键字进行分隔开。
2、union中的每个单独的查询语句返回的数据必须具有相同的列、表达式或聚集函数。且列的数据类型必须兼容(即要么相同,要么可以隐式的转化为同一数据类型)。
上面只是进行了组合查询,如果我们想多结果进行排序,是应该在每个select语句后面加了,还是只是在最后一个select语句的后面加order by子句呢??
答案是:对于结果集,不存在用一种方式排序一部分,而又用另一种方式排序零一部分的情况。因此,不允许使用多条order by 子句。
一般用多个where条件完成的查询,用union 组合查询也可以完成。而如果想要求结果中不过滤重复的行,则多个where条件时没有办法办到的,而通过组合查询union all可以做到。
但是,对于多个where条件和组合查询都能够办到的事情,我们最好都测试一下,以确定对特定的查询哪一种性能更好。