复合查询
多数SQL查询都只包含从一个或多个表中返回数据的单条SELECT语句。MySQL也允许执行多个查询(多条SELECT语句),并将结果作为单个查询结果集返回。这些组合查询通常称为并(union)或复合查询(compound query)。
有两种基本情况,其中需要使用组合查询:
- 在单个查询中从不同的表返回类似结构的数据;
- 对单个表执行多个查询,按单个查询返回数据。
创建组合查询
分别查询:
MariaDB [test]> select class,user,sex from users where age > '22';
+-------+-------+------+
| class | user | sex |
+-------+-------+------+
| 1 | user2 | girl |
| 2 | user5 | boy |
+-------+-------+------+
2 rows in set (0.00 sec)
MariaDB [test]> select class,user,sex from users where class = 1;
+-------+-------+------+
| class | user | sex |
+-------+-------+------+
| 1 | user2 | girl |
| 1 | user3 | boy |
| 1 | user1 | boy |
+-------+-------+------+
3 rows in set (0.01 sec)
组合查询:
MariaDB [test]> select class,user,sex from users where age > '22'
-> union
-> select class,user,sex from users where class = 1;
+-------+-------+------+
| class | user | sex |
+-------+-------+------+
| 1 | user2 | girl |
| 2 | user5 | boy |
| 1 | user3 | boy |
| 1 | user1 | boy |
+-------+-------+------+
4 rows in set (0.00 sec)
这里我们看出对于第一个字句出现过的查询结果,第二个字句不再重复。
UNION规则
- UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔
- UNION中的每个查询必须包含相同的列、表达式或聚集函数
- 列数据类型必须兼容
包含或取消重复的行
UNION 默认从查询结果集中自动去除了重复的行
如果想返回所有匹配行,可使用UNION ALL而不是UNION。
MariaDB [test]> select class,user,sex from users where age > '22'
-> union
-> select class,user,sex from users where class = 1;
+-------+-------+------+
| class | user | sex |
+-------+-------+------+
| 1 | user2 | girl |
| 2 | user5 | boy |
| 1 | user3 | boy |
| 1 | user1 | boy |
+-------+-------+------+
4 rows in set (0.00 sec)
MariaDB [test]> select class,user,sex from users where age > '22' union all select class,user,sex from users where class = 1;
+-------+-------+------+
| class | user | sex |
+-------+-------+------+
| 1 | user2 | girl |
| 2 | user5 | boy |
| 1 | user2 | girl |
| 1 | user3 | boy |
| 1 | user1 | boy |
+-------+-------+------+
5 rows in set (0.00 sec)
可以看到对比。
这里我们只使用了同一张表,但是在十几种我们可以使用不同的表。
对组合查询结果排序
MariaDB [test]> select class,user,sex from users where age > '22'
union all
select class,user,sex from users where class = 1
order by class,user;
+-------+-------+------+
| class | user | sex |
+-------+-------+------+
| 1 | user1 | boy |
| 1 | user2 | girl |
| 1 | user2 | girl |
| 1 | user3 | boy |
| 2 | user5 | boy |
+-------+-------+------+
5 rows in set (0.00 sec)
只准使用一条 order by 语句。