zoukankan      html  css  js  c++  java
  • oracle的(视图、序列、集合)

    为什么使用视图

    1、限制数据访问
    2、使复杂查询更容易
    3、提供数据独立性
    4、相同的数据表示为不同的视图

    创建视图的准备工作

    -- 切换到最高权限
    SQL> conn / as sysdba
    已连接。
    
    -- 授权创建视图
    SQL> grant create view to scott;
    
    授权成功。
    
    -- 再回到用 scott 户下
    SQL> conn scott/tiger
    已连接。
    
    -- 这下创建视图的权限就有了
    SQL> select * from session_privs;
    
    PRIVILEGE
    ----------------------------------------
    CREATE SESSION
    UNLIMITED TABLESPACE
    CREATE TABLE
    CREATE CLUSTER
    CREATE VIEW
    CREATE SEQUENCE
    CREATE PROCEDURE
    CREATE TRIGGER
    CREATE TYPE
    CREATE OPERATOR
    CREATE INDEXTYPE
    
    已选择11行。

    创建一个简单的视图

    SQL> create view vu10 as
      2  select empno,ename,sal,deptno from emp where deptno=10;
    
    视图已创建。
    
    SQL> select * from vu10;
    
         EMPNO ENAME             SAL     DEPTNO
    ---------- ---------- ---------- ----------
          7782 CLARK            2450         10
          7839 KING             5000         10
          7934 MILLER           1300         10

    修改视图

    SQL> create or replace view vu10 as  select empno,ename, hiredate,sal,deptno from emp where deptno=10;
    
    视图已创建。
    
    SQL> select * from vu10;
    
         EMPNO ENAME      HIREDATE              SAL     DEPTNO
    ---------- ---------- -------------- ---------- ----------
          7782 CLARK      09-6月 -81           2450         10
          7839 KING       17-11月-81           5000         10
          7934 MILLER     23-1月 -82           1300         10

    修改视图标题名称

    SQL> create or replace view vu10(employee_id, first_name, hire_date, salary, department_id) as  select empno,ename, hiredate,sal,deptno from emp where deptno=10;
    
    视图已创建。
    
    SQL> select * from vu10;
    
    EMPLOYEE_ID FIRST_NAME HIRE_DATE          SALARY DEPARTMENT_ID
    ----------- ---------- -------------- ---------- -------------
           7782 CLARK      09-6月 -81           2450            10
           7839 KING       17-11月-81           5000            10
           7934 MILLER     23-1月 -82           1300            10

    往视图插入数据

    SQL> insert into vu10 values (2,'tom', sysdate, 1200,10);
    
    已创建 1 行。
    
    SQL> select * from emp;
    
         EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
             1 tom                                                   700
          7369 SMITH      CLERK           7902 17-12月-80            800                    20
          7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
          7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
          7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
          7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
          7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
          7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
          7788 X_SCOTT    ANALYST         7566 19-4月 -87           3000                    20
          7839 KING       PRESIDENT            17-11月-81           5000                    10
          7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
          7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
          7900 JAMES      CLERK           7698 03-12月-81            950                    30
          7902 FORD       ANALYST         7566 03-12月-81           3000                    20
          7934 MILLER     CLERK           7782 23-1月 -82           1300                    10
             2 tom                             18-4月 -21           1200                    10

    删除视图数据

    SQL> delete vu10 where first_name='MILLER';
    
    已删除 1 行。
    
    SQL> select * from vu10;
    
    EMPLOYEE_ID FIRST_NAME HIRE_DATE          SALARY DEPARTMENT_ID
    ----------- ---------- -------------- ---------- -------------
           7782 CLARK      09-6月 -81           2450            10
           7839 KING       17-11月-81           5000            10
              2 tom        18-4月 -21           1200            10
    
    SQL> select * from emp;
    
         EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
             1 tom                                                   700
          7369 SMITH      CLERK           7902 17-12月-80            800                    20
          7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
          7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
          7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
          7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
          7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
          7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
          7788 X_SCOTT    ANALYST         7566 19-4月 -87           3000                    20
          7839 KING       PRESIDENT            17-11月-81           5000                    10
          7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
          7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
          7900 JAMES      CLERK           7698 03-12月-81            950                    30
          7902 FORD       ANALYST         7566 03-12月-81           3000                    20
             2 tom                             18-4月 -21           1200                    10
    
    已选择15行。

    视图包含下面这些,不能删除和修改数据

    • 组函数
    • group by 字句
    • distinct 关键字
    • 伪列rownum关键字
    • 被表达式定义的列

    序列

    创建序列

    SQL> create sequence saq_empno start with 7935 increment by 1 cache 50;
    
    序列已创建。
    
    -- 查看序列
    SQL> select * from user_sequences;
    
    SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
    ------------------------------ ---------- ---------- ------------ - - ---------- -----------
    SAQ_EMPNO                               1 1.0000E+28            1 N N         50        7935
    
    -- 使用序列, 由于未初始化序列所以没有定义
    SQL> select SAQ_EMPNO.currval from dual;
    select SAQ_EMPNO.currval from dual
           *1 行出现错误:
    ORA-08002: 序列 SAQ_EMPNO.CURRVAL 尚未在此会话中定义
    
    
    -- 初始化序列
    SQL> select SAQ_EMPNO.nextval from dual;
    
       NEXTVAL
    ----------
          7935
    
    -- 这时就可以使用序列了
    SQL> select SAQ_EMPNO.currval from dual;
    
       CURRVAL
    ----------
          7935
    
    -- 使用序列创建数据
    SQL> insert into emp (empno) values (SAQ_EMPNO.nextval);
    
    已创建 1 行。
    
    SQL> /
    
    已创建 1 行。
    
    SQL> /
    
    已创建 1 行。
    
    
    SQL> select * from emp;
    
         EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
             1 tom                                                   700
          7369 SMITH      CLERK           7902 17-12月-80            800                    20
          7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
          7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
          7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
          7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
          7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
          7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
          7788 X_SCOTT    ANALYST         7566 19-4月 -87           3000                    20
          7839 KING       PRESIDENT            17-11月-81           5000                    10
          7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
          7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
          7900 JAMES      CLERK           7698 03-12月-81            950                    30
          7902 FORD       ANALYST         7566 03-12月-81           3000                    20
             2 tom                             18-4月 -21           1200                    10
          7935
          7936
          7937
          7938

    集合set运算符 

    创建测试数据

    SQL> create table e03 as select * from emp where deptno=10;
    
    表已创建。
    
    SQL> insert into e03 values(7935,'ALVIN','CLERK',7698,sysdate,1300,null,30);
    
    已创建 1 行。
    
    
    SQL> select * from emp;
    
         EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
             1 tom                                                   700
          7369 SMITH      CLERK           7902 17-12月-80            800                    20
          7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
          7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
          7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
          7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
          7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
          7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
          7788 X_SCOTT    ANALYST         7566 19-4月 -87           3000                    20
          7839 KING       PRESIDENT            17-11月-81           5000                    10
          7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
          7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
          7900 JAMES      CLERK           7698 03-12月-81            950                    30
          7902 FORD       ANALYST         7566 03-12月-81           3000                    20
             2 tom                             18-4月 -21           1200                    10
          7935
          7936
          7937
          7938
    
    已选择19行。
    
    SQL> select * from e03;
    
         EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
          7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
          7839 KING       PRESIDENT            17-11月-81           5000                    10
             2 tom                             18-4月 -21           1200                    10
          7935 ALVIN      CLERK           7698 20-4月 -21           1300                    30
    
    SQL>

    两张表都创建了

    union 求并集 的方式 数据放到一起并去重

    SQL> select * from e03 union select * from emp;
    
         EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
             1 tom                                                   700
             2 tom                             18-4月 -21           1200                    10
          7369 SMITH      CLERK           7902 17-12月-80            800                    20
          7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
          7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
          7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
          7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
          7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
          7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
          7788 X_SCOTT    ANALYST         7566 19-4月 -87           3000                    20
          7839 KING       PRESIDENT            17-11月-81           5000                    10
          7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
          7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
          7900 JAMES      CLERK           7698 03-12月-81            950                    30
          7902 FORD       ANALYST         7566 03-12月-81           3000                    20
          7935 ALVIN      CLERK           7698 20-4月 -21           1300                    30
          7935
          7936
          7937
          7938
    
    已选择20行。

    union all 求并集 数据放到一起不去重

    SQL> select * from e03 union all select * from emp;
    
         EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
          7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
          7839 KING       PRESIDENT            17-11月-81           5000                    10
             2 tom                             18-4月 -21           1200                    10
          7935 ALVIN      CLERK           7698 20-4月 -21           1300                    30
             1 tom                                                   700
          7369 SMITH      CLERK           7902 17-12月-80            800                    20
          7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
          7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
          7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
          7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
          7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
          7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
          7788 X_SCOTT    ANALYST         7566 19-4月 -87           3000                    20
          7839 KING       PRESIDENT            17-11月-81           5000                    10
          7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
          7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
          7900 JAMES      CLERK           7698 03-12月-81            950                    30
          7902 FORD       ANALYST         7566 03-12月-81           3000                    20
             2 tom                             18-4月 -21           1200                    10
          7935
          7936
          7937
          7938
    
    已选择23行。

    intersect 求交集 

    SQL> select * from e03 intersect select * from emp;
    
         EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
             2 tom                             18-4月 -21           1200                    10
          7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
          7839 KING       PRESIDENT            17-11月-81           5000                    10

    minus 求差集 这个结果和执行的位置有关

    SQL> select * from e03 minus select * from emp;
    
         EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
          7935 ALVIN      CLERK           7698 20-4月 -21           1300                    30
    
    
    SQL> select * from emp minus select * from e03;
    
         EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
             1 tom                                                   700
          7369 SMITH      CLERK           7902 17-12月-80            800                    20
          7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
          7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
          7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
          7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
          7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
          7788 X_SCOTT    ANALYST         7566 19-4月 -87           3000                    20
          7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
          7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
          7900 JAMES      CLERK           7698 03-12月-81            950                    30
          7902 FORD       ANALYST         7566 03-12月-81           3000                    20
          7935
          7936
          7937
          7938
    
    已选择16行。

    union all 可以和任意表连接 只要字段对着就行

    SQL> select *  from dept;
    
        DEPTNO DNAME          LOC
    ---------- -------------- -------------
            10 ACCOUNTING     NEW YORK
            20 RESEARCH       DALLAS
            30 SALES          CHICAGO
            40 OPERATIONS     BOSTON
    
    SQL> select * from emp minus select * from e03;
    
         EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
             1 tom                                                   700
          7369 SMITH      CLERK           7902 17-12月-80            800                    20
          7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
          7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
          7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
          7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
          7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
          7788 X_SCOTT    ANALYST         7566 19-4月 -87           3000                    20
          7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
          7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20
          7900 JAMES      CLERK           7698 03-12月-81            950                    30
          7902 FORD       ANALYST         7566 03-12月-81           3000                    20
          7935
          7936
          7937
          7938
    
    已选择16行。
  • 相关阅读:
    Mac 生成public_key
    OmniGraffler软件和激活码
    Maven将本地项目打包后引入本地另一个项目
    spring boot 项目启动无法访问,排查
    服务端推送
    使用IDEA进行commit合并(折叠)
    将map转为Object,支持 Date/Boolean
    mysql 删除同样记录只保留一条
    Springboot文件上传限制
    Springboot 上传文件
  • 原文地址:https://www.cnblogs.com/shizhengwen/p/14672965.html
Copyright © 2011-2022 走看看