SQL 知识量:22 - 44 - 129
由前一个示例可以看出,在使用组合查询时,对于表之间重复的行,DBMS自动进行了去除,也就是说,组合查询默认是不包含重复行的。
如果需要包含重复的行,可以使用union all来实现。
例如:使用组合查询检索年龄大于12岁或性别为男性的学生信息,保留重复信息。
select * from student where age>=12 union all select * from student where sex='male';
结果:
+----+--------+-----+--------+ | id | name | age | sex | +----+--------+-----+--------+ | 2 | Jame | 12 | male | | 7 | Jack | 13 | male | | 10 | Ella | 12 | female | | 2 | Jame | 12 | male | | 3 | Bob | 11 | male | | 4 | Robot | 10 | male | | 6 | Toney | 10 | male | | 7 | Jack | 13 | male | | 9 | Bonnie | 11 | male | +----+--------+-----+--------+
以上结果中包含两行重复内容,这是使用多个where子句所不能做到的。
可以使用order by子句对组合查询结果进行排序,但是,只能使用一个order by子句,且必须放置到整个组合查询语句的最后。对于结果集来说,不存在用一种方式排序一部分,而又用另一种方式排序另一部分的情况。排序将对整个组合查询结果统一起作用。
例如:查询年龄大于12岁或性别为男性的学生信息,按照学生年龄和姓名排序。
select * from student where age>=12 union select * from student where sex='male' order by age,name;
结果:
+----+--------+-----+--------+ | id | name | age | sex | +----+--------+-----+--------+ | 4 | Robot | 10 | male | | 6 | Toney | 10 | male | | 3 | Bob | 11 | male | | 9 | Bonnie | 11 | male | | 10 | Ella | 12 | female | | 2 | Jame | 12 | male | | 7 | Jack | 13 | male | +----+--------+-----+--------+
除了以上组合查询外,还有两种不常用的union:
except:用来查询只在第一个表中存在,且在第二个表中不存在的行。
intersect:用来查询两个表中都存在的行。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6