视图相关知识的汇总
创始人
2024-01-28 04:30:11

重点大纲

  • 描述视图
  • 创建,改变视图的定义,删除视图
  • 通过视图重新找回数据
  • 通过视图插入,更新和删除数据
  • 创建和使用inline视图
  • 执行Top-N 分析

什么是视图?

视图是基于一张表或者另一张视图的逻辑表。 视图本身不包含数据。视图被存储在数据字典中。

为什么使用视图?

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

 

创建视图

  • 在create view 语句中可以嵌入子查询
  • 子查询可以包含复杂的SELECT语法。

授权:

SQL> 
SQL> conn / as sysdba
Connected.
SQL> 
SQL> grant create view to scott;
grant create view to scott*
ERROR at line 1:
ORA-01917: user or role 'SCOTT' does not existSQL>  show con_name;CON_NAME
------------------------------
CDB$ROOT
SQL> alter session set container=PDB1;Session altered.SQL> grant create view to scott;Grant succeeded.SQL> conn scott/tiger
ERROR:
ORA-01017: invalid username/password; logon deniedWarning: You are no longer connected to ORACLE.
SQL> conn scott/tiger@PDB1;
Connected.
SQL> 
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
SET CONTAINER12 rows selected.SQL> 

创建视图

SQL> show con_name;CON_NAME
------------------------------
CDB$ROOT
SQL> alter session set container=PDB1;Session altered.SQL> conn scott/tiger@PDB1;
Connected.
SQL> 
SQL> 
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 INDEXTYPEPRIVILEGE
----------------------------------------
SET CONTAINER12 rows selected.SQL> create view vu102  as3  select empno,ename,sal,deptno from emp where deptno = 10;View created.SQL> set pagesize 200
SQL> set linesize 200
SQL> 

视图中增加一个字段,

SQL> select * from vu10;EMPNO ENAME             SAL     DEPTNO
---------- ---------- ---------- ----------7782 CLARK            2450         107839 KING             5000         107934 MILLER           1300         10SQL> create or replace view vu102  as3  select empno,ename,hiredate,sal,deptno from emp where deptno = 10;View created.SQL> select * from vu10;EMPNO ENAME      HIREDATE         SAL     DEPTNO
---------- ---------- --------- ---------- ----------7782 CLARK      09-JUN-81       2450         107839 KING       17-NOV-81       5000         107934 MILLER     23-JAN-82       1300         10SQL> SQL> 
SQL> create or replace view vu10(employee_id,first_name,hire_date,salary,department_id)2  as3  select empno,ename,hiredate,sal,deptno from emp where deptno = 10;View created.SQL> select * from vu10;EMPLOYEE_ID FIRST_NAME HIRE_DATE     SALARY DEPARTMENT_ID
----------- ---------- --------- ---------- -------------7782 CLARK      09-JUN-81       2450            107839 KING       17-NOV-81       5000            107934 MILLER     23-JAN-82       1300            10SQL>

强制建视图

SQL> 
SQL> create or replace view vu202  as3  select empno,ename,hiredate,sal,deptno from e05 where deptno = 20;
select empno,ename,hiredate,sal,deptno from e05 where deptno = 20*
ERROR at line 3:
ORA-00942: table or view does not existSQL> desc vu20
ERROR:
ORA-04043: object vu20 does not existSQL> create or replace force view vu202  as3  select empno,ename,hiredate,sal,deptno from e05 where deptno = 20;Warning: View created with compilation errors.SQL> 
SQL> desc vu20
ERROR:
ORA-24372: invalid object for describeSQL> create table e05 as select * from emp;Table created.SQL> desc vu20;Name                                                                                                              Null?    Type----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------EMPNO                                                                                                                      NUMBER(4)ENAME                                                                                                                      VARCHAR2(10)HIREDATE                                                                                                                   DATESAL                                                                                                                        NUMBER(7,2)DEPTNO                                                                                                                     NUMBER(2)SQL> 
SQL> select * from vu20;EMPNO ENAME      HIREDATE         SAL     DEPTNO
---------- ---------- --------- ---------- ----------7369 SMITH      17-DEC-80        800         207566 JONES      02-APR-81       2975         207788 SCOTT      24-JAN-87       3000         207876 ADAMS      02-APR-87       1100         207902 FORD       03-DEC-81       3000         20SQL> 
SQL> select * from tab;TNAME                                                                                                                            TABTYPE        CLUSTERID
-------------------------------------------------------------------------------------------------------------------------------- ------------- ----------
DEPT                                                                                                                             TABLE
EMP                                                                                                                              TABLE
BONUS                                                                                                                            TABLE
SALGRADE                                                                                                                         TABLE
T01                                                                                                                              TABLE
E01                                                                                                                              TABLE
E02                                                                                                                              TABLE
DETAIL_DEPT                                                                                                                      TABLE
T03                                                                                                                              TABLE
VU10                                                                                                                             VIEW
VU20                                                                                                                             VIEW
E05                                                                                                                              TABLE12 rows selected.SQL> select text from user_views where view_name='VU20';TEXT
--------------------------------------------------------------------------------
select empno,ename,hiredate,sal,deptno from e05 where deptno = 20SQL> select * from (select empno,ename,hiredate,sal,deptno from e05 where deptno = 20);EMPNO ENAME      HIREDATE         SAL     DEPTNO
---------- ---------- --------- ---------- ----------7369 SMITH      17-DEC-80        800         207566 JONES      02-APR-81       2975         207788 SCOTT      24-JAN-87       3000         207876 ADAMS      02-APR-87       1100         207902 FORD       03-DEC-81       3000         20SQL> 

with check option:

