集合运算符之全集、交集、补集【weber出品必属精品】

  1. 集合的概念

    与数学中的全集、交集、补集的概念是一样的

  2. 常用的集合运算符

    集合运算符的作用:把两个查询构造为一个联合查询

    1. 全集:求连个查询的全集

    union all:将两个查询的所有数据全部列出,不进行排序,不去掉重复的部分

    SQL> create table t1 as select * from emp where deptno in (10,20);
    
    Table created.
    
    SQL> create table t2 as select * from emp where deptno in (20,30);
    
    Table created.
    SQL> select * from t1;
    
         EMPNO ENAME      JOB           MGR HIREDATE        SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
          7369 SMITH      CLERK          7902 17-DEC-80        800            20
          7566 JONES      MANAGER          7839 02-APR-81       2975            20
          7782 CLARK      MANAGER          7839 09-JUN-81       2450            10
          7788 SCOTT      ANALYST          7566 19-APR-87       3000            20
          7839 KING       PRESIDENT        17-NOV-81       5000            10
          7876 ADAMS      CLERK          7788 23-MAY-87       1100            20
          7902 FORD       ANALYST          7566 03-DEC-81       3000            20
          7934 MILLER     CLERK          7782 23-JAN-82       1300            10
    
    8 rows selected.
    
    SQL> select * from t2;
    
         EMPNO ENAME      JOB           MGR HIREDATE        SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
          7369 SMITH      CLERK          7902 17-DEC-80        800            20
          7499 ALLEN      SALESMAN          7698 20-FEB-81       1600        300       30
          7521 WARD       SALESMAN          7698 22-FEB-81       1250        500       30
          7566 JONES      MANAGER          7839 02-APR-81       2975            20
          7654 MARTIN     SALESMAN          7698 28-SEP-81       1250       1400       30
          7698 BLAKE      MANAGER          7839 01-MAY-81       2850            30
          7788 SCOTT      ANALYST          7566 19-APR-87       3000            20
          7844 TURNER     SALESMAN          7698 08-SEP-81       1500      0       30
          7876 ADAMS      CLERK          7788 23-MAY-87       1100            20
          7900 JAMES      CLERK          7698 03-DEC-81        950            30
          7902 FORD       ANALYST          7566 03-DEC-81       3000            20
    
    11 rows selected.
    
    SQL> select * from t1
      2  union all
      3  select * from t2;
    
         EMPNO ENAME      JOB           MGR HIREDATE        SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
          7369 SMITH      CLERK          7902 17-DEC-80        800            20
          7566 JONES      MANAGER          7839 02-APR-81       2975            20
          7782 CLARK      MANAGER          7839 09-JUN-81       2450            10
          7788 SCOTT      ANALYST          7566 19-APR-87       3000            20
          7839 KING       PRESIDENT        17-NOV-81       5000            10
          7876 ADAMS      CLERK          7788 23-MAY-87       1100            20
          7902 FORD       ANALYST          7566 03-DEC-81       3000            20
          7934 MILLER     CLERK          7782 23-JAN-82       1300            10
          7369 SMITH      CLERK          7902 17-DEC-80        800            20
          7499 ALLEN      SALESMAN          7698 20-FEB-81       1600        300       30
          7521 WARD       SALESMAN          7698 22-FEB-81       1250        500       30
          7566 JONES      MANAGER          7839 02-APR-81       2975            20
          7654 MARTIN     SALESMAN          7698 28-SEP-81       1250       1400       30
          7698 BLAKE      MANAGER          7839 01-MAY-81       2850            30
          7788 SCOTT      ANALYST          7566 19-APR-87       3000            20
          7844 TURNER     SALESMAN          7698 08-SEP-81       1500      0       30
          7876 ADAMS      CLERK          7788 23-MAY-87       1100            20
          7900 JAMES      CLERK          7698 03-DEC-81        950            30
          7902 FORD       ANALYST          7566 03-DEC-81       3000            20
    
    19 rows selected.

    union:将两个查询的所有数据进行显示,但是重复的部分只显示一次,而且要按照第一个查询的第一列进行升序排序

    SQL> select * from t1
      2  union
      3  select * from t2;
    
         EMPNO ENAME      JOB           MGR HIREDATE        SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
          7369 SMITH      CLERK          7902 17-DEC-80        800            20
          7499 ALLEN      SALESMAN          7698 20-FEB-81       1600        300       30
          7521 WARD       SALESMAN          7698 22-FEB-81       1250        500       30
          7566 JONES      MANAGER          7839 02-APR-81       2975            20
          7654 MARTIN     SALESMAN          7698 28-SEP-81       1250       1400       30
          7698 BLAKE      MANAGER          7839 01-MAY-81       2850            30
          7782 CLARK      MANAGER          7839 09-JUN-81       2450            10
          7788 SCOTT      ANALYST          7566 19-APR-87       3000            20
          7839 KING       PRESIDENT        17-NOV-81       5000            10
          7844 TURNER     SALESMAN          7698 08-SEP-81       1500      0       30
          7876 ADAMS      CLERK          7788 23-MAY-87       1100            20
          7900 JAMES      CLERK          7698 03-DEC-81        950            30
          7902 FORD       ANALYST          7566 03-DEC-81       3000            20
          7934 MILLER     CLERK          7782 23-JAN-82       1300            10
    
    14 rows selected.

    union all与union的性能哪个更高?

    union all性能更高:因为union all 不进行排序,也不去重

    2. 交集:INTERSECT

    SQL> select * from t1
      2  intersect
      3  select * from t2;
    
         EMPNO ENAME      JOB           MGR HIREDATE        SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
          7369 SMITH      CLERK          7902 17-DEC-80        800            20
          7566 JONES      MANAGER          7839 02-APR-81       2975            20
          7788 SCOTT      ANALYST          7566 19-APR-87       3000            20
          7876 ADAMS      CLERK          7788 23-MAY-87       1100            20
          7902 FORD       ANALYST          7566 03-DEC-81       3000            20

    3. 补集:MINUS
    查询select * from e2的补集:

    SQL> select * from t1
      2  minus
      3  select * from t2;
    
         EMPNO ENAME      JOB           MGR HIREDATE        SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
          7782 CLARK      MANAGER          7839 09-JUN-81       2450            10
          7839 KING       PRESIDENT        17-NOV-81       5000            10
          7934 MILLER     CLERK          7782 23-JAN-82       1300            10
  3. SET运算符规则

    1. 每个查询列表中的表达式的个数和数据类型必须相匹配

    select后面的列的个数必须要一致:

    select empno,ename,deptno,sal from e1
    union all
    select empno,ename,deptno from e2;
    
    select empno,ename,deptno,sal from e1
    *
    第 1 行出现错误:
    ORA-01789: 查询块具有不正确的结果列数
    
    select empno,ename,deptno,sal from e1
    union all
    select empno,ename,deptno,null from e2
    
    null是可以的
    数据类型必须一致:
    
    select empno,ename,deptno,sal from e1
    union all
    select empno,ename,deptno,‘abc‘ from e2
    
    第 1 行出现错误:
    ORA-01790: 表达式必须具有与对应表达式相同的数据类型

    2. 可以使用括号来改变执行的顺序

    select * from e1
    intersect
    select * from e2
    union
    select * from e2;
    
    ENAME  EMPNO   SAL DEPTNO
    ------ ----- ----- ------
    ADAMS   7876  1100     20
    ALLEN   7499  1600     30
    BLAKE   7698  2850     30
    FORD    7902  3000     20
    JAMES   7900   950     30
    JONES   7566  2975     20
    MARTIN  7654  1250     30
    SCOTT   7788  4000     20
    SMITH   7369   800     20
    TURNER  7844  1500     30
    WARD    7521  1250     30
    
    已选择11行。
    
    select * from e1
    intersect
    (select * from e2
    union
    select * from e2);
    
    ENAME  EMPNO   SAL DEPTNO
    ------ ----- ----- ------
    ADAMS   7876  1100     20
    FORD    7902  3000     20
    JONES   7566  2975     20
    SCOTT   7788  4000     20
    SMITH   7369   800     20

    3. ORDER BY 子句的使用:

    除了union all之外,其他的集合运算符都要按照第一个查询的第一列,进行升序

    只可以在语句的最后出现:

    select empno,ename,sal,deptno from e2
    union
    select empno,ename,sal,deptno from e2
    order by ename desc;
    
    EMPNO ENAME    SAL DEPTNO
    ----- ------ ----- ------
     7521 WARD    1250     30
     7844 TURNER  1500     30
     7369 SMITH    800     20
     7788 SCOTT   4000     20
     7654 MARTIN  1250     30
     7566 JONES   2975     20
     7900 JAMES    950     30
     7902 FORD    3000     20
     7698 BLAKE   2850     30
     7499 ALLEN   1600     30
     7876 ADAMS   1100     20

    可以使用第一个查询语句的列名、别名、或位置(号)

    select empno,ename name1,sal,deptno from e2
    union
    select empno,ename name2,sal,deptno from e2
    order by name1 desc;
    
    EMPNO NAME1        SAL DEPTNO
    ----- ---------- ----- ------
     7521 WARD        1250     30
     7844 TURNER      1500     30
     7369 SMITH        800     20
     7788 SCOTT       4000     20
     7654 MARTIN      1250     30
     7566 JONES       2975     20
     7900 JAMES        950     30
     7902 FORD        3000     20
     7698 BLAKE       2850     30
     7499 ALLEN       1600     30
     7876 ADAMS       1100     20
    
    已选择11行。
    
    select empno,ename name1,sal,deptno from e2
    union
    select empno,ename name2,sal,deptno from e2
    order by name2 desc;
    
    order by name2 desc
             *
    第 4 行出现错误:
    ORA-00904: "NAME2": 标识符无效
    
    select empno,ename,sal,deptno from e2
    union
    select empno,to_char(sal) salary, null,deptno from e2
    order by 2;
    
    EMPNO ENAME    SAL DEPTNO
    ----- ------ ----- ------
     7876 1100             20
     7521 1250             30
     7654 1250             30
     7844 1500             30
     7499 1600             30
     7698 2850             30
     7566 2975             20
     7902 3000             20
     7788 4000             20
     7369 800              20
     7900 950              30
     7876 ADAMS   1100     20
     7499 ALLEN   1600     30
     7698 BLAKE   2850     30
     7902 FORD    3000     20
     7900 JAMES    950     30
     7566 JONES   2975     20
     7654 MARTIN  1250     30
     7788 SCOTT   4000     20
     7369 SMITH    800     20
     7844 TURNER  1500     30
     7521 WARD    1250     30

    第一个查询语句的列名出现在结果中

    select empno,to_char(sal) salary, null,deptno from e2
    union
    select empno,ename,sal,deptno from e2
    order by 2
    /
    
    EMPNO SALARY                                         NULL DEPTNO
    ----- ---------------------------------------- ---------- ------
     7876 1100                                                    20
     7521 1250                                                    30
     7654 1250                                                    30
     7844 1500                                                    30
     7499 1600                                                    30
     7698 2850                                                    30
     7566 2975                                                    20
     7902 3000                                                    20
     7788 4000                                                    20
     7369 800                                                     20
     7900 950                                                     30
     7876 ADAMS                                          1100     20
     7499 ALLEN                                          1600     30
     7698 BLAKE                                          2850     30
     7902 FORD                                           3000     20
     7900 JAMES                                           950     30
     7566 JONES                                          2975     20
     7654 MARTIN                                         1250     30
     7788 SCOTT                                          4000     20
     7369 SMITH                                           800     20
     7844 TURNER                                         1500     30
     7521 WARD                                           1250     30

    查询语句的匹配:个数和数据类型的匹配

    select empno,ename,sal,deptno from e1
    union
    select 1,to_char(sal),null,10 from e2;
    
    EMPNO ENAME    SAL DEPTNO
    ----- ------ ----- ------
        1 1100             10
        1 1250             10
        1 1500             10
        1 1600             10
        1 2850             10
        1 2975             10
        1 3000             10
        1 4000             10
        1 800              10
        1 950              10
     7369 SMITH    800     20
     7566 JONES   2975     20
     7782 CLARK   2450     10
     7788 SCOTT   4000     20
     7839 KING    5000     10
     7876 ADAMS   1100     20
     7902 FORD    3000     20
     7934 MILLER  1300     10
