数据库中的视图有什么用,我们为什么要用视图?
的有关信息介绍如下:
当用户对数据库中的一张或者多张表的某些字段的组合感兴趣,而又不想每次键入这些查询时,用户就可以定义一个视图,以便解决这个问题。视图中列可以来自于表里的不同列,这些列都是用户所感兴趣的数据列。
视图与表不同,它在物理上不是真实存在的,而是一个虚表。在数据库里仅存放视图的定义,而不存放视图对应的数据。视图中的这些数据存放在其对应的表中,如果表中的数据发生了变化,从视图中查询出的数据也会随之发生改变。从这个意义来看,视图就像一个窗口,透过它可以看到数据库中用户感兴趣的数据及变化。每一次查看视图或引用视图的的时候,都会运行一次视图上的查询。
用户可以使用SELECT语句从视图里查询数据,对于符合一定约束条件的视图,还可以使用INSERT、UPDATE、DELETE、MERGE INTO等语句修改视图对应的基础表里的数据。视图在提供操作方便的同时,还可以保障数据库数据的安全。
数据库视图由许多基础表相关联的 SQL 语句定义,可以使用数据库视图向最终用户和外部应用程序隐藏底层表的复杂性。通过数据库视图,只需要使用简单的 SQL 语句,不需要编写具有许多连接的复杂语句。
如果不希望所有用户都可以查询敏感数据,就可以使用数据库视图仅向特定用户组公开非敏感数据。
安全性是任何关系数据库管理系统的重要组成部分,数据库视图为数据库管理系统提供了额外的安全性。数据库视图允许创建只读视图以向特定用户公开只读数据,用户只能在只读视图中检索数据,但不能对其进行更新。
数据库表中不应该有计算列,但是数据库视图支持有计算列。假设在订单表中有订购产品的数量和每个产品的价格列,但是订单表定义一列来存储每个订单的总销售额。如果有,这样的数据库模式也不是一个好的设计。在这种情况下,可以创建一个名为总销售额的列, 它是计算结果是产品的价格乘以订购产品的数量。当从数据库视图查询数据时,计算列的数据会动态进行计算。
假设有一个核心数据库,许多应用程序都在使用它,为了适应新的业务需求,有可能会重新设计数据库,删除了一些表并创建了几个新表,修改表的列名,此时并不希望这些更改影响之前的应用程序。在这种情况下,可以使用与已删除的旧表相同的表结构创建数据库视图。应用程序可以访问视图来完成此前功能,这样就无需对应用程序做任何的修改。
除了上述优点外,使用数据库视图有以下几个缺点:
从数据库视图查询数据可能会很慢,特别是如果视图是基于其他视图创建的。
由于视图时根据数据库的基础表创建的,每当更改与视图关联的那些表的结构时,也必须更改视图。
创建视图需要使用CREATE VIEW语句,其语法格式如下:
语法中的CREATE表示创建,OR REPLACE用于替换已经创建的视图,TEMP或TEMPORARY表示创建临时视图,view_name是要创建的名字字符串,column_name表示属性列的名字,query表示为视图提供行和列的SELECT查询语句或VALUES语句,WITH子句可以为视图指定一个可选的参数,目前支持的参数为security_barrier,当VIEW试图提供行级安全时,应使用该参数。
下面是视图的基本操作示例:
在GaussDB(DWS)上,当开启视图可更新参数(enable_view_update)后,系统允许对简单视图使用INSERT,UPDATE、DELETE和MERGE INTO语句进行更新,满足以下所有条件的视图可进行更新:
如果可更新的视图定义包含WHERE条件,则该条件将会限制UPDATE和DELETE语句修改基础表上的行。如果UPDATE语句更改行后不再满足WHERE条件,更新后通过视图将无法查询到。类似地如果INSERT命令插入了不满足WHERE条件的数据,插入后通过视图将无法查询到。在视图上执行插入、更新或删除的用户必须在视图和表上具有相应的插入、更新或删除权限。
以下是对可更新视图的进行更新操作的例子:
以下是可更新视图执行MERGE INTO语句的例子:
GaussDB(DWS)还提供了许多视图用于展示数据库的内部状态,以下几个视图,在定位故障时会经常使用。
点击关注,第一时间了解华为云新鲜技术~



