数据库——视图

目录

作用

1.简单。

2.安全。

3.数据独立

介绍

创建视图

查询视图:

修改视图 :

 删除视图:

视图的检查选项:

方式一:with cascaded check option

例一:没有with cascaded check option

 例二:有with cascaded check option

例三:基于另一个视图建立视图

方式二:with local check option

视图的更新:


作用

1.简单。

视图不仅可以简化用户对数据的理解,也可以简化他们操作。那些被经常使用的查询可以被定义为视图,从而使用户不必为以后的操作每次指定全部条件。(封装多表联查)

2.安全。

数据库可以授权,但不能授权到特定行和特定的列上。通过视图用户只能查看和修改他们所能见到的数据

3.数据独立

视图可以帮助用户屏蔽真实表结构变化带来的影响

介绍

视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。

通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要工作就落在创建这条SQL查询语句上。

创建视图

as:视图数据来自后面的查询语句。

create or replace view 视图名 as select语句 [ with [ cascaded | local ] check option];

这里有个表,我举个例子

数据库——视图_第1张图片

根据这个表创建一个视图 ,创建时or replace可以不加。

CREATE or REPLACE VIEW view_1 AS select book_id, book_name from tbl_book;

创建成功后,会有一个新的视图出现

数据库——视图_第2张图片

查询视图:

视图是一张虚拟的表,也可以操作,也可以加where条件

select * from 视图名

数据库——视图_第3张图片

修改视图 :

方式一:修改的replace必须存在,意思就是替换,

create or replace view 视图名 as select 语句 [ with [ cascaded | local ] check option];

举例:

查询表时多查询一个字段price

CREATE or REPLACE VIEW view_1 AS select book_id, book_name ,book_price from tbl_book;

修改之后的视图,多了一列price

数据库——视图_第4张图片

方式二:

alter view  视图名  as select  语句 [ with [ cascaded | local ] check option];;

举例:

查询两列数据

alter view view_1 as select book_id, book_name from tbl_book;

修改后的视图,从三列修改为两列

数据库——视图_第5张图片

 删除视图:

drop  view  [if  exists]  视图名;

举例:

将 view_1视图删掉,if exists就是一句判断,是否存在,可以不写

drop view if exists view_1;

视图的检查选项:

create or replace view 视图名 as select 语句 [ with [ cascaded | local ] check option];

当使用with check option 子句创建视图的时候,MYSQL会通过视图检查正在更改的每一行,以使其符合视图的定义。MYSQL允许基于另一个视图创建视图,他还会检查依赖视图中的规则以保证一致性。为了确定检查范围,mysql提供了两个选项:cascaded和local,默认为cascaded。

方式一:with cascaded check option

cascaded:如果一个视图的检查条件是cascaded修饰的,那么他基于的视图在更改数据都会默认添加with cascaded check option检查选项,进行检查

举例:

例一:没有with cascaded check option

原始表

数据库——视图_第6张图片

先创建没有with cascaded check option的视图,条件book_id<5,

数据库——视图_第7张图片

插入一个book_id=25的数据,可以成功插入,因为没有with cascaded check option,所以不会检查。

数据库——视图_第8张图片

 例二:有with cascaded check option

 我在创建v2时使用了with cascaded check option,条件是book_id<15

CREATE OR REPLACE VIEW view_2 AS SELECT book_id , book_name  from tbl_book where book_id<15 WITH CASCADED CHECK OPTION;

数据库——视图_第9张图片

此时当我插入一个id=30的数据时,数据库会检查id是否满足条件, 大于条件,无法插入

数据库——视图_第10张图片

 把id改为<15的,就成功插入了。

数据库——视图_第11张图片

例三:基于另一个视图建立视图

1.基于另一个视图创建的视图有 with cascaded check option条件,更改时则会进行检查

我基于v1创建一个v3视图,条件给到id>0

数据库——视图_第12张图片

此时v1虽然没有 with cascaded check option条件,但是v3基于v1创建的,所以也会给v1默认加上检查条件,v3视图的数据就是v1和v3条件的交集,0更改数据时也会遵守这个条件

 数据库——视图_第13张图片

2.如果基于另一个视图创建的视图没有 with cascaded check option条件,更改时则不会进行检查

 基于 v3 创建的 v4 视图没有检查条件,就会按照 v3 和 v1 的检查条件,更改数据时也是如此数据库——视图_第14张图片

方式二:with local check option

local:谁定义才会检查谁,如果基类视图没有检查选项,也不会检查,只有定了才会检查

举例:

创建基于v1的v2视图,v2检查选项为with local check option

数据库——视图_第15张图片

 当插入数据时,只会检查v2的条件,不会检查v1的条件,而cascaded是会检查基于视图的条件的

数据库——视图_第16张图片

视图的更新:

要使视图可更新,视图中的行与基本表中的行之间必须存在一对一的关系,如果视图包含以下任意一项,则该视图不可更新。

1.聚合函数或窗口函数(SUM(),MIN(),MAX(),COUNT())

2distinct

3.group by

4.having

5.union或union all

举例:

我们创建一个带聚合函数的视图

数据库——视图_第17张图片

 然后进行插入操作,发现无法插入数据,因为视图的行与基本表中的行不是一对一关系

数据库——视图_第18张图片

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