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