为什么使用视图
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行。