07-视图

视图:从表中抽出的逻辑上相关的数据集合。

视图是一种虚表。


视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。


向视图提供数据内容的语句为 SELECT 语句, 可以将视图理解为存储起来的 SELECT 语句.


视图向用户提供基表数据的另一种表现形式

为什么使用视图?
    控制数据访问
    简化查询
    避免重复访问相同的数据

 

简单视图和复杂视图

 

  1 --创建视图
  2 --子查询可以是复杂的 SELECT 语句
  3 create or replace view empview 
  4 as 
  5 select employee_id emp_id,last_name name,department_name
  6 from employees e,departments d
  7 Where e.department_id = d.department_id;
  8 
  9 --创建视图举例
 10 CREATE VIEW     empvu80
 11  AS SELECT  employee_id, last_name, salary
 12     FROM    employees
 13     WHERE   department_id = 80;
 14 
 15 --描述视图结构
 16 DESC empvu80;
 17 
 18 --创建视图时在子查询中给列定义别名
 19 CREATE VIEW     salvu50
 20  AS SELECT  employee_id ID_NUMBER, last_name NAME,
 21             salary*12 ANN_SALARY
 22     FROM    employees
 23     WHERE   department_id = 50;
 24 
 25 --查询视图
 26 SELECT *
 27 FROM    salvu50;
 28 
 29 --修改视图
 30 CREATE OR REPLACE VIEW empvu80
 31   (id_number, name, sal, department_id)
 32 AS SELECT  employee_id, first_name || ' ' || last_name, 
 33            salary, department_id
 34    FROM    employees
 35    WHERE   department_id = 80;
 36 
 37 --创建复杂视图
 38 CREATE VIEW    dept_sum_vu
 39   (name, minsal, maxsal, avgsal)
 40 AS SELECT     d.department_name, MIN(e.salary), 
 41              MAX(e.salary),AVG(e.salary)
 42    FROM      employees e, departments d
 43    WHERE     e.department_id = d.department_id 
 44    GROUP BY  d.department_name;
 45 
 46 --视图中使用DML的规定1
 47 --可以在简单视图中执行 DML 操作
 48 --当视图定义中包含以下元素之一时不能使用delete:
 49 --组函数
 50 --GROUP BY 子句
 51 --DISTINCT 关键字
 52 --ROWNUM 伪列
 53 create or replace view sal_view
 54 as select
 55 avg(salary) avg_sal from employees
 56 group by department_id;
 57 
 58 --视图中使用DML的规定2
 59 --当视图定义中包含以下元素之一时不能使用update:
 60 --组函数
 61 --GROUP BY子句
 62 --DISTINCT 关键字
 63 --ROWNUM 伪列
 64 --列的定义为表达式
 65 
 66 --当视图定义中包含以下元素之一时不能使insert:
 67 --组函数
 68 --GROUP BY 子句
 69 --DISTINCT 关键字
 70 --ROWNUM 伪列
 71 --列的定义为表达式
 72 --表中非空的列在视图定义中未包括
 73 
 74 --屏蔽 DML 操作
 75 --可以使用 WITH READ ONLY 选项屏蔽对视图的DML 操作
 76 --任何 DML 操作都会返回一个Oracle server 错误
 77 CREATE OR REPLACE VIEW empvu10
 78     (employee_number, employee_name, job_title)
 79 AS SELECT    employee_id, last_name, job_id
 80    FROM     employees
 81    WHERE    department_id = 10
 82    WITH READ ONLY;
 83 
 84 --删除视图
 85 --删除视图只是删除视图的定义,并不会删除基表的数据
 86 --Drop view 视图名称
 87 
 88 --Top-N 分析
 89 --Top-N 分析查询一个列中最大或最小的 n 个值:
 90 --销售量最高的十种产品是什么?
 91 --销售量最差的十种产品是什么?
 92 --最大和最小的值的集合是 Top-N 分析所关心的 
 93 --查询最大的几个值的 Top-N 分析: 
 94 --  SELECT [column_list], ROWNUM  
 95 --  FROM   (SELECT [column_list] 
 96 --        FROM table
 97 --        ORDER  BY Top-N_column)
 98 --  WHERE  ROWNUM <=  N;
 99 --注意: 对 ROWNUM 只能使用 < 或 <=, 而用 =, >, >= 都将不能返回任何数据。
100 
101 --查询工资最高的三名员工
102 SELECT ROWNUM as RANK, last_name, salary 
103 FROM  (SELECT last_name,salary FROM employees
104        ORDER BY salary DESC)
105 WHERE ROWNUM <= 3;
106 
107 select * from(
108               select rownum rn,employee_id,salary
109               from( select employee_id,salary,last_name
110                     from employees
111                     order by salary desc
112                   )
113 )where rn <=50 and rn >40;

 

eg:

 1 --使用表employees创建视图employee_vu,其中包括姓名(LAST_NAME),员工号(EMPLOYEE_ID),部门号(DEPARTMENT_ID).
 2 create or replace view employee_vu
 3 as
 4 select last_name,employee_id,department_id
 5 from employees
 6 
 7 --显示视图的结构
 8 desc employee_vu;
 9     
10 --查询视图中的全部内容
11 SELECT * FROM employee_vu;
12 
13 --将视图中的数据限定在部门号是80的范围内
14 create or replace view employee_vu
15 as
16 select last_name,employee_id,department_id
17 from employees
18 where department_id = 80
19 
20 --将视图改变成只读视图
21 create or replace view employee_vu
22 as
23 select last_name,employee_id,department_id
24 from employees
25 where department_id = 80
26 with read only

  

posted @ 2020-08-04 23:01  路修索  阅读(201)  评论(0编辑  收藏  举报