1. 为什么要使用视图:
限制数据访问(权限控制)
使复杂的查询变得容易
提供数据独立性
提供相同数据的不同视图
2. 创建视图的准则:
定义视图的字查询不能包含ORDER BY字句。ORDER BY字句是在视图中检索数据时指定的,如果不为WITH CHECK OPTION创建的视图指定约束名,系统会以SYS_Cn格式指定一个默认名称,可以使用OR REPLACE选项更改视图定义,而不必先删除再重新创建它,也不必重新授予以前授予它的对象权限。
3. 数据字典中的视图:
一旦创建了视图,就可以查询称为USER_VIEWS的数据字典视图来查看视图名称和视图定义
4. 修改视图:使用CREATE OR REPLACE VIEW字句修改:使用OR REPLACE选项,即使已经存在同名视图也可以创建视图,从而为该视图的所有者替换其旧版本。
Create or replace view emp80 ( id_number,name,sal,department_id)
As select employee_id,last_name,salary,department_id from employees where department_id=80;
5. 在视图上执行DML操作的规则:
可以在简单视图上执行DML操作
如果视图包含以下内容,则不能删除行:
a. 分组函数
b. GROUP BY字句
c. DISTINCT 字句
d. 伪列ROWNUM关键字
如果视图包含以下内容,则不能在视图中修改数据:
a. 分组函数
b. GROUP BY字句
c. DISTINCT 关键字
d. 伪列ROWNUM关键字
e. 由表达式定义的列
如果视图包含以下内容,则不能通过视图添加数据:
a. 分组函数
b. GROUP BY字句
c. DISTINCT 关键字
d. 伪列ROWNUM关键字
e. 由表达式定义的列
f. 基表中未被视图选中的NOT NULL列
6. 使用WITH CHECK OPTION字句
可以确保在视图上执行的DML操作发生在视图的范围内
Create or replace view emp20
As select * from employees where department_id=20 with check option constraint emp20_ck;
尝试在这个视图中更改任一行的部门编号都不会成功,因为它违反了WITH CHECK OPTION约束
7. 拒绝DML操作
通过在视图定义定义中添加WITH READ ONLY选项可以确保不能执行DML操作,任何对视图中的行执行DML的尝试都会导致ORACLE服务器错误。
Eg:create or replace view emp10(id,name,title)
as select employee_id,last_name,job_id from employees where department_id=10 with read only;
8. 删除视图
Drop view emp10;
9. 内联视图
内联视图是带有可以在SQL语句中使用的别名(或相关名称)的字查询。
Eg:select a.last_name, a.salary, a.department_id, b.maxsal
From employees a, (select department_id,max(salary) maxsal from employees group by department_id) b where a.department_id=b.department_id and a.salary<b.maxsal;
10. TOP-N排序
Select rownum as rank, last_name, salary from (select last_name,salary from employees order by salary desc) where rownum<=3;