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行。
原文地址:https://www.cnblogs.com/shizhengwen/p/14672965.html