每个查询语句都有其相对应的结果集,我们可以将多个查询语句的结果集合并起来,这可以称为宾基查询。
在同一个表内如果我们想把两个查询语句的结果集合并成一个结果集的话,其实很简单,改变where的条件即可。但对于两个表呢,这就要用到并集查询union。
看例子:
mysql> select * from t1;
+------+------+
| m1 | n1 |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
+------+------+
3 rows in set (0.01 sec)
mysql> select * from t2;
+------+------+
| m2 | n2 |
+------+------+
| 2 | b |
| 3 | c |
| 4 | d |
+------+------+
3 rows in set (0.00 sec)
mysql> select m1, n1 from t1 where m1<2 union select m2, n2 from t2 where m2>2;
+------+------+
| m1 | n1 |
+------+------+
| 1 | a |
| 3 | c |
| 4 | d |
+------+------+
3 rows in set (0.00 sec)
这里我们想把t1表的查询结果和t2表的查询结果合并起来,要用到的语句结构就是如上所示:
select ()from ()union select () from ();
简单来说就是把两个查询语句用一个union来连接起来;
并不是说在使用union连接起来的各个查询语句的查询列表处只能包含一个表达式,包含多个表达式也是可以的。
在使用union连接起来的各个查询语句的查询列表中,位置相同的表达式的类型应该是i相同的。当然,这并不是硬性要求,如果不相同的话,MySQL会进行必要的类型转换。
如果两个查询语句的结果集中有相同的记录时,并集查询会自动去重。
并集查询会把各个查询的结果汇集到一块,如果我们相对最终的结果集进行排序或者只保留几行的话,可以在并集查询的语句末尾加上order by和limit子句。
例如这样:
mysql> select m1, n1 from t1 union select m2, n2 from t2 order by m1 desc limit 2;
+------+------+
| m1 | n1 |
+------+------+
| 4 | d |
| 3 | c |
+------+------+
2 rows in set (0.00 sec)
这里需要注意的就是由于并集查询的结果集展示的列名是第一个查询中给定的列名,所以order by子句中指定的排序列也必须是第一个查询中给定的列名。
并集查询并不保证最终结果集中的顺序是按照各个小查询的结果集中的顺序排序的。这也就意味着我们在各个小查询中加入order by 子句的作用和没加一样。