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;