精华内容
下载资源
问答
  • 今天我们来讨论另一个重要的数据库对象:视图(View),学习如何利用视图简化查询语句、实现业务规则以及提高数据的安全性。 视图不是表 简单来说,视图就是一个预定义的查询语句。视图在许多情况下可以当作表来使用...

    《SQL 从入门到精通》专栏目录


    上一篇我们介绍了索引的概念、索引提高查询性能的原理,以及索引需要付出的代价。

    今天我们来讨论另一个重要的数据库对象:视图(View),学习如何利用视图简化查询语句、实现业务规则以及提高数据的安全性。

    视图不是表

    简单来说,视图就是一个预定义的查询语句。视图在许多情况下可以当作表来使用,因此也被称为虚拟表(Virtual Table)。视图与表最大的区别在于它不包含数据,数据库中只存储视图的定义语句。以下是一个视图的示意图:

    view

    知道了什么是视图,那为什么需要视图呢?因为它可以给我们带来许多好处:

    • 替代复杂查询,减少复杂性。将复杂的查询语句定义为视图,然后使用视图进行查询,可以隐藏具体的实现;
    • 提供一致性接口,实现业务规则。在视图的定义中增加业务逻辑,对外提供统一的接口;当底层表结构发生变化时,只需要修改视图接口,而不需要修改外部应用,可以简化代码的维护并减少错误;
    • 控制对于表的访问,提高安全性。通过视图为用户提供数据访问,而不是直接访问表;同时可以限制允许访问某些敏感信息,例如身份证号、工资等。

    不过,视图也可能带来一些问题:

    • 不当的使用可能会导致性能问题。视图的定义中可能包含了复杂的查询,例如嵌套的子查询和多个表的连接查询,可能导致使用视图进行查询时性能不佳;
    • 视图通常用于查询操作,可更新视图(Updatable View)需要满足许多限制条件。可更新视图可以支持通过视图对底层表进行增删改的操作。

    接下来我们介绍如何创建、修改、删除和使用视图。

    创建视图

    我们可以使用 CREATE VIEW 语句创建一个新的视图:

    CREATE VIEW view_name
        AS select_statement;
    

    其中,view_name 是视图的名称;select_statement 是视图的定义,也就是一个 SELECT 语句。视图可以基于一个或多个表定义,也可以基于其他视图进行定义。

    以下语句创建了一个名为 developers 的视图。其中只包含开发部门的员工,同时隐藏了月薪等敏感信息:

    CREATE VIEW developers
    AS
    SELECT emp_id, emp_name, sex, manager, hire_date, job_id, email
      FROM employee
     WHERE dept_id = 4;
    

    创建视图之后,可以像普通表一样将视图作为查询的数据源。以下语句使用视图 developers 进行查询:

    SELECT emp_name, sex, hire_date, email
      FROM developers
     WHERE sex = '女';
    

    该语句返回了开发部门的女性员工,查询的结果如下:

    select

    视图也可以用于复杂的查询操作。以下示例将视图 developers 与 job 表进行连接,然后执行分组统计:

    SELECT j.job_title, d.sex, COUNT(*)
      FROM developers d
      JOIN job j ON (j.job_id = d.job_id)
     GROUP BY j.job_title, d.sex;
    

    该语句返回了开发部门中,按照职位和性别统计的人数;查询的结果如下:

    select

    视图定义中的 SELECT 语句与普通的查询一样,可以包含任意复杂的选项。例如子查询、集合操作、分组聚合等。但有一个需要注意的选项就是 ORDER BY 子句。

    视图中的 ORDER BY

    许多数据库都支持在视图定义中使用 ORDER BY 子句;但是 SQL 标准并不支持这种写法,因为视图并不存储数据。以下语句创建了一个按照 emp_id 排序的视图 developers2:

    -- Oracle、MySQL 以及 PostgreSQL 实现
    CREATE VIEW developers2
    AS
    SELECT emp_id, emp_name, sex, manager, hire_date, job_id, email
      FROM employee
     WHERE dept_id = 4
     ORDER BY emp_id;
    

    建议最好不要在视图的定义中使用 ORDER BY,因为这种排序并不能保证最终结果的顺序;而且可能由于不必要的排序降低查询的性能。

    SQL Server 不允许视图定义中包含 ORDER BY 子句,除非指定了 TOP 、OFFSET 或者 FOR XML 选项。

    修改视图

    如果需要修改视图的定义,可以删除并重新创建视图。除此之外,各种数据库也提供了直接替换视图定义的命令:

    -- Oracle、MySQL 以及 PostgreSQL 实现
    CREATE OR REPLACE VIEW view_name
        AS select_statement;
    
    -- SQL Server 实现
    CREATE OR ALTER VIEW view_name
        AS select_statement;
    

    其中 CREATE OR REPLACE VIEW 表示如果视图不存在,创建视图;如果视图已经存在,替换视图。SQL Server 使用 CREATE OR ALTER VIEW 实现相同的功能。

    以下语句修改了视图 developers 的定义,删除了字段 hire_date 和 job_id:

    -- Oracle 以及 MySQL 实现
    CREATE OR REPLACE VIEW developers
    AS
    SELECT emp_id, emp_name, sex, manager, email
      FROM employee
     WHERE dept_id = 4;
    
    -- SQL Server 实现
    CREATE OR REPLACE VIEW developers
    AS
    SELECT emp_id, emp_name, sex, manager, email
      FROM employee
     WHERE dept_id = 4;
    

    执行以上语句将会替换原来的视图 developers。PostgreSQL 只支持在视图定义中追加字段,不支持删除字段;这种情况下只能删除再重建。

    MySQL 和 SQL Server 还支持使用 ALTER VIEW view_name AS select_statement; 命令修改视图的定义。 Oracle 和 PostgreSQL 中的 ALTER VIEW 命令用于修改视图的其他属性。

    删除视图

    使用 DROP VIEW 命令可以删除一个视图:

    DROP VIEW [IF EXISTS] view_name;
    

    指定 IF EXISTS 选项后,删除一个不存在的视图时也不会产生错误。Oracle 不支持 IF EXISTS 选项。

    以下语句可以删除视图 developers:

    DROP VIEW developers;
    

    通常来说,视图主要用于查询数据;但是某些视图也可以用于修改数据,这种视图被称为可更新视图(Updatable View)。

    可更新视图

    可更新视图是指通过视图更新底层表,对于视图的 INSERT、UPDATE、DELETE 等操作最终会转换为针对底层基础表的相应操作。可更新视图的定义需要满足许多限制条件,包括:

    • 不能使用聚合函数或窗口函数,例如 AVG、SUM、COUNT 等;
    • 不能使用 DISTINCT、GROUP BY、HAVING 子句;
    • 不能使用集合运算符,例如 UNION、INTERSECT 等;
    • 修改操作只能涉及单个表中的字段,不能同时修改多个表;
    • 不同数据库实现的其他限制条件。

    总之,对视图的修改只有在能够映射为对基础表的修改时,数据库才能执行视图的修改操作。

    我们创建一个简单的视图 developers_updatable,包含了 employee 中除 bonus 之外的所有字段:

    CREATE VIEW developers_updatable
    AS
    SELECT emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, email
      FROM employee
     WHERE dept_id = 4;
    

    以下语句通过视图 developers_updatable 修改员工表中的 email:

    UPDATE developers_updatable
       SET email = 'zhaoshi@shuguo.net'
     WHERE emp_name = '赵氏';
    
    SELECT emp_name, email
      FROM employee
     WHERE emp_name = '赵氏';
    emp_name|email             |
    --------|------------------|
    赵氏     |zhaoshi@shuguo.net|
    

    从查询的结果可以看出,针对视图 developers_updatable 的更新最终修改了 employee 中的数据。

    需要注意,不在视图定义中的字段不能通过视图进行修改。以下语句尝试通过视图 developers_updatable 修改 employee 中的 bonus 字段:

    UPDATE developers_updatable
       SET bonus = 2000
     WHERE emp_name = '赵氏';
    

    执行以上语句将会返回一个错误:bonus 字段不存在或者无效。因为视图 developers_updatable 没有包含员工的奖金字段,这样可以防止敏感数据的误修改。

    虽然无法通过视图修改视图定义之外的列,但是有可能修改视图可见范围之外的行。

    WITH CHECK OPTION 选项

    以下语句尝试通过视图 developers_updatable 为员工表增加一个员工:

    -- 只有 Oracle 需要执行以下 ALTER 语句
    -- ALTER SESSION SET NLS_DATE_FORMAT  = 'yyyy-mm-dd';
    INSERT INTO developers_updatable(emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, email)
    VALUES (30, '张三', '男', 5, 18, '2019-10-01', 10, 6000, 'zhangsan@shuguo.com');
    

    该员工属于销售部(dept_id = 5),不在视图 developers_updatable 的可见范围之内;但是该语句仍然能够执行成功,并且能够在员工表中找到该条记录:

    SELECT emp_id, emp_name, sex
      FROM employee
     WHERE emp_name = '张三';
    emp_id|emp_name|sex|
    ------|--------|---|
        30|张三     |男 |
    
    SELECT emp_id, emp_name, sex
      FROM developers_updatable
     WHERE emp_name = '张三';
    emp_id|emp_name|sex|
    ------|--------|---|
    

    员工表中存在“张三”,但是视图无法看到该员工。

    为了防止这种情况的发生,可以使用视图的 WITH CHECK OPTION 选项。该选项用于限制对视图的插入和更新操作,不会产生对视图不可见的数据。我们使用 WITH CHECK OPTION 选项重建视图 developers_updatable:

    -- Oracle、MySQL 以及 PostgreSQL 实现
    CREATE OR REPLACE VIEW developers_updatable
    AS
    SELECT emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, email
      FROM employee
     WHERE dept_id = 4 WITH CHECK OPTION;
    

    在 SQL Server 中可以使用 CREATE OR ALTER VIEW 语句重建该视图。

    然后再次增加一个销售部的员工:

    -- 只有 Oracle 需要执行以下 ALTER 语句
    -- ALTER SESSION SET NLS_DATE_FORMAT  = 'yyyy-mm-dd';
    INSERT INTO developers_updatable(emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, email)
    VALUES (31, '李四', '男', 5, 18, '2019-10-01', 10, 6000, 'lisi@shuguo.com');
    
    -- Oracle
    SQL Error [1402] [44000]: ORA-01402: view WITH CHECK OPTION where-clause violation
    
    -- MySQL
    SQL Error [1369] [HY000]: CHECK OPTION failed 'hrdb.developers_updatable'
    
    -- SQL Server
    SQL Error [550] [S0001]: The attempted insert or update failed because the target view either specifies WITH CHECK OPTION or spans a view that specifies WITH CHECK OPTION and one or more rows resulting from the operation did not qualify under the CHECK OPTION constraint.
    
    -- PostgreSQL
    SQL Error [44000]: ERROR: new row violates check option for view "developers_updatable"
      Detail: Failing row contains (30, 张三, 男, 5, 18, 2019-10-01, 10, 6000.00, null, zhangsan@shuguo.com).
    

    以上是各种数据库返回的错误信息,表示视图的数据检查失败。

    小结

    视图与子查询和通用表表达式有类似之处,都可以作为查询的数据源;但是视图是存储在数据库中的对象,可以被重复使用。合理的使用视图可以实现底层数据表的隐藏,对外提供一致接口,提高数据访问的安全性。不过,复杂的视图可能导致维护和性能问题;在实际应用之前最好进行相关的性能测试。

    练习题 1:创建一个关于员工信息的视图 emp_detail:

    CREATE VIEW emp_detail(id, manager, dept_name, job_title, name, sex, email)
    AS ...;
    

    其中 dept_name 来自部门表,job_title 来自职位表,并且为某些字段指定了自定义的名称。

    练习题 2:以下语句能不能执行成功?

    UPDATE developers_updatable
       SET dept_id = 5
     WHERE emp_name = '马岱';
    
    展开全文
  • ♣题目部分在Oracle中,和视图相关的查询转换有哪些? ♣答案部分(一)简单视图合并 1CREATEORREPLACEVIEWVW_SVM_LHRAS...
        

    640?wx_fmt=gif

    题目部分

    在Oracle中,和视图相关的查询转换有哪些?


         
    答案部分



    (一)简单视图合并

     1CREATE OR REPLACE VIEW VW_SVM_LHR AS SELECT * FROM SCOTT.EMP WHERE EMPNO<>7369; 2SELECT * FROM VW_SVM_LHR V WHERE V.JOB='DBA'; 3Execution Plan 4---------------------------------------------------------- 5Plan hash value: 3956160932 6 7-------------------------------------------------------------------------- 8| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     | 9--------------------------------------------------------------------------10|   0 | SELECT STATEMENT  |      |     3 |   114 |     3   (0)| 00:00:01 |11|*  1 |  TABLE ACCESS FULL| EMP  |     3 |   114 |     3   (0)| 00:00:01 |12--------------------------------------------------------------------------1314Predicate Information (identified by operation id):15---------------------------------------------------1617   1 - filter("JOB"='DBA' AND "EMPNO"<>7369)18192021LHR@orclasm > SELECT /*+ NO_MERGE(V)*/ * FROM VW_SVM_LHR V WHERE V.JOB='DBA';2223no rows selected242526Execution Plan27----------------------------------------------------------28Plan hash value: 453529682930---------------------------------------------------------------------------------31| Id  | Operation          | Name       | Rows  | Bytes | Cost (%CPU)| Time     |32---------------------------------------------------------------------------------33|   0 | SELECT STATEMENT   |            |     3 |   261 |     3   (0)| 00:00:01 |34|   1 |  VIEW              | VW_SVM_LHR |     3 |   261 |     3   (0)| 00:00:01 |35|*  2 |   TABLE ACCESS FULL| EMP        |     3 |   114 |     3   (0)| 00:00:01 |36---------------------------------------------------------------------------------3738Predicate Information (identified by operation id):39---------------------------------------------------4041   2 - filter("JOB"='DBA' AND "EMPNO"<>7369)4243LHR@orclasm > ALTER SESSION SET "_SIMPLE_VIEW_MERGING"=FALSE;4445Session altered.4647LHR@orclasm > SELECT * FROM VW_SVM_LHR V WHERE V.JOB='DBA';4849no rows selected505152Execution Plan53----------------------------------------------------------54Plan hash value: 453529685556---------------------------------------------------------------------------------57| Id  | Operation          | Name       | Rows  | Bytes | Cost (%CPU)| Time     |58---------------------------------------------------------------------------------59|   0 | SELECT STATEMENT   |            |     3 |   261 |     3   (0)| 00:00:01 |60|   1 |  VIEW              | VW_SVM_LHR |     3 |   261 |     3   (0)| 00:00:01 |61|*  2 |   TABLE ACCESS FULL| EMP        |     3 |   114 |     3   (0)| 00:00:01 |62---------------------------------------------------------------------------------6364Predicate Information (identified by operation id):65---------------------------------------------------6667   2 - filter("JOB"='DBA' AND "EMPNO"<>7369)CREATE OR REPLACE VIEW VW_SVM_LHR AS SELECT * FROM SCOTT.EMP WHERE EMPNO<>7369;
    2SELECT * FROM VW_SVM_LHR V WHERE V.JOB='DBA';
    3Execution Plan
    4----------------------------------------------------------
    5Plan hash value: 3956160932
    6
    7--------------------------------------------------------------------------
    8| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    9--------------------------------------------------------------------------
    10|   0 | SELECT STATEMENT  |      |     3 |   114 |     3   (0)| 00:00:01 |
    11|*  1 |  TABLE ACCESS FULL| EMP  |     3 |   114 |     3   (0)| 00:00:01 |
    12--------------------------------------------------------------------------
    13
    14Predicate Information (identified by operation id):
    15---------------------------------------------------
    16
    17   1 - filter("JOB"='DBA' AND "EMPNO"<>7369)
    18
    19
    20
    21LHR@orclasm > SELECT /*+ NO_MERGE(V)*/ * FROM VW_SVM_LHR V WHERE V.JOB='DBA';
    22
    23no rows selected
    24
    25
    26Execution Plan
    27----------------------------------------------------------
    28Plan hash value: 45352968
    29
    30---------------------------------------------------------------------------------
    31| Id  | Operation          | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
    32---------------------------------------------------------------------------------
    33|   0 | SELECT STATEMENT   |            |     3 |   261 |     3   (0)| 00:00:01 |
    34|   1 |  VIEW              | VW_SVM_LHR |     3 |   261 |     3   (0)| 00:00:01 |
    35|*  2 |   TABLE ACCESS FULL| EMP        |     3 |   114 |     3   (0)| 00:00:01 |
    36---------------------------------------------------------------------------------
    37
    38Predicate Information (identified by operation id):
    39---------------------------------------------------
    40
    41   2 - filter("JOB"='DBA' AND "EMPNO"<>7369)
    42
    43LHR@orclasm > ALTER SESSION SET "_SIMPLE_VIEW_MERGING"=FALSE;
    44
    45Session altered.
    46
    47LHR@orclasm > SELECT * FROM VW_SVM_LHR V WHERE V.JOB='DBA';
    48
    49no rows selected
    50
    51
    52Execution Plan
    53----------------------------------------------------------
    54Plan hash value: 45352968
    55
    56---------------------------------------------------------------------------------
    57| Id  | Operation          | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
    58---------------------------------------------------------------------------------
    59|   0 | SELECT STATEMENT   |            |     3 |   261 |     3   (0)| 00:00:01 |
    60|   1 |  VIEW              | VW_SVM_LHR |     3 |   261 |     3   (0)| 00:00:01 |
    61|*  2 |   TABLE ACCESS FULL| EMP        |     3 |   114 |     3   (0)| 00:00:01 |
    62---------------------------------------------------------------------------------
    63
    64Predicate Information (identified by operation id):
    65---------------------------------------------------
    66
    67   2 - filter("JOB"='DBA' AND "EMPNO"<>7369)



    (二)外连接视图合并(Outer Join View Merging

     1CREATE OR REPLACE VIEW VW_SVM_LHR AS SELECT * FROM SCOTT.EMP WHERE EMPNO<>7369; 2SELECT * FROM VW_SVM_LHR V,SCOTT.DEPT T  WHERE V.DEPTNO=T.DEPTNO(+); 3--------------------------------------------------------------------------- 4| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     | 5--------------------------------------------------------------------------- 6|   0 | SELECT STATEMENT   |      |    13 |   754 |     7  (15)| 00:00:01 | 7|*  1 |  HASH JOIN OUTER   |      |    13 |   754 |     7  (15)| 00:00:01 | 8|*  2 |   TABLE ACCESS FULL| EMP  |    13 |   494 |     3   (0)| 00:00:01 | 9|   3 |   TABLE ACCESS FULL| DEPT |     4 |    80 |     3   (0)| 00:00:01 |10---------------------------------------------------------------------------1112Predicate Information (identified by operation id):13---------------------------------------------------1415   1 - access("DEPTNO"="T"."DEPTNO"(+))16   2 - filter("EMPNO"<>7369)171819--视图作为被驱动表:20SELECT /*+ FULL(T)*/ * FROM VW_SVM_LHR V,SCOTT.DEPT T  WHERE V.DEPTNO(+)=T.DEPTNO;21---------------------------------------------------------------------------22| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |23---------------------------------------------------------------------------24|   0 | SELECT STATEMENT   |      |    13 |   754 |     7  (15)| 00:00:01 |25|*  1 |  HASH JOIN OUTER   |      |    13 |   754 |     7  (15)| 00:00:01 |26|   2 |   TABLE ACCESS FULL| DEPT |     4 |    80 |     3   (0)| 00:00:01 |27|*  3 |   TABLE ACCESS FULL| EMP  |    13 |   494 |     3   (0)| 00:00:01 |28---------------------------------------------------------------------------29Predicate Information (identified by operation id):30---------------------------------------------------3132   1 - access("DEPTNO"(+)="T"."DEPTNO")33   3 - filter("EMPNO"(+)<>7369)343536--视图含有2个表:37CREATE OR REPLACE VIEW VW_SVM2_LHR AS SELECT  /*+ FULL(A) FULL(B)*/ A.*,B.DNAME FROM SCOTT.EMP A,SCOTT.DEPT B WHERE A.DEPTNO=B.DEPTNO AND EMPNO<>7369;38SELECT  /*+ FULL(T)*/ * FROM VW_SVM2_LHR V,SCOTT.DEPT T  WHERE V.DEPTNO(+)=T.DEPTNO;39------------------------------------------------------------------------------------40| Id  | Operation            | Name        | Rows  | Bytes | Cost (%CPU)| Time     |41------------------------------------------------------------------------------------42|   0 | SELECT STATEMENT     |             |    13 |  1508 |    10  (10)| 00:00:01 |43|*  1 |  HASH JOIN OUTER     |             |    13 |  1508 |    10  (10)| 00:00:01 |44|   2 |   TABLE ACCESS FULL  | DEPT        |     4 |    80 |     3   (0)| 00:00:01 |45|   3 |   VIEW               | VW_SVM2_LHR |    13 |  1248 |     7  (15)| 00:00:01 |46|*  4 |    HASH JOIN         |             |    13 |   663 |     7  (15)| 00:00:01 |47|   5 |     TABLE ACCESS FULL| DEPT        |     4 |    52 |     3   (0)| 00:00:01 |48|*  6 |     TABLE ACCESS FULL| EMP         |    13 |   494 |     3   (0)| 00:00:01 |49------------------------------------------------------------------------------------5051Predicate Information (identified by operation id):52---------------------------------------------------5354   1 - access("V"."DEPTNO"(+)="T"."DEPTNO")55   4 - access("A"."DEPTNO"="B"."DEPTNO")56   6 - filter("EMPNO"<>7369)CREATE OR REPLACE VIEW VW_SVM_LHR AS SELECT * FROM SCOTT.EMP WHERE EMPNO<>7369;
    2SELECT * FROM VW_SVM_LHR V,SCOTT.DEPT T  WHERE V.DEPTNO=T.DEPTNO(+);
    3---------------------------------------------------------------------------
    4| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    5---------------------------------------------------------------------------
    6|   0 | SELECT STATEMENT   |      |    13 |   754 |     7  (15)| 00:00:01 |
    7|*  1 |  HASH JOIN OUTER   |      |    13 |   754 |     7  (15)| 00:00:01 |
    8|*  2 |   TABLE ACCESS FULL| EMP  |    13 |   494 |     3   (0)| 00:00:01 |
    9|   3 |   TABLE ACCESS FULL| DEPT |     4 |    80 |     3   (0)| 00:00:01 |
    10---------------------------------------------------------------------------
    11
    12Predicate Information (identified by operation id):
    13---------------------------------------------------
    14
    15   1 - access("DEPTNO"="T"."DEPTNO"(+))
    16   2 - filter("EMPNO"<>7369)
    17
    18
    19--视图作为被驱动表:
    20SELECT /*+ FULL(T)*/ * FROM VW_SVM_LHR V,SCOTT.DEPT T  WHERE V.DEPTNO(+)=T.DEPTNO;
    21---------------------------------------------------------------------------
    22| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    23---------------------------------------------------------------------------
    24|   0 | SELECT STATEMENT   |      |    13 |   754 |     7  (15)| 00:00:01 |
    25|*  1 |  HASH JOIN OUTER   |      |    13 |   754 |     7  (15)| 00:00:01 |
    26|   2 |   TABLE ACCESS FULL| DEPT |     4 |    80 |     3   (0)| 00:00:01 |
    27|*  3 |   TABLE ACCESS FULL| EMP  |    13 |   494 |     3   (0)| 00:00:01 |
    28---------------------------------------------------------------------------
    29Predicate Information (identified by operation id):
    30---------------------------------------------------
    31
    32   1 - access("DEPTNO"(+)="T"."DEPTNO")
    33   3 - filter("EMPNO"(+)<>7369)
    34
    35
    36--视图含有2个表:
    37CREATE OR REPLACE VIEW VW_SVM2_LHR AS SELECT  /*+ FULL(A) FULL(B)*/ A.*,B.DNAME FROM SCOTT.EMP A,SCOTT.DEPT B WHERE A.DEPTNO=B.DEPTNO AND EMPNO<>7369;
    38SELECT  /*+ FULL(T)*/ * FROM VW_SVM2_LHR V,SCOTT.DEPT T  WHERE V.DEPTNO(+)=T.DEPTNO;
    39------------------------------------------------------------------------------------
    40| Id  | Operation            | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
    41------------------------------------------------------------------------------------
    42|   0 | SELECT STATEMENT     |             |    13 |  1508 |    10  (10)| 00:00:01 |
    43|*  1 |  HASH JOIN OUTER     |             |    13 |  1508 |    10  (10)| 00:00:01 |
    44|   2 |   TABLE ACCESS FULL  | DEPT        |     4 |    80 |     3   (0)| 00:00:01 |
    45|   3 |   VIEW               | VW_SVM2_LHR |    13 |  1248 |     7  (15)| 00:00:01 |
    46|*  4 |    HASH JOIN         |             |    13 |   663 |     7  (15)| 00:00:01 |
    47|   5 |     TABLE ACCESS FULL| DEPT        |     4 |    52 |     3   (0)| 00:00:01 |
    48|*  6 |     TABLE ACCESS FULL| EMP         |    13 |   494 |     3   (0)| 00:00:01 |
    49------------------------------------------------------------------------------------
    50
    51Predicate Information (identified by operation id):
    52---------------------------------------------------
    53
    54   1 - access("V"."DEPTNO"(+)="T"."DEPTNO")
    55   4 - access("A"."DEPTNO"="B"."DEPTNO")
    56   6 - filter("EMPNO"<>7369)

    可见,视图被保留了下来,单独执行。



    (三)复杂视图合并(Complex View Merging


     1LHR@orclasm > SELECT * FROM VW_CVM_LHR V,SCOTT.DEPT T  WHERE V.JOB=T.DNAME AND  V.JOB='DBA'; 2 3no rows selected 4 5 6Execution Plan 7---------------------------------------------------------- 8Plan hash value: 2922957592 910-----------------------------------------------------------------------------------11| Id  | Operation            | Name       | Rows  | Bytes | Cost (%CPU)| Time     |12-----------------------------------------------------------------------------------13|   0 | SELECT STATEMENT     |            |     1 |    39 |     7  (15)| 00:00:01 |14|*  1 |  HASH JOIN           |            |     1 |    39 |     7  (15)| 00:00:01 |15|   2 |   VIEW               | VW_CVM_LHR |     1 |    19 |     3   (0)| 00:00:01 |16|   3 |    HASH GROUP BY     |            |     1 |     8 |     3   (0)| 00:00:01 |17|*  4 |     TABLE ACCESS FULL| EMP        |     3 |    24 |     3   (0)| 00:00:01 |18|*  5 |   TABLE ACCESS FULL  | DEPT       |     1 |    20 |     3   (0)| 00:00:01 |19-----------------------------------------------------------------------------------2021Predicate Information (identified by operation id):22---------------------------------------------------2324   1 - access("V"."JOB"="T"."DNAME")25   4 - filter("T"."JOB"='DBA')26   5 - filter("T"."DNAME"='DBA')2728LHR@orclasm > SELECT /*+MERGE(V)*/ * FROM VW_CVM_LHR V,SCOTT.DEPT T  WHERE V.JOB=T.DNAME AND  V.JOB='DBA';2930no rows selected313233Execution Plan34----------------------------------------------------------35Plan hash value: 20064611243637----------------------------------------------------------------------------38| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |39----------------------------------------------------------------------------40|   0 | SELECT STATEMENT    |      |     1 |    28 |     8  (25)| 00:00:01 |41|   1 |  HASH GROUP BY      |      |     1 |    28 |     8  (25)| 00:00:01 |42|*  2 |   HASH JOIN         |      |     3 |    84 |     7  (15)| 00:00:01 |43|*  3 |    TABLE ACCESS FULL| DEPT |     1 |    20 |     3   (0)| 00:00:01 |44|*  4 |    TABLE ACCESS FULL| EMP  |     3 |    24 |     3   (0)| 00:00:01 |45----------------------------------------------------------------------------4647Predicate Information (identified by operation id):48---------------------------------------------------4950   2 - access("T"."JOB"="T"."DNAME")51   3 - filter("T"."DNAME"='DBA')52   4 - filter("T"."JOB"='DBA')SELECT * FROM VW_CVM_LHR V,SCOTT.DEPT T  WHERE V.JOB=T.DNAME AND  V.JOB='DBA';
    2
    3no rows selected
    4
    5
    6Execution Plan
    7----------------------------------------------------------
    8Plan hash value: 2922957592
    9
    10-----------------------------------------------------------------------------------
    11| Id  | Operation            | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
    12-----------------------------------------------------------------------------------
    13|   0 | SELECT STATEMENT     |            |     1 |    39 |     7  (15)| 00:00:01 |
    14|*  1 |  HASH JOIN           |            |     1 |    39 |     7  (15)| 00:00:01 |
    15|   2 |   VIEW               | VW_CVM_LHR |     1 |    19 |     3   (0)| 00:00:01 |
    16|   3 |    HASH GROUP BY     |            |     1 |     8 |     3   (0)| 00:00:01 |
    17|*  4 |     TABLE ACCESS FULL| EMP        |     3 |    24 |     3   (0)| 00:00:01 |
    18|*  5 |   TABLE ACCESS FULL  | DEPT       |     1 |    20 |     3   (0)| 00:00:01 |
    19-----------------------------------------------------------------------------------
    20
    21Predicate Information (identified by operation id):
    22---------------------------------------------------
    23
    24   1 - access("V"."JOB"="T"."DNAME")
    25   4 - filter("T"."JOB"='DBA')
    26   5 - filter("T"."DNAME"='DBA')
    27
    28LHR@orclasm > SELECT /*+MERGE(V)*/ * FROM VW_CVM_LHR V,SCOTT.DEPT T  WHERE V.JOB=T.DNAME AND  V.JOB='DBA';
    29
    30no rows selected
    31
    32
    33Execution Plan
    34----------------------------------------------------------
    35Plan hash value: 2006461124
    36
    37----------------------------------------------------------------------------
    38| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    39----------------------------------------------------------------------------
    40|   0 | SELECT STATEMENT    |      |     1 |    28 |     8  (25)| 00:00:01 |
    41|   1 |  HASH GROUP BY      |      |     1 |    28 |     8  (25)| 00:00:01 |
    42|*  2 |   HASH JOIN         |      |     3 |    84 |     7  (15)| 00:00:01 |
    43|*  3 |    TABLE ACCESS FULL| DEPT |     1 |    20 |     3   (0)| 00:00:01 |
    44|*  4 |    TABLE ACCESS FULL| EMP  |     3 |    24 |     3   (0)| 00:00:01 |
    45----------------------------------------------------------------------------
    46
    47Predicate Information (identified by operation id):
    48---------------------------------------------------
    49
    50   2 - access("T"."JOB"="T"."DNAME")
    51   3 - filter("T"."DNAME"='DBA')
    52   4 - filter("T"."JOB"='DBA')



    本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。



    640?wx_fmt=gif

    ---------------优质麦课------------

    640?wx_fmt=png

     详细内容可以添加麦老师微信或QQ私聊。


    640?wx_fmt=gif


    About Me:小麦苗

     本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

    ● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

     本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

     版权所有,欢迎分享本文,转载请保留出处

     QQ:646634621  QQ群:618766405

     提供OCP、OCM和高可用部分最实用的技能培训

    ● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

    640?wx_fmt=gifDBA宝典

    长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。

    640?wx_fmt=gif

    640?wx_fmt=gif

    640?wx_fmt=png喜欢就点击“好看”吧



    展开全文
  • 在SAP物料主数据相关的报表开发需求中,经常可能需要先判断物料主数据哪些视图是否维护,下面介绍下具体判断逻辑供参考 1. 物料主数据各视图是否维护都记录在表 MARA 的字段 VPSTA 和 PSTAT 中。通过分析这两...

    在SAP物料主数据相关的报表开发需求中,经常可能有需要先判断物料主数据哪些视图是否有维护,下面介绍下具体判断逻辑供参考

    1. 物料主数据各视图是否有维护都记录在表 MARA 的字段 VPSTA 和 PSTAT 中。通过分析这两个字段,就可以知道该物料主数据各视图的维护状态。(通过Se11/se16n 查询表MARA可以看到,如下)
    在这里插入图片描述
    2. MARA 的字段 VPSTA 和 PSTAT的各值代表什么?
    在这里插入图片描述3.具体判断逻辑说明如下
    通过字段VPSTA和PSTAT能够标识出物料上维护的视图,这两个字段的说明如下:
    比如如下表示这个物料主数据只维护了基本视图和分类视图。
    在这里插入图片描述另外需要注意PSTAT和VPSTA的差异
    PSTAT:只包含手动创建的视图清单 。
    VPSTA:这个字段包含为物料所创建的视图,请注意这个字段也包含了为相关视图自动创建的值(例如:Plant stock (X) 和 Storage stock (Z) 是自动创建的) 。
    比如如下物料这两字段值就不完全一样。
    在这里插入图片描述
    更多价值博文在微信公众号,欢迎扫码关注!
    在这里插入图片描述
    专注SAP,分享交流行业经验!

    展开全文
  • 1、查询当前用户下,有哪些表 Sql代码 SELECT * FROM user_tables www.2cto.com 2、查询当前用户下, 可以访问哪些表 [也就是访问自己 和 其他用户的] Sql代码 SELECT * FROM all_tables ...
    1、查询当前用户下,有哪些表
    Sql代码  
    SELECT * FROM user_tables  
       www.2cto.com  
    2、查询当前用户下, 可以访问哪些表 [也就是访问自己 和 其他用户的]
    Sql代码  
    SELECT * FROM all_tables  
     
    3、查询当前数据库所有的表, 需要你有 DBA 的权限
    Sql代码  
    SELECT * FROM dba_tables  
     
    4、查询当前用户下的所有对象
    Sql代码  
    select * from tab;  
    5、 查看视图
    Sql代码  
    select view_name from user_views  

    转载于:https://www.cnblogs.com/Sunnor/p/5076451.html

    展开全文
  • SELECT * FROM sysobjects s INNER JOIN syscomments s2 ON s2.id = s.id WHERE s2.[text] LIKE '%C&R&M Project Works%' 转载于:https://www.cnblogs.com/zdjcnblogs/p/3453443.html
  • select * from INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME like '%Email%' 转载于:https://www.cnblogs.com/zdjcnblogs/p/3332547.html
  • 上网搜了一下解决方案,在ORACLE里 系统表dba_dependencies 记录表与视图的关联关系 select * from dba_dependencies where REFERENCED_NAME='表名' and TYPE='VIEW'; OWNER 依赖object的拥有者 ...
  • Oracle 查询权限视图

    2018-11-23 11:14:00
    在Oracle中很多用于查权限的视图,但很多人在需要查权限时会很困惑,不知道该用哪个视图去查,这里我列出几个常见的用于查权限的视图及其用法: 1DBA_ROLE_PRIVS 该视图主要以下2个作用: 1) 查某个user或...
  • 以往当我们查询数据时,一定要很认真的地从设计select语句...直接用select * from 视图名就行了,其实将查询语句创建成视图,不仅仅是简化查询的动作;更重要的是,视图具备数据表的特性,还可以衍生出更多的应用...
  • 上网搜了一下解决方案,在ORACLE里 系统表dba_dependencies 记录表与视图的关联关系 select * from dba_dependencies where REFERENCED='表名' and TYPE='VIEW';   OWNER 依赖object的拥有者 NAME...
  • 视图

    2018-05-31 19:48:42
    /*--1.what(什么是视图?)1.视图是一种数据库对象,是从一个或多个数据表或视图中导出的续表,视图锁对应的数据库并不是真正的存储在视图中,而是存储在所引用的数据中,视图的结构和数据是对表进行...视图有哪些有点)...
  • 视图我们可以粗略的理解为将查询后的内容保存成一个变量。调用这个变量我们就能获得查询的数据。 当我们查看表(show tables;)的时候,会看到当前所有的视图,为了方便我们区分表和视图的区别,建议在视图命名时...
  • (10) 使用INSERT INTO语句更新view_ avgamount视图,然后再次查询该视图以及查询相关基表检查执行...答:视图是虚拟的表,视图有如下优点: 为用户集中数据,简化数据库的查询,简化用户权限管理,方便数据的导出。
  • 存储过程的限制相对较少,函数限制比较多【不能用临时表,只能用表变量】存储过程实现的功能比较复杂,函数实现的功能针对性更强存储过程一般作为独立的部分来执行,函数可以作为查询语句的一部分来调用【可位于 ...
  • Oracle查询某字段在哪些表中

    千次阅读 2017-10-23 08:55:29
     可是在user_tab_columns表中查询某字段在哪些表中出现过的时候,会把视图也查出来,还会查出一个莫名其妙的一串字符,与需求不符,   之后又认识了另一个表:user_tables,这个表能够查询出...
  •  在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为...
  • oracle视图

    2021-01-04 13:58:56
    查询视图,本质上是对表进行关联查询。 视图的本身是不包含任何数据,只是一个查询结果,当基表的数据发生变化时,视图里面的数据也会跟着发生变化。我们经常在实际开发过程中遇到的视图可以大概分为三种:单表视图...
  • 转:原文链接已失效,自动跳转其他不可描述网站,删除原文地址。 ... 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优...
  • MySQL视图

    2021-02-18 15:28:06
    视图并不在数据库中实际存在,行和列数据来自定义视图查询中使用的表。并且在使用视图时动态生成。 视图相对普通的表的优势以下几项: 简单:使用视图不需要关心表结构、关联条件和筛选条件。对用户来说已经是...
  • 查询oracle中每个表有哪些约束条件

    千次阅读 2013-07-31 16:07:52
    我们可以使用下面语句从all_constraints视图中查看某表上的约束:   SELECT constraint_name, table_name, r_owner, r_constraint_name FROM all_constraints WHERE table_name = 'table_name' and owner = '...
  • 视图的概述

    2019-05-23 21:16:00
    视图是保存在数据库中的select查询,是一张...查询视图有哪些异同点 不同点: 存储上:视图存储在数据库中,查询以sql文件形式保存 排序上:要排序必须有TOP关键字,查询无要求 安全上:视图可以加密,查询...
  • 简述什么是视图

    2018-11-29 17:09:33
    1)是一种虚拟存在的表2)内容与真实的表相似,包含一系列带有名称的列和行数据。...2 视图的优点有哪些 简单: 使用视图的用户完全不需要关心视图中的数据是通过什么查询得到的。视图中的数据对用户来说已经是过滤...
  • ThinkPHP 有哪些特性

    千次阅读 2018-04-14 11:10:09
    视图模型:轻松动态地创建数据库视图,多表查询不再烦恼。 关联模型:让你以出乎意料的简单、灵活的方式完成多表的关联操作。 模板引擎:系统内建了一款卓越的基于XML的编译型模板引擎,支持两种类型的模板...
  • 1为什么要使用视图?什么是视图? 为了提高复杂SQL语句的复用性和表操作的安全性,MySQL数据库管理系统提供了视图特性。所谓视图,本质上是一种虚拟表,在物理上是不存在的,其内容与真实的表相似,...2视图有哪些特点
  • 路由参数、查询、通配符 基于 Vue.js 过渡系统的视图过渡效果 细粒度的导航控制 带自动激活的 CSS class 的链接 HTML5 历史模式或 hash 模式,在 IE9 中自动降级 自定义的滚动条行为 路由的钩子函数总结...
  • Oracle视图(和Mysq一样l)

    2019-04-27 21:42:00
    (1)了解常见的数据库对象都有哪些 (2)了解什么是视图以及为什么要使用视图 概念:视图是一个虚拟表,视图当中的数据是来自于基表的 为什么要用视图? <1>安全原因:...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 326
精华内容 130
关键字:

查询视图有哪些