时间: 2024-10-19 20:33:42

集合运算符之全集、交集、补集【weber出品必属精品】的相关文章

创建和管理表【weber出品必属精品】

创建表 必须有 : 1. CREATE TABLE 的权限 SQL> conn /as sysdba 已连接. SQL> create user test default tablespace users identified by a; 用户已创建. SQL> conn test/a ERROR: ORA-01045: user TEST lacks CREATE SESSION privilege; logon denied 警告: 您不再连接到 ORACLE. SQL> co

oracle数据库事务相关【weber出品必属精品】

事务的概念:事务:一个事务由一组构成一个逻辑操作的DML语句组成 事务有开始有结束,事务以DML语句开始,以Conmmit和Rollback结束.以下情况会使得事务结束: 1. 执行COMMIT 或者 ROLLBACK 语句 2. 执行DDL或者 DCL语句 3. 用户退出 4. 系统崩溃 一个事务可以包含下列语句: 1. 对数据做出一致性修改的DML语句 2. 一个 DDL 语句 3. 一个 DCL语句 DDL与和DCL语句执行的过程: 1. 首先发出COMMIT; 2. 执行对数据字典的DM

LAMP架构搭建+Discuz论坛搭建【weber出品必属精品】

一.     本机简介: 本机系统: CentOS-6.4-x86_64 主机名:oracle.ywb IP地址:192.168.146.129 二.     在Linux环境下安装Apache步骤 首先将准备好的文件通过PSCP发送至Linux的/Root/test/soft目录下 在windows下按住Ctrl+R,打开运行,输入CMD进入DOS命令行.在dos命令行中使用pscp –scp  命令将要上传的文件上传至Linux中. 上传成功后.我们总共要安装四个文件.第一个我们首先解压:a

