金仓数据库KingbaseES数据库管理员指南--15.1. 管理视图

您可以执行创建视图、替换视图、更改视图和删除视图等任务。

视图的形式类似于普通表,我们可以从视图中查询数据,实际上它是建立在表上的一种虚表,从本质上说,视图是对存储的查询。

可以使用CREATE VIEW语句创建视图。每个视图可以由引用表、物化视图或其他视图的查询来定义。还可以创建连接视图,即在FROM子句中指定多个基表或视图。

可以通过删除并重新创建视图,或者通过执行带有OR REPLACE子句的CREATE VIEW语句实现替换现有视图的定义。

可以像查询表一样查询视图,您还可以在视图上执行数据操作语句(DML)相关的操作,但有一些限制。

使用ALTER VIEW语句只能显式地重新编译无效的视图。

您可以使用DROP VIEW语句删除视图。

父主题: 管理视图、序列和同义词

15.1.1. 关于视图

视图的形式类似于普通表,我们可以从视图中查询数据,实际上它是建立在表上的一种虚表,从本质上说,视图是对存储的查询。

视图从它所基于的表中获取数据,这些表称为基表。基表可以是实际的表,也可以是其他视图。在视图上执行的所有操作实际上都会影响视图的基表。可以像使用表一样使用视图。您可以对视图进行查询、更新、插入和删除,就像对表进行查询一样。

对视图的访问会转化成对其基表的访问,并且将所查询的结果以视图所规定的格式和顺序返回。因此当基表中的数据发生变化时,从视图中查询出的数据也随之改变了。

对用户而言通常要进行查询操作,甚至是复杂且频繁的查询,那么就可以为这个查询定义一个视图。假设用户经常执行下面的查询语句:

SELECT student_id, student_name
FROM student
WHERE age > 20 and gender = '男';

如果已经为该查询定义了一个名为student_age_view的视图,那么您就可以执行一条简单的语句获取您想要的结果。

SELECT * FROM student_age_view;

另外值得注意的是视图本身不保存对基表的查询结果,仅仅保存一条SELECT语句。从上面这个例子可以看出使用视图的目的是为了方便用户访问基表数据。实际上视图的另一个重要作用是确保用户对基表的安全访问。对于同一个表,不同的用户而言,我们可以定义不同规则的视图,从而保证用户只能进行允许的操作。

父主题: 管理视图

15.1.2. 创建视图和连接视图

可以使用CREATE VIEW语句创建视图。每个视图可以由引用表、物化视图或其他视图的查询来定义。还可以创建连接视图,即在FROM子句中指定多个基表或视图。

可以使用CREATE VIEW语句创建视图。

您还可以在CREATE VIEW语句的FROM子句中指定多个基表或视图进行视图创建。

如果CREATE VIEW语句带有FORCE关键字,意味着无论视图的依赖检查是否成功,只要语句没有语法错误,数据库也会创建该视图。

父主题: 管理视图

15.1.2.1. 创建视图

可以使用CREATE VIEW语句创建视图。

创建视图需要满足以下要求:

  • 1.要在模式中创建视图,必须具有CREATE VIEW权限。如果要在其他用户的模式中创建视图,必须具有CREATE ANY VIEW系统权限。您可以显式地或通过角色获得这些特权。

  • 2.视图的所有者(无论是您还是其他用户)必须被授予访问视图定义中引用的所有对象的权限。所有者不能通过角色获得这些特权。另外,视图的功能依赖于视图所有者的权限。例如,如果视图的所有者只有test表的INSERT权限,那么视图只能用于向test表插入新行,而不能用于SELECT、UPDATE或DELETE行。

  • 3.如果视图的所有者打算将视图的访问权限授予其他用户,则该所有者必须通过GRANT OPTION获得基本对象的对象权限,或者通过ADMIN OPTION获得系统权限。

每个视图可以由引用表、物化视图或其他视图的查询定义。与所有子查询一样,定义视图的查询不能包含FOR UPDATE子句。为了说明视图,定义一张实验表,模拟学校的学生信息:

