zoukankan      html  css  js  c++  java
  • 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后面的结果集

     

    作者: BORS

  • 相关阅读:
    Java虚拟机--编译那点事儿
    Java虚拟机--常用Java命令(二)
    Java虚拟机--常用Java命令(一)
    Java虚拟机--类加载机制
    Java虚拟机--JIT编译器
    Java虚拟机--垃圾回收机制
    Java虚拟机--对象模型
    Junit测试--多个测试接口如何产生业务联系
    Java虚拟机--内存模型
    Java虚拟机--内存结构
  • 原文地址:https://www.cnblogs.com/bors/p/oracle_intersect_union_minus.html
Copyright © 2011-2022 走看看