• 视图相关知识的汇总


    重点大纲

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

    什么是视图?

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

    为什么使用视图?

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

     

    创建视图

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

    授权:

    1. SQL>
    2. SQL> conn / as sysdba
    3. Connected.
    4. SQL>
    5. SQL> grant create view to scott;
    6. grant create view to scott
    7. *
    8. ERROR at line 1:
    9. ORA-01917: user or role 'SCOTT' does not exist
    10. SQL> show con_name;
    11. CON_NAME
    12. ------------------------------
    13. CDB$ROOT
    14. SQL> alter session set container=PDB1;
    15. Session altered.
    16. SQL> grant create view to scott;
    17. Grant succeeded.
    18. SQL> conn scott/tiger
    19. ERROR:
    20. ORA-01017: invalid username/password; logon denied
    21. Warning: You are no longer connected to ORACLE.
    22. SQL> conn scott/tiger@PDB1;
    23. Connected.
    24. SQL>
    25. SQL> select * from session_privs;
    26. PRIVILEGE
    27. ----------------------------------------
    28. CREATE SESSION
    29. UNLIMITED TABLESPACE
    30. CREATE TABLE
    31. CREATE CLUSTER
    32. CREATE VIEW
    33. CREATE SEQUENCE
    34. CREATE PROCEDURE
    35. CREATE TRIGGER
    36. CREATE TYPE
    37. CREATE OPERATOR
    38. CREATE INDEXTYPE
    39. SET CONTAINER
    40. 12 rows selected.
    41. SQL>

    创建视图

    1. SQL> show con_name;
    2. CON_NAME
    3. ------------------------------
    4. CDB$ROOT
    5. SQL> alter session set container=PDB1;
    6. Session altered.
    7. SQL> conn scott/tiger@PDB1;
    8. Connected.
    9. SQL>
    10. SQL>
    11. SQL> select * from session_privs;
    12. PRIVILEGE
    13. ----------------------------------------
    14. CREATE SESSION
    15. UNLIMITED TABLESPACE
    16. CREATE TABLE
    17. CREATE CLUSTER
    18. CREATE VIEW
    19. CREATE SEQUENCE
    20. CREATE PROCEDURE
    21. CREATE TRIGGER
    22. CREATE TYPE
    23. CREATE OPERATOR
    24. CREATE INDEXTYPE
    25. PRIVILEGE
    26. ----------------------------------------
    27. SET CONTAINER
    28. 12 rows selected.
    29. SQL> create view vu10
    30. 2 as
    31. 3 select empno,ename,sal,deptno from emp where deptno = 10;
    32. View created.
    33. SQL> set pagesize 200
    34. SQL> set linesize 200
    35. SQL>

    视图中增加一个字段,

    1. SQL> select * from vu10;
    2. EMPNO ENAME SAL DEPTNO
    3. ---------- ---------- ---------- ----------
    4. 7782 CLARK 2450 10
    5. 7839 KING 5000 10
    6. 7934 MILLER 1300 10
    7. SQL> create or replace view vu10
    8. 2 as
    9. 3 select empno,ename,hiredate,sal,deptno from emp where deptno = 10;
    10. View created.
    11. SQL> select * from vu10;
    12. EMPNO ENAME HIREDATE SAL DEPTNO
    13. ---------- ---------- --------- ---------- ----------
    14. 7782 CLARK 09-JUN-81 2450 10
    15. 7839 KING 17-NOV-81 5000 10
    16. 7934 MILLER 23-JAN-82 1300 10
    17. SQL>
    18. SQL>
    19. SQL> create or replace view vu10(employee_id,first_name,hire_date,salary,department_id)
    20. 2 as
    21. 3 select empno,ename,hiredate,sal,deptno from emp where deptno = 10;
    22. View created.
    23. SQL> select * from vu10;
    24. EMPLOYEE_ID FIRST_NAME HIRE_DATE SALARY DEPARTMENT_ID
    25. ----------- ---------- --------- ---------- -------------
    26. 7782 CLARK 09-JUN-81 2450 10
    27. 7839 KING 17-NOV-81 5000 10
    28. 7934 MILLER 23-JAN-82 1300 10
    29. SQL>

    强制建视图

    1. SQL>
    2. SQL> create or replace view vu20
    3. 2 as
    4. 3 select empno,ename,hiredate,sal,deptno from e05 where deptno = 20;
    5. select empno,ename,hiredate,sal,deptno from e05 where deptno = 20
    6. *
    7. ERROR at line 3:
    8. ORA-00942: table or view does not exist
    9. SQL> desc vu20
    10. ERROR:
    11. ORA-04043: object vu20 does not exist
    12. SQL> create or replace force view vu20
    13. 2 as
    14. 3 select empno,ename,hiredate,sal,deptno from e05 where deptno = 20;
    15. Warning: View created with compilation errors.
    16. SQL>
    17. SQL> desc vu20
    18. ERROR:
    19. ORA-24372: invalid object for describe
    20. SQL> create table e05 as select * from emp;
    21. Table created.
    22. SQL> desc vu20;
    23. Name Null? Type
    24. ----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
    25. EMPNO NUMBER(4)
    26. ENAME VARCHAR2(10)
    27. HIREDATE DATE
    28. SAL NUMBER(7,2)
    29. DEPTNO NUMBER(2)
    30. SQL>
    31. SQL> select * from vu20;
    32. EMPNO ENAME HIREDATE SAL DEPTNO
    33. ---------- ---------- --------- ---------- ----------
    34. 7369 SMITH 17-DEC-80 800 20
    35. 7566 JONES 02-APR-81 2975 20
    36. 7788 SCOTT 24-JAN-87 3000 20
    37. 7876 ADAMS 02-APR-87 1100 20
    38. 7902 FORD 03-DEC-81 3000 20
    39. SQL>
    40. SQL> select * from tab;
    41. TNAME TABTYPE CLUSTERID
    42. -------------------------------------------------------------------------------------------------------------------------------- ------------- ----------
    43. DEPT TABLE
    44. EMP TABLE
    45. BONUS TABLE
    46. SALGRADE TABLE
    47. T01 TABLE
    48. E01 TABLE
    49. E02 TABLE
    50. DETAIL_DEPT TABLE
    51. T03 TABLE
    52. VU10 VIEW
    53. VU20 VIEW
    54. E05 TABLE
    55. 12 rows selected.
    56. SQL> select text from user_views where view_name='VU20';
    57. TEXT
    58. --------------------------------------------------------------------------------
    59. select empno,ename,hiredate,sal,deptno from e05 where deptno = 20
    60. SQL> select * from (select empno,ename,hiredate,sal,deptno from e05 where deptno = 20);
    61. EMPNO ENAME HIREDATE SAL DEPTNO
    62. ---------- ---------- --------- ---------- ----------
    63. 7369 SMITH 17-DEC-80 800 20
    64. 7566 JONES 02-APR-81 2975 20
    65. 7788 SCOTT 24-JAN-87 3000 20
    66. 7876 ADAMS 02-APR-87 1100 20
    67. 7902 FORD 03-DEC-81 3000 20
    68. SQL>

    with check option:

    1. SQL> insert into vu20 values(1,'tom',sysdate,1200,10);
    2. 1 row created.
    3. SQL> select * from vu20;
    4. EMPNO ENAME HIREDATE SAL DEPTNO
    5. ---------- ---------- --------- ---------- ----------
    6. 7369 SMITH 17-DEC-80 800 20
    7. 7566 JONES 02-APR-81 2975 20
    8. 7788 SCOTT 24-JAN-87 3000 20
    9. 7876 ADAMS 02-APR-87 1100 20
    10. 7902 FORD 03-DEC-81 3000 20
    11. SQL> select * from vu10;
    12. EMPLOYEE_ID FIRST_NAME HIRE_DATE SALARY DEPARTMENT_ID
    13. ----------- ---------- --------- ---------- -------------
    14. 7782 CLARK 09-JUN-81 2450 10
    15. 7839 KING 17-NOV-81 5000 10
    16. 7934 MILLER 23-JAN-82 1300 10
    17. SQL> select * from e05;
    18. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
    19. ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
    20. 7369 SMITH CLERK 7902 17-DEC-80 800 20
    21. 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
    22. 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
    23. 7566 JONES MANAGER 7839 02-APR-81 2975 20
    24. 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
    25. 7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
    26. 7782 CLARK MANAGER 7839 09-JUN-81 2450 10
    27. 7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
    28. 7839 KING PRESIDENT 17-NOV-81 5000 10
    29. 7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
    30. 7876 ADAMS CLERK 7788 02-APR-87 1100 20
    31. 7900 JAMES CLERK 7698 03-DEC-81 950 30
    32. 7902 FORD ANALYST 7566 03-DEC-81 3000 20
    33. 7934 MILLER CLERK 7782 23-JAN-82 1300 10
    34. 1 tom 700
    35. 1 tom 17-NOV-22 1200 10
    36. 16 rows selected.
    37. SQL> roll
    38. Rollback complete.
    39. SQL> select * from e05;
    40. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
    41. ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
    42. 7369 SMITH CLERK 7902 17-DEC-80 800 20
    43. 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
    44. 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
    45. 7566 JONES MANAGER 7839 02-APR-81 2975 20
    46. 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
    47. 7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
    48. 7782 CLARK MANAGER 7839 09-JUN-81 2450 10
    49. 7788 SCOTT ANALYST 7566 24-JAN-87 3000 20
    50. 7839 KING PRESIDENT 17-NOV-81 5000 10
    51. 7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
    52. 7876 ADAMS CLERK 7788 02-APR-87 1100 20
    53. 7900 JAMES CLERK 7698 03-DEC-81 950 30
    54. 7902 FORD ANALYST 7566 03-DEC-81 3000 20
    55. 7934 MILLER CLERK 7782 23-JAN-82 1300 10
    56. 1 tom 700
    57. 15 rows selected.
    58. SQL> create or replace force view vu20
    59. 2 as
    60. 3 select empno,ename,hiredate,sal,deptno from e05 where deptno = 20
    61. 4 with check option;
    62. View created.
    63. SQL> insert into vu20 values(1,'tom',sysdate,1200,10);
    64. insert into vu20 values(1,'tom',sysdate,1200,10)
    65. *
    66. ERROR at line 1:
    67. ORA-01402: view WITH CHECK OPTION where-clause violation
    68. SQL> insert into vu20 values(1,'tom',sysdate,1200,20);
    69. 1 row created.
    70. SQL>

    对视图执行DML操作的规则

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

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

    删除视图

    DROP VIEW VIEW_NAME;

    1. SQL> drop view vu20;
    2. View dropped.
    3. SQL>

     内联视图

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

    建立一个新用户 pstest

    1. SQL> alter session set container=PDB1;
    2. Session altered.
    3. SQL> grant connect,resource to pstest identified by pstest;
    4. Grant succeeded.
    5. SQL> conn pstest/pstest@PDB1;
    6. Connected.
    7. SQL>
    8. SQL>

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

    1. SQL>
    2. SQL> grant select on vu10 to pstest;
    3. Grant succeeded.
    4. SQL>
    1. SQL> select * from scott.vu10;
    2. EMPLOYEE_ID FIRST_NAME HIRE_DATE SALARY DEPARTMENT_ID
    3. ----------- ---------- --------- ---------- -------------
    4. 7782 CLARK 09-JUN-81 2450 10
    5. 7839 KING 17-NOV-81 5000 10
    6. 7934 MILLER 23-JAN-82 1300 10
    7. SQL> show user;
    8. USER is "PSTEST"
    9. SQL>

    创建视图

    1. SQL>
    2. SQL>
    3. SQL> select * from (select ename,sal from emp order by sal desc);
    4. ENAME SAL
    5. ---------- ----------
    6. KING 5000
    7. FORD 3000
    8. SCOTT 3000
    9. JONES 2975
    10. BLAKE 2850
    11. CLARK 2450
    12. ALLEN 1600
    13. TURNER 1500
    14. MILLER 1300
    15. WARD 1250
    16. MARTIN 1250
    17. ADAMS 1100
    18. JAMES 950
    19. SMITH 800
    20. tom 700
    21. 15 rows selected.
    22. SQL> create or replace view vutest as select ename,sal from emp order by sal desc;
    23. View created.
    24. SQL> select * from vutest;
    25. ENAME SAL
    26. ---------- ----------
    27. KING 5000
    28. FORD 3000
    29. SCOTT 3000
    30. JONES 2975
    31. BLAKE 2850
    32. CLARK 2450
    33. ALLEN 1600
    34. TURNER 1500
    35. MILLER 1300
    36. WARD 1250
    37. MARTIN 1250
    38. ADAMS 1100
    39. JAMES 950
    40. SMITH 800
    41. tom 700
    42. 15 rows selected.
    43. SQL>

    Top-n 分析

    • Top-n查询查找一列中n个最大或者最小的数值
    • 最大和最小值都被认为是Top-n查询
  • 相关阅读:
    OpenCV(四十):图像分割—漫水填充
    服务CPU异常飙高问题分析和解决
    【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-Chapter14-处理用户输入
    新浪微博一键删除所有内容
    【YOLOv5】环境搭建:Win11 + mx450
    Spring.NET使用Oracle.DataAccess.Client访问数据库
    JUC并发编程与源码分析笔记06-Java内存模型之JMM
    Linux应用开发 - 读写锁
    动态规划:总结
    图神经网络 | Pytorch图神经网络ST-GNN
  • 原文地址:https://blog.csdn.net/u011868279/article/details/127896713