CREATE TABLE student (
        student_id NUMBER(4),
        student_name CHAR(8) NOT NULL,
        gender VARCHAR2(2),
        age NUMBER(2),
        grade VARCHAR2(8) NOT NULL,
        classid NUMBER(2),
        email VARCHAR2(20),
        sdate DATE,
        CONSTRAINT pk_nmb PRIMARY KEY,
        CONSTRAINT ck_check CHECK (gender in ('男','女')),
        CONSTRAINT ck_age CHECK (age BETWEEN 16 AND 30),
        CONSTRAINT uq_email UNIQUE (email)
);

下面的语句在student表中的数据子集上创建一个视图:

CREATE VIEW student_age_view AS
SELECT student_id, student_name
FROM student
WHERE age > 20 and gender = '男'
WITH LOCAL CHECK OPTION;

上述例子创建了student_age_view视图,用于查询年龄大于20且性别为男的学生ID和姓名信息。LOCAL CHECK OPTION子句是可选的,可以用来限定DML操作,并且只对当前视图的WHERE条件。值得注意的是,针对该视图如果想执行INSERT和UPDATE语句,应确保新增加的数据可以被该视图查询到。例如,下面的INSERT语句根据student_age_view视图成功地将一行性别为男,年龄21(大于20)的学生数据插入到student表中:

INSERT INTO student_age_view VALUES (1726,'王猛','男',21,'高中一年级',2,'101@qq.com',SYSDATE);

但是,下面的INSERT语句将会返回一个错误,因为它试图插入一个性别为女,年龄为19的女学生信息,这是因为student_age_view视图的查询只引用性别为男且年龄大于20的行:

INSERT INTO student_age_view VALUES (1726,'王萌','女',19,'高中一年级',3,'102@qq.com',SYSDATE);

另请参阅:

SQL语言中关于CREATE VIEW语句详细的描述

父主题: 创建视图和连接视图

15.1.2.2. 创建连接视图

您还可以在CREATE VIEW语句的FROM子句中指定多个基表或视图进行视图创建。这些基于多个表创建的视图就被称为连接视图,主要目的在于简化连接查询。

为了清楚的说明连接视图,下列是本章节视图中使用到的user和practice_detail两个表的详细定义:

CREATE TABLE user (
        id int NOT NULL,
        device_id int NOT NULL,
        gender varchar(14) NOT NULL,
        age int ,
        university varchar(32) NOT NULL,
        gpa float,
        active_days_within_30 int ,
        question_cnt int ,
        answer_cnt int
);

CREATE TABLE question_detail (
        id int NOT NULL,
        device_id int NOT NULL,
        question_id int NOT NULL,
        result varchar(32) NOT NULL
);

下面的创建视图语句创建了连接user和practice_detail表数据的avg_answer_view视图:

CREATE VIEW avg_answer_view AS
SELECT user.university,
    COUNT(question_id)/COUNT(distinct question_detail.device_id) AS avg_answer_cnt
FROM question_detail INNER JOIN user
ON user.device_id = question_detail.device_id
GROUP BY university;

上述视图例子根据user和practice_detail两表获取了指定的计算结果,但值得一提的是由于该视图中使用了GROUP BY子句和DISTINCT关键字,因此将不能通过该视图avg_answer_view进行DML相关操作。本节后面的内容将详细指出该限制条件。

父主题: 创建视图和连接视图

15.1.2.3. 创建FORCE视图

如果CREATE VIEW语句带有FORCE关键字,意味着无论视图的依赖检查是否成功,只要语句没有语法错误,数据库也会创建该视图。如果依赖检查成功则为有效视图,否则创建出来的就是无效视图。

比如视图引用了一个不存在的表或现有表中的无效列,或者视图所有者没有所需的权限时,数据库依然能创建该视图并将其输入到数据字典中。只是该视图还不能使用,当引用的表恢复(或者创建)后,该视图将能恢复使用。

要创建FORCE视图,CREATE VIEW语句必须包含FORCE关键字,具体的命令如下:

CREATE FORCE VIEW AS ...;

父主题: 创建视图和连接视图

15.1.3. 替换视图

可以通过删除并重新创建视图,或者通过执行带有OR REPLACE子句的CREATE VIEW语句实现替换现有视图的定义。

