oracle中的集合查询

本文详细介绍了数据库查询中的集合操作,包括Union(合并)、Intersect(交)和Minus(差)。讲解了这些操作的基本概念、使用场景和区别,并通过实例展示了它们在SQL查询中的应用。强调了Union通常优于OR的原因在于其利用索引扫描。同时,给出了交集和差集的实现方式,以及在不同情况下的使用策略。

1.基本内容:

集合操作包括合并操作union、交操作interact、差操作except。
需要注意的是:参与集合操作的表的列数必须相同,对应数据类型也必须相同。

2.Union(合并)

多个表进行union操作,所显示的为多个表去除重复组的合并查询结果,并且会按照编号进行排序

--xsb为学生表,yxxs为优秀学生表
select s1.id  ,s1.name ,s1.gender 
from xsb s1
union
select s2.id ,s2.name ,s2.gender
from yxxs s2;

--自己尝试union 和 union all的用法时,可将同一张表进行合并,会得到两种结果
select s1.id  ,s1.name ,s1.gender 
from xsb s1
union
select s2.id ,s2.name ,s2.gender
from xsb s2;

拓展:union all 也是进行多表的合并操作,但是不会对合并结果进行去重操作 ,并且结果集合不会进行排序

实战演练:

1.给定一个学生表student,字段有stu_id,stu_name,sut_age
需求:查询学生表中id小于15和age大于18的学生信息

--union操作
select *
from student
where stu_id<15
union
select *
from student
where stu_age>18;

--or操作
select *
from student
where stu_id<15 or stu_age>18;

2. 在给定一个班级表class,字段有cls_id,cls_name,cls_count
需求:查询学生表中学生姓名大于18的所有学生信息和班级表中学生数量大于20的班级信息

--union操作
select *
from student
where stu_age>18
union
select *
from class
where cls_count>20;

--or操作
select *
from student, class
where stu_age>18 or cls_count>20;

unoin和or二者的优劣:
通常情况下union是优于or的,因为union使用的是索引扫描,而or使用的是全表扫描。

3.交操作intersect

返回结果:两个集合中的公共部分

实战演练

1.需求:查询学生表中年龄大于18的所有学生信息和班级人数大于20的班级信息

--intersect操作
select *
from student
where stu_age>18
intersect
select *
from class
where cls_count>20;

--and实现
select stu.*, cls.*
from student stu, class cls
where stu.age > 18 and cls.count > 20;

4.差操作(minus)

oracle中没有except这个关键字。

返回结果:返回A中存在B中不存在数据集,通俗来说,就是A中去除掉B中的元素

示例:对于集合A = {a, b, c, d}和集合B = {b, c, w},则A与B 的差集为{a, d}

实战演练:

1.需求:查询学生表中stu_id>15的学生中stu_age<18的学生信息

解析:A——学生表中stu_id>15的所有学生信息;B——学生表中stu_age>18的所有学生信息

select * 
from student
where stu_id>15
minus
select *
from student
where stu_age>18;

参考:

oracle中的集合查询 union(并)interact(交)except(差)_阿啦印的博客-CSDN博客_oracle集合查询https://blog.csdn.net/weixin_46093984/article/details/126985984?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2~default~YuanLiJiHua~Position-2-126985984-blog-123681634.pc_relevant_landingrelevant&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~YuanLiJiHua~Position-2-126985984-blog-123681634.pc_relevant_landingrelevant&utm_relevant_index=5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的小羽儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值