MySQL

MySQL 知识量:16 - 40 - 165

6.4 组合查询><

什么是组合查询- 6.4.1 -

组合查询也称为并查询或复合查询。本质上就是将多个表的查询合并到一起作为一个整体结果显示出来。其主要用途为:

  • 在一个查询中从不同的表返回类似结构的数据。

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

使用UNION- 6.4.2 -

要创建组合查询可以使用union关键字,具体用法是将union放到每个select语句中间,这样就可以将他们的结果组合成单个结果集。

select * from student where age>11
union
select * from student where sex='male';

组合查询年龄大于11的学生和性别是男性的学生。结果为:

+----+-------+-----+------+
| id | name  | age | sex  |
+----+-------+-----+------+
|  2 | Jame  |  12 | male |
|  3 | Bob   |  11 | male |
|  4 | Robot |  10 | male |
|  6 | Toney |  10 | male |
+----+-------+-----+------+

以上SQL语句的效果与下面的SQL语句的效果是一样的:

select * from student where age>11 or sex='male';

因此,当对一个表执行多个查询,按单个查询返回数据时,使用组合查询与在单个表查询中使用多个where子句效果是一样的。但如果是更复杂的查询,例如在一个查询中从不同的表返回类似结构的数据时,使用组合查询更简单一些。

UNION规则- 6.4.3 -

在使用组合查询时,一定要注意union规则,具体是:

  • 组合查询必须由两条或两条以上的select语句组成,语句间用union关键字分隔。

  • 组合查询的每个查询必须返回相同的列、表达式或聚集函数,但不要求次序一致。(建议保持次序一致,如果不一致,每个查询返回的数据排列次序也将不一致。)

  • 列数据类型必须是兼容的,也就是说不必完全相同,但是必须是MySQL可以隐含转换的类型。

包含或取消重复的行- 6.4.4 -

组合查询默认会取消重复的行,例如:

查询年龄大于11的学生,结果为:

+----+------+-----+------+
| id | name | age | sex  |
+----+------+-----+------+
|  2 | Jame |  12 | male |
+----+------+-----+------+

查询性别是男性的学生,结果为:

+----+-------+-----+------+
| id | name  | age | sex  |
+----+-------+-----+------+
|  2 | Jame  |  12 | male |
|  3 | Bob   |  11 | male |
|  4 | Robot |  10 | male |
|  6 | Toney |  10 | male |
+----+-------+-----+------+

当组合查询年龄大于11的学生和性别是男性的学生时,结果为:

+----+-------+-----+------+
| id | name  | age | sex  |
+----+-------+-----+------+
|  2 | Jame  |  12 | male |
|  3 | Bob   |  11 | male |
|  4 | Robot |  10 | male |
|  6 | Toney |  10 | male |
+----+-------+-----+------+

组合查询结果自动删除了一条重复的“Jame”行。

如果要取消组合查询的默认行为,返回所有匹配行,可以使用union all关键字。

select * from student where age>11
union all
select * from student where sex='male';

查询结果为:

+----+-------+-----+------+
| id | name  | age | sex  |
+----+-------+-----+------+
|  2 | Jame  |  12 | male |
|  2 | Jame  |  12 | male |
|  3 | Bob   |  11 | male |
|  4 | Robot |  10 | male |
|  6 | Toney |  10 | male |
+----+-------+-----+------+

对组合查询结果排序- 6.4.5 -

可以使用order by子句对组合查询的结果进行排序。具体做法是在最后一条select语句后面使用order by子句。因为组合查询的结果是作为一个整体结果集返回的,所以写在最后一条select语句后面的order by子句是对返回的所有行的排序。

select * from student where age>11
union
select * from student where sex='male'
order by age;

查询结果为:

+----+-------+-----+------+
| id | name  | age | sex  |
+----+-------+-----+------+
|  6 | Toney |  10 | male |
|  4 | Robot |  10 | male |
|  3 | Bob   |  11 | male |
|  2 | Jame  |  12 | male |
+----+-------+-----+------+