要替换视图,您必须拥有删除和创建视图所需的所有权限。如果视图的SELECT定义必须修改,可以优先考虑使用带有OR REPLACE子句的CREATE VIEW语句执行视图替换,其他拥有关系、权限和非SELECT规则在内的视图属性不会被更改;视图不能使用ALTER VIEW语句更改SELECT定义。

替换视图的方式具体如下:

  • 1.您可以直接删除并重新创建视图。

注意

当一个视图被删除时,所有相应的对象权限将从角色和用户中被撤销。在重新创建视图之后,必须重新授权。

  • 2.可以使用包含OR REPLACE子句的CREATE VIEW语句重新定义视图。OR REPLACE子句会替换当前定义的视图,并保留当前授权。

例如,在前面小节所示创建的student_age_view视图,如果需要重新定义视图WHERE子句指定的年龄和性别以及新增查询结果。可以使用以下语句替换student_age_view视图为当前定义:

CREATE OR REPLACE VIEW student_age_view AS
        SELECT student_id, student_name, age
        FROM student
        WHERE age > 19 and gender = '女'
        WITH LOCAL CHECK OPTION;

在替换视图之前,请注意到可能出现的影响:

  • 替换一个视图将替换数据字典中的视图定义。视图引用的所有基础对象都不受影响。

  • 如果CHECK OPTION中不再指定LOCAL关键字,则将会根据当前新视图和所有基视图条件检查新数据。

父主题: 管理视图

15.1.4. 在查询中使用视图

可以像表一样查询视图,您还可以在视图上执行数据操作语句(DML)相关的操作,但有一些限制。

要对视图执行查询或INSERT、UPDATE或DELETE语句,必须显式地或通过角色分别为视图拥有SELECT、READ、INSERT、UPDATE或DELETE对象权限。

类似于普通的表,可以以相同的方式进行查询。例如,要查询重新定以后的student_age_view视图(大于19岁的女生),输入引用该视图的SELECT语句,获取结果如下:

SELECT * FROM student_age_view;

student_id   student_name     age
---------------------------------
7844          宋义             20
7782          梅田田           21
7672          张华乐           20
7781          吉祥             21
7742          张丽莉           20
7900          黄金美           21
7654          倪文             20
7694          向玲             20
7698          向柯             20

可以使用视图向基表中插入、更新或从基表中删除行,但存在一些限制。下面的语句使用student_age_view视图向student表插入一个新行:

INSERT INTO student_age_view
    VALUES (7950, '王雯雯','女',20,'高中一年级',3,'104@qq.com',SYSDATE);

上述数据之所以能被成功插入到基表,是因为该行数据能被视图重新选中查询到,即满足(只允许将年龄大于19且为女性),同时不存在以下限制:

  • 如果视图是包含了DISTINCT操作符、GROUP BY子句、HAVING、LIMIT或OFFSET的查询定义,则不能使用该视图向基表插入、更新或从基表删除行。

  • 如果视图是用WITH CHECK OPTION定义的,则查询必须满足一定条件,如果视图不能从基表中选择行,则不能使用视图向基表插入或更新行。

  • 如果不包含DEFAULT子句的NOT NULL列在视图中的新数据不满足该约束,则不能使用视图将行插入到基表中。

  • 视图的选择列不能包含任何聚合、窗口函数或者集合返回函数。

父主题: 管理视图

15.1.5. 修改视图

使用ALTER VIEW语句只能显式地重新编译无效的视图。

ALTER VIEW语句允许您在运行前定位重新编译错误。要确保更改不会影响视图或依赖于它的其他对象,可以在更改视图的一个基表之后显式地重新编译视图。要使用ALTER VIEW语句,视图必须在您的模式中,或者您必须具有ALTER ANY TABLE系统权限。

父主题: 管理视图

15.1.6. 删除视图

您可以使用DROP VIEW语句删除视图。

可以删除模式中包含的任何视图。要删除另一个用户模式中的视图,必须具有DROP ANY VIEW系统权限。 例如,下面的语句删除了student_age_view视图:

DROP VIEW student_age_view;

父主题: 管理视图

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值