linux删除ORACLE【weber出品必属精品】

关闭数据库 sqlplus / as sysdba shutdown abort 清除oracle软件 su - oracle cd $ORACLE_BASE rm -rf * rm -rf /etc/ora* 删除之前的设置的配置文件的内容 如果之前改过版本,编辑文件 /etc/redhat-release 把Red Hat Enterprise Linux Server release 4 (Tikanga) 改成版本5 vi /etc/pam.d/login 行末删除以下内容 sessio

使用DML语句【weber出品必属精品】

DML语句包含以下语法: INSERT:往一个表中增加新行 DELETE:从一个表中删除掉现有的行 UPDATE:更改一个表中现有的行 INSERT语句语法:INSERT INTO TABLE(COLUMN1,COLUMN2,....) VALUES(VAL1,VAL2,...)使用这种方法只能一次插入一行数据 插入包含每一个列值的新行,按缺省顺序列出表中所有的列值. 创建带有结构的空表 SQL> create table t as select * from emp where 1=2;---

静默安装ORACLE【weber出品必属精品】

由于本次的实验我是将上次的虚拟机直接拷贝过来,然后将里面图形化界面安装好了的oracle给删除,再次重新安装,所以这里要修改一些配置. 首先修改的是我们的IP地址 # system-config-network 完成后我们修改一下hosts文件,将里面的ip地址给修改一下 # vi /etc/hosts 接着我们删除上次安装过的ORACLE文件 # cd $ORACLE_BASE # ls # rm -rf * 进入root:rm -rf /etc/ora* 还是在安装前进行配置. 接下来进行静

