UNION 联合查询定义:

  • 之前的JOIN连接,是可以对多个表进行横向列的合并,而不能对按行进行纵向合并。
  • UNION操作符,则是可以将多个查询结果,按行进行纵向合并

基本语法:

SELECT <字段名> FROM <表名>
UNION
SELECT <字段名> FROM <表名>

1. 单表查询

  • **UNION **在进行合并结果集的时候,如果合并的结果集中有重复行,只会保留其中一行。

实例1:查询学生表中,将学生编号Sid为2-5的记录和1-3的记录通过UNION联合起来

select * from 
students where Sid between 2 and 5
union
select * from 
students where Sid between 1 and 3

解析:
union上面的这个表查询出的结果集中有2,3,4,5的记录,union下面的表查询出的结果有1,2,3
而通过union联合查询时,只会保留重复行(Sid为2和3的记录)其中的一行。

执行结果:
在这里插入图片描述

  • UNION ALL 在进行合并结果集的时候,如果合并的结果集中有重复行,都会将重复行全部显示出来

还是以刚才的那个实例,将 UNION 改成 UNION ALL 在试一试

select * from students 
where Sid between 2 and 5
union all
select * from students 
where Sid between 1 and 3

执行结果:
在这里插入图片描述

2. 多表联合查询

  • UNION操作符上下两个结果集的列数必须相等,否则则会报错。
  • 最终合并的列名,由UNION上面的结果集决定,上面的列名叫啥最终显示啥。

实例2:查询学生表中,年龄Sage在1995年之前出生的学生姓名和教师表中的老师名字进行合并显示

select Sname from students 
where Sage < '1995-01-01'
union
select Tname from teachers

执行结果:
在这里插入图片描述

3. 语句执行顺序

  • 如果查询语句后面跟了 ORDER BY、LIMIT子句这些,这些子句需要在UNION将结果集进行合并之后在执行
select * from students 
where Sid between 2 and 5
union
select * from students 
where Sid between 1 and 3
order by Sid

执行结果:
在这里插入图片描述
查看上面的执行结果时,可以看到order by 是等union将结果进行合并之后才对结果集排序的。

LIMIT 子句也会等结果集进行合并之后才会执行次操作。

select * from students 
where Sid between 2 and 5
union
select * from students 
where Sid between 1 and 3
order by Sid 
limit 3

执行结果:
在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