Oracle中视图的使用及ORA-00998错误

(作者:陈玓玏)

一、视图的概念及优缺点

视图是从一个或多个表导出的虚拟的表,其内容由查询定义。其具有普通表的结构,但是不实现数据存储。其实视图的功能和select语句是一样的,只是避免了重复写较复杂、使用频率较高的子查询。

视图的优点有:1、避免大量重复代码的出现;2、避免大量占用空间的临时表的出现;3、实现简单;4、数据的相对安全性,对于部分用户,只开放可供查询的数据,并限制其修改和删除权限,可以避免基础表结构受到损害。

视图的缺点:1、视图本质上还是查询,所以每次调用视图时,都需要从基础表里再执行一次查询语句,时间上来说比较慢;2、视图的修改和删除有一定的条件,而且有些情况下视图的修改和删除会涉及基础表数据的修改和删除,这个一定要谨慎把握。

二、视图的使用

什么情况下视图不能修改呢?

要通过视图更新基本表数据,必须保证视图是可更新视图。即可以在INSET、UPDATE或DELETE等语句当中使用它们。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系,因为这样才能够反向映射到原基础表。还有一些特定的其他结构,这类结构会使得视图不可更新。

如果视图包含下述结构中的任何一种,那么它就是不可更新的:

(1)聚合函数;

(2)DISTINCT关键字;

(3)GROUP BY子句;

(4)ORDER BY子句;

(5)HAVING子句;

(6)UNION运算符;

(7)位于选择列表中的子查询;

(8)FROM子句中包含多个表;

(9)SELECT语句中引用了不可更新视图;

(10)WHERE子句中的子查询,引用FROM子句中的表;

(11)ALGORITHM 选项指定为TEMPTABLE(使用临时表总会使视图成为不可更新的)。

 --创建视图
 create or replace view viewName
 as 
 select * from tableName

--从视图中查询数据
select * from viewName

--删除视图
drop view viewName

注意,drop view不会对基表有影响,但是对于单表中产生的不含聚合函数的view,delete view中的数据可能会对基表有影响,请谨慎使用。

三、ORA-00998错误

ORA-00998: must name this expression with a column alias

解决方案:对使用了case when的列定义别名,当然了,最好是对所有的列和子查询的table都定义别名,一来避免出现类似的错误,二来对表和列定义别名能够提高SQL语句的效率。

参考文章:
https://blog.csdn.net/yangkai_hudong/article/details/7632085(包括视图的概念及各种使用)
https://www.xuebuyuan.com/1427852.html(专门测试了对视图或基表进行操作对相互的影响)

你可能感兴趣的:(数据库)