MySQL 知识量:16 - 40 - 165
组合查询也称为并查询或复合查询。本质上就是将多个表的查询合并到一起作为一个整体结果显示出来。其主要用途为:
在一个查询中从不同的表返回类似结构的数据。
对一个表执行多个查询,按单个查询返回数据。
要创建组合查询可以使用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规则,具体是:
组合查询必须由两条或两条以上的select语句组成,语句间用union关键字分隔。
组合查询的每个查询必须返回相同的列、表达式或聚集函数,但不要求次序一致。(建议保持次序一致,如果不一致,每个查询返回的数据排列次序也将不一致。)
列数据类型必须是兼容的,也就是说不必完全相同,但是必须是MySQL可以隐含转换的类型。
组合查询默认会取消重复的行,例如:
查询年龄大于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 | +----+-------+-----+------+
可以使用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 | +----+-------+-----+------+
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6