前面介绍的都是单条查询语句产生结果集,其实多条语句的查询结果也可以放到一个更大的结果集里,多条语句可以是针对同一张表的查询,也可以是针对不同表的查询,这种将多条查询语句的结果集合并为一个总的结果集的查询称为组合查询,也叫合并查询。
本节举例使用到的两张表:
表t1
t1_col1 | t1_col2 |
---|---|
1 | a |
2 | b |
3 | c |
表t2
t2_col1 | t2_col2 |
---|---|
2 | b |
3 | c |
4 | d |
1、单表的组合查询
单表的组合查询就是多条查询语句针对的是同一张表,举个例子,以下两条SQL语句都是对表t1
查询语句:
查询语句1:
SELECT * FROM t1 WHERE t1_col1 < 2;
结果:
t1_col1 | t1_col2 |
---|---|
1 | a |
查询语句2:
SELECT * FROM t1 WHERE t1_col1 > 2;
结果:
t1_col1 | t1_col2 |
---|---|
3 | c |
使用组合查询将上面两条查询语句的结果放在一个结果集中,如下:
SELECT * FROM t1 WHERE t1_col1 > 2 UNION SELECT * FROM t1 WHERE t1_col1 < 2;
结果:
注意:
- 组合查询时,当记录的列的数据类型与上面的不相符时,MySQL会自动进行转换;
- 组合查询的结果集中显示的列名将以第一个查询中的列名为准;
- 可以使用()将组合查询中的不同查询子句分隔开,逻辑上更加清晰。
2、多表的组合查询
多表组合查询跟单表组合查询语法基本相同,举个例子:
结果:SELECT t1_col1, t1_col2 FROM t1 WHERE t1_col1 < 2 UNION SELECT t2_col1, t2_col2 FROM t2 WHERE t2_col2 < 'd';
从结果可以看出,组合查询的结果集的列名与第一个查询语句的列名保持一致。3、组合查询中的去重、排序
3.1 去重
组合查询中使用UNION
连接查询语句会将重复记录自动合并,使用UNION ALL
则会保留重复记录。3.2 排序
使用ORDER BY
可以排序,使用LIMIT
可以控制输出的记录数目,举个例子:(SELECT t1_col1, t1_col2 FROM t1 WHERE t1_col1 < 2) UNION (SELECT t2_col1, t2_col2 FROM t2 WHERE t2_col2 < 'd') ORDER BY t1_col1 DESC LIMIT 2;