表现数据的逻辑子集或数据组合
视图是基于表或另一个视图的逻辑表,一个视图并不包含真实的数据,它提供了另一个视角查看或改变表中的数据
视图本质上就是一个SELECT语句
视图可以起到隐藏数据的功能。因为视图可以选择性的显示表中的字段(或行)。
视图可以将复杂的多表连接查询的结果构成一个简单的表结构提供给用户。
创建视图
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view[(aliaslist)]
AS subquery
OR REPLACE表示如果视图已经存在则重新创建
FORCE表示创建视图而不管基表是否存在,NOFORCE表示只有基表存在的情况下才创建视图(默认情况)
view表示视图名
aliaslist表示别名列表(别名之间用逗号隔开,别名的个数需要和子查询中选择的字段或表达式的个数一致)
subquery表示子查询
视图的核心是子查询,在视图中,子查询可以包含复杂的SELECT语句,但不可以包含ORDER BY子句(如想排序,可以从视图中取数据时进行排序)
--针对雇员表创建一个视图,隐藏其他数据,只显示雇员编号、姓氏和雇佣日期这三个字段的信息,且他们的别名分别设置为id、Name和Start,其SQL语句如下
CREATE OR REPLACE VIEW emp_hidedata_view(“id”, “Name”, “Start”) AS SELECT employee_id, last_name, hire_date FROM employees
查询视图
对于创建好的视图,我们可以象从表中查询数据一样从视图中获取数据,例如可以执行如下的SQL语句:
SELECT * FROM emp_hidedata_view
WHERE id BETWEEN 200 AND 207
复杂视图
复杂视图就是子查询中涉及表的数目超过一个,或包含函数,或包含数据分组
假设现在要创建这样一个视图,该视图包括部门名称、部门平均薪水、最低薪水和最高薪水(别名分别是:dname、 minsal maxsal, avgsal ),而这些数据是通过对雇员表emp分组计算得来的
针对简单视图可以进行DML操作,而针对复杂视图不可以进行DML操作
可以通过视图对基表进行DML操作,但针对不同的操作,需要符合下面的规则:
--如果视图中包含下面的内容,就不可以从视图中删除数据
组函数
GROUP BY子句
DISTINCT关键字
伪列ROWNUM关键字
--如果视图中包含下面的内容,就不可以在视图中更新数据:
组函数
GROUP BY子句
DISTINCT关键字
伪列ROWNUM关键字
用表达式定义的字段
--如果视图中包含下面的内容,就不可以在视图中插入数据:
组函数
GROUP BY子句
DISTINCT关键字
伪列ROWNUM关键字
用表达式定义的字段
基表中的NOT NULL字段不在视图中