oracle笔记之交集(INTERSECT)、并集(UNION UNION ALL )、差集(MINUS)

时间:2022-09-05 16:34:13

前言:

学习oracle差不多有一年了,但是老长时间不用,基本上已经把学的东西全部还给老师了。正好这几天做的项目是使用oracle数据库,
趁这个机会好好的复习一把。下面复习的是oracle的交集,并集,差集,做了一点案例。今天记录一下,哪里有不对的地方,
欢迎大神指点!

准备工作:创建数据表 PERSON,插入数据

创建person表:
CREATE TABLE PERSON 
(
ID NUMBER NOT NULL
, PERSON_NAME VARCHAR2(20) NOT NULL
, CONSTRAINT PRESON_PK PRIMARY KEY
(
ID
)
ENABLE
);

插入测试数据:
INSERT INTO PERSON (ID,PERSON_NAME) VALUES (1,'张三');
INSERT INTO PERSON (ID,PERSON_NAME) VALUES (2,'李四');
INSERT INTO PERSON (ID,PERSON_NAME) VALUES (3,'王五');
INSERT INTO PERSON (ID,PERSON_NAME) VALUES (4,'赵六');
INSERT INTO PERSON (ID,PERSON_NAME) VALUES (5,'钱八');
INSERT INTO PERSON (ID,PERSON_NAME) VALUES (6,'李九');
INSERT INTO PERSON (ID,PERSON_NAME) VALUES (7,'高十');
INSERT INTO PERSON (ID,PERSON_NAME) VALUES (8,'笑十一');

知识点一:求交集(使用关键字 INTERSECT 用法:INTERSECT两边都是查询语句)

测试思路:

1.取出PERSON表中前5条数据
2.取出PERSON表中前8条数据
3.两者取交集
测试SQL:
  1. 取出前5条记录:
SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=5;--取表中的前5条数据

oracle笔记之交集(INTERSECT)、并集(UNION   UNION ALL )、差集(MINUS)
2. 取出前8条记录:

SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=8;--取表中的前5条数据

oracle笔记之交集(INTERSECT)、并集(UNION   UNION ALL )、差集(MINUS)
3. 取交集

--单列
SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=5 INTERSECT SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=8; --交集(结果为前五条数据)

oracle笔记之交集(INTERSECT)、并集(UNION   UNION ALL )、差集(MINUS)

总结:

1.使用INTERSECT后确实取到了交集,结果为前五条,结果正确。
上面只是单列取交集,那么多列呢?
--多列也是可以的
SELECT PERSON_NAME,ID FROM PERSON WHERE ROWNUM <=5 INTERSECT SELECT PERSON_NAME,ID FROM PERSON WHERE ROWNUM <=8; --交集(结果为前五条数据)

结果为:
oracle笔记之交集(INTERSECT)、并集(UNION   UNION ALL )、差集(MINUS)

知识点二:取并集(使用关键字 UNION 或者 UNION ALL 注意两者区别)

测试思路:
 1.取出PERSON表中前5条数据
2.取出PERSON表中前8条数据
3.两者取并集
测试一:使用 UNION
--使用UNION(合并相同项)
SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=5 UNION SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=8 ;

结果为:
oracle笔记之交集(INTERSECT)、并集(UNION   UNION ALL )、差集(MINUS)

总结:
1.结果和查询前八条相同,只是前后顺序发生了改变。
2.也就是说UNION会合并相同的项

测试二:使用 UNION ALL
--使用UNION ALL(不合并相同项)
SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=5 UNION ALL SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=8 ;

结果为:
oracle笔记之交集(INTERSECT)、并集(UNION   UNION ALL )、差集(MINUS)

总结:
1.UNION ALL 不合并相同项,而是把两个查询结果做合并

知识点三:取差集(使用关键字 minus 注意:前后位置的区别)

测试思路:
 1.取出PERSON表中前5条数据
2.取出PERSON表中前8条数据
3.两者取差集(注意:这里交换了1,2的位置,结果不同)
测试一:前五条记录在前,前八条记录在后
SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=5 MINUS SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=8 ;

结果为:
oracle笔记之交集(INTERSECT)、并集(UNION   UNION ALL )、差集(MINUS)

总结:
1.可以看到没有查询出来结果
2.前五条 minus 前八条 相当于 前五条数据 减去 前八条数据 结果肯定为空

测试二:前八条记录在前,前五条记录在后
SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=8 MINUS SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=5;

结果为:
oracle笔记之交集(INTERSECT)、并集(UNION   UNION ALL )、差集(MINUS)

总结:
1.结果为前八条的后三条数据,也就是第六条到第八条数据
2. 前八条 差集(minus) 前五条 相当于 前八条 减去 前五条 得到后三条结果

知识点四:注意事项

1. 取交集的时候,INTERSECT 两边必须是select语句得到的结果集
2. 使用UNION做并集会合并相同项
3. 使用UNION ALL做并集不会合并相同项
4. 取差集注意在MINUS的前后位置,会影响到结果。得到的结果总是:MINUS前面的结果集 减去 MINUS后面的结果集