SQL

SQL 知识量:22 - 44 - 129

14.2 其他操作><

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

由前一个示例可以看出,在使用组合查询时,对于表之间重复的行,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子句所不能做到的。

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

可以使用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:用来查询两个表中都存在的行。