第八章集合运算课堂笔记和练习

– 集合运算
所有的集合运算符与等号的优先级相同,如果 SQL 语句包含多个集合运算符并且没有圆括号明确地指定另一个顺序,Oracle 服务器将以从左到右的顺序计算。

  • 准备工作
  • 此项操作为练习而作,可先不管直接执行

     --  1.创建员工历史岗位表 emp_jobhistory:
          create table emp_jobhistory(
            id number,--流水号
            empno number,--员工编号
            job varchar2(9),--岗位
            begindate date,--开始日期
            sal number(7,2)--在该岗位时工资
        )
      --  2.插入如下数据:
          insert into  emp_jobhistory  values (1,7839,'TRAINEE','17-11月-81',500);
          insert into  emp_jobhistory  values (2,7839,'SALESMAN','17-2月-82',1800);
          insert into  emp_jobhistory  values (3,7839,'CLERK','17-2月-83',2000);
          insert into  emp_jobhistory  values (4,7839,'SALESMAN','17-2月-85',1800);
          insert into  emp_jobhistory  values (5,7839, 'MANAGER','17-2月-87',3000);
    

    – sql 标准

    • union联合运算
      – 1.去重
      – 2.默认第一列升序排序
      – 3.使用第一个语句的列名定义查询的列名
      – 4.多个sql语句列个数一致、类型一致、名称可以不一致
      – 5.每个查询不能包含自己的Order by子句,只能在联合之后使用Order by子句

        --  查询编号为7839的员工当前工资、岗位及历史工资、岗位
            select sal 工资, job 岗位
              from emp
             where empno = 7839
            union
            select sal, job
              from emp_jobhistory
             where empno = 7839;
      
    • union all 完全联合运算
      – 1.不去重
      – 2.默认不排序
      – 3.使用第一个语句的列名定义查询的列名
      – 4.多个sql语句列个数一致、类型一致、名称可以不一致
      – 5.每个查询不能包含自己的Order by子句,只能在联合之后使用Order by子句

        --  查询编号为7839的员工当前工资、岗位及历史工资、岗位,重复行记录不要求被去掉。
            select sal, job
              from emp
             where empno = 7839
            union all
            select sal, job
              from emp_jobhistory
             where empno = 7839;
      

    – oracle 自有

    • 相交运算(intersect):获取多个SQL语句之间的共有的数据(取交集)

        --  查询哪些员工做过岗位调动?
            select empno from emp intersect select empno from emp_jobhistory;
      
    • 相减运算 (minus) :保留第一个SQL语句有的,第二个没有的数据

        --  查询哪些员工没做过岗位调动?
            select empno from emp
            minus
            select empno from emp_jobhistory;
      
        --  1.用集合运算,列出不包含job为SALESMAN 的部门的部门号。
            select deptno from dept 
            minus
            select deptno from emp 
             where job = 'SALESMAN';
      

猜你喜欢

转载自blog.csdn.net/bb_code_exchange/article/details/81335774