ORACLE SQL单行函数(一)【weber出品必属精品】

1.SUBSTR:求父串中的子串 SUBSTR('HelloWorld',1,5) 1:代表子串的起始位置,如果为正,正数,如果为负,倒数 5:代表字串的终止位置,只能向右数,可以省略,如果省略就是数到最后 SUBSTR:求父串中的子串 SUBSTR('HelloWorld',1,5) 1:代表子串的起始位置,如果为正,正数,如果为负,倒数 5:代表字串的终止位置,只能向右数,可以省略,如果省略就是数到最后 2.LENGTH:求字符串的长度 SQL> select LENGTH('HELLOWO

ORACLE SQL单行函数(二)【weber出品必属精品】

11.dual:虚表,任何用户都可以使用,表结构如下: SQL> desc dual Name Null? Type ----------------------------------------- -------- ---------------------------- DUMMY VARCHAR2(1) 12.dual的作用: 1. 查询数据库系统日期 2. 进行四则运算 SQL> select sysdate from dual; ---这里查询数据库系统日期 SYSDATE ---

ORACLE SQL单行函数(三)【weber出品必属精品】

16.L:代表本地货币符,这个和区域有关.这个时候我们想来显示一下人民币的符号:¥ $ vi .bash_profile ---写入如下内容: export NLS_LANG='SIMPLIFIED CHINESE'_CHINA.AL32UTF8 ---修改成简体中文+地区+字符集 source .bash_profile ---让环境变量生效 [[email protected] ~]$ sqlplus scott/tiger SQL*Plus: Release 10.2.0.5.0 - Pr

全世界最详细的图形化VMware中linux环境下oracle安装(二)【weber出品必属精品】

<ORACLE 10.2.05版本的升级补丁安装> 首先我们解压 $ unzip p8202632_10205_LINUX.zip 解压后我们会发现多出了个文件夹,他是:Disk1,进入Disk1.然后执行安装: $ ./runInstaller 执行脚本 # /u01/app/oracle/10.2.0/db_1/root.sh Running Oracle 10g root.sh script... The following environment variables are set a