视图可以理解为数据库中一张虚拟的表。
它是建立在已有表的基础上, 赖以建立的这些表称为基表。
通过一张或者多张基表进行关联查询后组成一个虚拟的逻辑表。
查询视图,本质上是对表进行关联查询。
视图的本身是不包含任何数据,只是一个查询结果,当基表的数据发生变化时,视图里面的数据也会跟着发生变化。向视图提供数据内容的语句为 SELECT 语句, 可以将视图理解为存储起来的SELECT语句。视图向用户提供基表数据的另一种表现形式。
视图它可以使复杂的数据简单化,还可以对表结构设计的补充,控制数据的访问,避免重复访问相同的数据,增加了安全性。
创建视图的语法如下:
CREATE [OR REPLACE] VIEW view [(aliad[,alias]...)]
AS [WITH READ ONLY CONSTRAINT]
OR REPLACE:如果视图已经存在,则替换旧视图。
WITH READ ONLY:默认不填的,用户是可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行 insert 操作,或者基表设置了某些约束,这时候插入视图或者修改视图的值,有可能会报错), WITH READ ONLY 说明视图是只读视图,不能通过该视图进行增删改操作。但是在现实开发中,基本上不通过视图对表中的数据进行增删改操作。
视图也分成几个类别:
简单视图是单个表并且不包含函数或表达式的视图,可以在该视图上可以执行DML语句(即可执行增、删、改操作)。
复杂视图就是指那些包含函数、表达式或者分组数据的视图,在该视图上执行DML语句时必须要符合特定条件。通常我们在定义复杂视图时必须为函数或表达式定义别名。
连接视图指那些基于多个表建立的视图,一般来说不会在该视图上执行INSERT、UPDATE、DELETE操作。
只读视图就是只允许进行SELECT操作的视图,在该视图时指定WITHREADONLY选项。在这种视图上不能执行INSERT、UPDATE、DELETE的操作。
CHECK约束视图在视图上定义CHECK约束,在该视图上执行INSERT或UPDATE操作时,数据必须符合查询结果。
-- 创建简单视图:
CREATE VIEW empvu
AS SELECT employee_id, last_name, salary
FROM employees;
--查询结果:
CREATE VIEW 子句中各列的别名应和子查询中各列相对应。
当视图定义中包含以下元素之一时不能使用delete:
--组函数
--GROUP BY 子句
--DISTINCT 关键字
--ROWNUM 伪列
当视图定义中包含以下元素之一时不能使用update:
--组函数
--GROUP BY子句
--DISTINCT 关键字
--ROWNUM 伪列
--列的定义为表达式
当视图定义中包含以下元素之一时不能使insert:
--组函数
--GROUP BY 子句
--DISTINCT 关键字
--ROWNUM 伪列
--列的定义为表达式
--表中非空的列在视图定义中未包括
删除视图只是删除视图的定义,并不会删除基表的数据
-- 删除简单视图:
DROP VIEW empvu;
--查询结果: