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:
-
取出前5条记录:
SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=5;--取表中的前5条数据
结果:
-
取出前8条记录:
SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=8;--取表中的前8条数据
结果:
-
取交集
--单列
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后面的结果集