SQL> insert into vu20 values(1,'tom',sysdate,1200,10);1 row created.SQL> select * from vu20;EMPNO ENAME      HIREDATE         SAL     DEPTNO
---------- ---------- --------- ---------- ----------7369 SMITH      17-DEC-80        800         207566 JONES      02-APR-81       2975         207788 SCOTT      24-JAN-87       3000         207876 ADAMS      02-APR-87       1100         207902 FORD       03-DEC-81       3000         20SQL> select * from vu10;EMPLOYEE_ID FIRST_NAME HIRE_DATE     SALARY DEPARTMENT_ID
----------- ---------- --------- ---------- -------------7782 CLARK      09-JUN-81       2450            107839 KING       17-NOV-81       5000            107934 MILLER     23-JAN-82       1300            10SQL> select * from e05;EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------7369 SMITH      CLERK           7902 17-DEC-80        800                    207499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         307521 WARD       SALESMAN        7698 22-FEB-81       1250        500         307566 JONES      MANAGER         7839 02-APR-81       2975                    207654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         307698 BLAKE      MANAGER         7839 01-MAY-81       2850                    307782 CLARK      MANAGER         7839 09-JUN-81       2450                    107788 SCOTT      ANALYST         7566 24-JAN-87       3000                    207839 KING       PRESIDENT            17-NOV-81       5000                    107844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         307876 ADAMS      CLERK           7788 02-APR-87       1100                    207900 JAMES      CLERK           7698 03-DEC-81        950                    307902 FORD       ANALYST         7566 03-DEC-81       3000                    207934 MILLER     CLERK           7782 23-JAN-82       1300                    101 tom                                              7001 tom                             17-NOV-22       1200                    1016 rows selected.SQL> roll
Rollback complete.
SQL> select * from e05;EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------7369 SMITH      CLERK           7902 17-DEC-80        800                    207499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         307521 WARD       SALESMAN        7698 22-FEB-81       1250        500         307566 JONES      MANAGER         7839 02-APR-81       2975                    207654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         307698 BLAKE      MANAGER         7839 01-MAY-81       2850                    307782 CLARK      MANAGER         7839 09-JUN-81       2450                    107788 SCOTT      ANALYST         7566 24-JAN-87       3000                    207839 KING       PRESIDENT            17-NOV-81       5000                    107844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         307876 ADAMS      CLERK           7788 02-APR-87       1100                    207900 JAMES      CLERK           7698 03-DEC-81        950                    307902 FORD       ANALYST         7566 03-DEC-81       3000                    207934 MILLER     CLERK           7782 23-JAN-82       1300                    101 tom                                              70015 rows selected.SQL> create or replace force view vu202  as3  select empno,ename,hiredate,sal,deptno from e05 where deptno = 204  with check option;View created.SQL> insert into vu20 values(1,'tom',sysdate,1200,10);
insert into vu20 values(1,'tom',sysdate,1200,10)*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violationSQL> insert into vu20 values(1,'tom',sysdate,1200,20);1 row created.SQL> 

对视图执行DML操作的规则

如果一个视图包含下面这些,不能通过该视图增加数据:

  • 组函数
  • GROUP BY 子句
  • DISTINCT 关键字
  • 伪列ROWNUM 关键字
  • 被表达式定义的列
  • 没有被视图选择,数据库表中的NOT NULL列。

删除视图

DROP VIEW VIEW_NAME;

SQL> drop view vu20;View dropped.SQL>

 内联视图

  • 内联视图是对你在SQL语句中使用的别名(或相关名称)的子查询
  • 主查询的FROM 子句中指定的子查询是内联视图的样例
  • 内联视图不是schema对象

建立一个新用户 pstest

SQL> alter session set container=PDB1;Session altered.SQL> grant connect,resource to pstest identified by pstest;Grant succeeded.SQL> conn pstest/pstest@PDB1;
Connected.
SQL> 
SQL> 

另一个用户下授予pstest 访问某个视图的权限

SQL> 
SQL> grant select on vu10 to pstest;Grant succeeded.SQL> 
SQL> select * from scott.vu10;EMPLOYEE_ID FIRST_NAME HIRE_DATE     SALARY DEPARTMENT_ID
----------- ---------- --------- ---------- -------------7782 CLARK      09-JUN-81       2450            107839 KING       17-NOV-81       5000            107934 MILLER     23-JAN-82       1300            10SQL> show user;
USER is "PSTEST"
SQL> 

创建视图

SQL> 
SQL> 
SQL> select * from (select ename,sal from emp order by sal desc);ENAME             SAL
---------- ----------
KING             5000
FORD             3000
SCOTT            3000
JONES            2975
BLAKE            2850
CLARK            2450
ALLEN            1600
TURNER           1500
MILLER           1300
WARD             1250
MARTIN           1250
ADAMS            1100
JAMES             950
SMITH             800
tom               70015 rows selected.SQL> create or replace view vutest as select ename,sal from emp order by sal desc;View created.SQL> select * from vutest;ENAME             SAL
---------- ----------
KING             5000
FORD             3000
SCOTT            3000
JONES            2975
BLAKE            2850
CLARK            2450
ALLEN            1600
TURNER           1500
MILLER           1300
WARD             1250
MARTIN           1250
ADAMS            1100
JAMES             950
SMITH             800
tom               70015 rows selected.SQL> 

Top-n 分析

  • Top-n查询查找一列中n个最大或者最小的数值
  • 最大和最小值都被认为是Top-n查询

相关内容

热门资讯

万的繁体字怎么写 繁体字怎么写... 一、繁体字大全简化偏旁讠[訁] 饣[飠] [昜] 纟[糹] [臤] 只[戠] 钅[釒] 呙[咼]A爱...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
桂林市属于哪个省 桂林为什么划... 桂林 [guì lín]广西壮族自治区下辖市桂林,简称桂,是世界著名风景游览城市、全国重要高新技术产...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...