一、什么是视图?
视图中是不存放数据的,它只是一个定义; 物化视图(快照)是真正存放数据的
视图以经过定制的方式显示来自一个或多个表的数据
视图可以视为“虚拟表”或“存储的查询”
创建视图所依据的表称为“基表”
二、视图的优点有:
提供了另外一种级别的表安全性
隐藏的数据的复杂性
简化的用户的SQL命令
隔离基表结构的改变
通过重命名列,从另一个角度提供数据
三、创建视图的语法:
①视图的正常创建
CREATE [OR REPLACE] [FORCE] VIEW
view_name [(alias[, alias]...)]
AS select_statement
[WITH CHECK OPTION]
[WITH READ ONLY];
- or replace 如果视图存在则替换掉它
- force 强制创建视图,即使基本表不存在,视图也能正常创建。如果以后一旦表建立,视图则会立马应用。
- as 基于某张表(select from where group by order by查询语句)
- [WITH CHECK OPTION] 使得用户不能执行减少视图结果集(记录数)的更新操作
- [WITH READ ONLY] 表示视图只读,不能更新。
视图的更新,单表视图可以更新,视图的更新会影响到基表,但原视图有可能会查询不到。
create view view1 as select * from student where sno=1;
update view1 set sno =5 where sno=1; --把学号为1的更改为5
--此时原始表中的数据也会发生改变,但视图却已经查询不到满足条件的结果了。
②使用order by子句创建视图 (与sql server不同,sqlserver只能在查询视图的时候使用order by)
create view view2 as select * from student order by sno desc;
③ 连接视图的创建
复习一下连接语法:
--相等连接(第一种写法):
select table1.column,table2.column
from table1, table2
where table1.column1=table2.column2
-- 可以使用表的别名,为了书写的简化。
--相等连接(第二种写法):
select table1.column,table2.column
from table1 inner join table2
on table1.column1=table2.column2
--可以使用表的别名,为了书写的简化。
--左外连接(第一种写法):右外相反
select table1.column,table2.column
from table1 left outer join table2
on table1.column1=table2.column2
可以使用表的别名,为了书写的简化。
--左外连接(第二种写法):右外相反
select table1.column,table2.column
from table1, table2
where table1.column1=table2.column2(+)
可以使用表的别名,为了书写的简化。
--全外连接(一种写法):
select table1.column,table2.column
from table1 full outer join table2
on table1.column1=table2.column2
-- 可以使用表的别名,为了书写的简化。
在视图上也可以使用修改数据的DML语句,如INSERT、UPDATE和DELETE
视图上的DML语句有如下限制:
- 只能修改一个底层的基表(即单表视图)
- 如果修改违反了基表的约束条件,则无法更新视图
- 如果视图包含连接操作符、DISTINCT 关键字、集合操作符、聚合函数或 GROUP BY 子句,则将无法更新视图
- 如果视图包含伪列或表达式,则将无法更新视图
复杂视图的更新update,如果复杂视图想要更新的话,只可以更新键保留表的那些列,非键保留表会随之做出更改,但我们不能主动地去更改。
ep:
有两张表学生表(学号、姓名、院系号) 系表(院系号、院系名)
当我们对上述两张表创建一个视图:
create view view_student_dept
as
select a.sno ,a.sname ,a deptno deptno1,
b.deptno deptno2,b.deptname
from student a ,dept b
where a.deptno=b.deptno;
此时在视图中,student表的sno作为该视图的主键,而dept则没有一列作为主键,故我们称student为键保留表,dept为非键保留表
instead of 触发器可以实现对任何视图的任何更新(后续章节)
四、视图中的函数
视图中可以使用单行函数、分组函数和表达式
必须为使用函数或者表达式的字段指定名字
--例如我们将视图中的学生英文姓名全部转化为大写,方便查询
create view view4 as select sno,upper(sanme) upper_name
from student;
使用DROP VIEW语句删除视图
drop view viewname
select * from user_views; --其中text列为创建视图语句