oracleの交-并-差集(INTERSECT、UNION /UNION ALL 、MINUS)

oracleの交-并-差集(INTERSECT、UNION /UNION ALL 、MINUS)

 

1.建表造数据

创建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,'笑十一');

 

2.交集(使用关键字 INTERSECT 用法:INTERSECT两边都是查询语句)

测试思路:
 1.取出PERSON表中前5条数据
2.取出PERSON表中前8条数据
3.两者取交集
测试SQL:
  1. 取出前5条记录:

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

结果:

这里写图片描述

  1. 取出前8条记录:

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

结果:

这里写图片描述

  1. 取交集

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

这里写图片描述

总结:

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

结果为:

这里写图片描述

3.并集(使用关键字 UNION 或者 UNION ALL 注意两者区别)

测试思路:
 1.取出PERSON表中前5条数据
2.取出PERSON表中前8条数据
3.两者取并集123

3.1:使用 UNION

--使用UNION(合并相同项
SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=5 UNION SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=8 ;
 

结果为:

这里写图片描述

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

3.2:使用 UNION ALL

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

结果为:

这里写图片描述

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

4.差集(使用关键字 minus 注意:前后位置的区别)

测试思路:
 1.取出PERSON表中前5条数据
2.取出PERSON表中前8条数据
3.两者取差集(注意:这里交换了1,2的位置,结果不同)123

4.1:查询前五条记录的SQL在前,查询前八条记录的SQL在后

SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=5 MINUS SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=8 ;

结果为:

这里写图片描述

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

4.2:查询前五条记录的SQL在后,查询前八条记录的SQL在前

SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=8  MINUS  SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=5;

结果为:

这里写图片描述

总结:

1.结果为前八条的后三条数据,也就是第六条到第八条数据。

2. 前八条 差集(minus) 前五条 相当于 前八条 减去 前五条 得到后三条结果。

5.交并差总结

1. 交集INTERSECT:  两边必须是select的结果
2. 并集UNION:    会合并相同项
3. 并集UNION ALL:  不会合并相同项
4. 差集MINUS:    前后位置会影响结果,结果总是:MINUS前面的结果集 减去 MINUS后面的结果集

 

posted @ 2020-12-11 09:40  BORS  阅读(518)  评论(0编辑  收藏  举报
bors