MySQL学习Day08——视图

MySQL的视图

1.常见的数据库对象:

对象描述
表Table表是存储数据的逻辑单元,以行和列的形式存在,列就是字段,行就是记录
数据字典就是系统表,存放数据库相关信息的表,系统表的数据通常由数据库系统维护,程序员只能查看
约束执行数据校验的规则,用于保证数据完整性的规则
视图VIEW

一个或多个数据表里的数据的逻辑显示,视图并不存储数据

索引INDEX用于提高查询性能,相当于书的目录
存储过程用于完成一次完整的业务处理,没有返回值,但可以通过传出参数将多个值传给调用环境
存储函数用于完成一次特定的计算,具有一个返回值
触发器相当于一个事件监听器,当数据库发生特定事件后,触发器被触发,完成相应的处理

2.视图概述

视图view是一个虚拟表,非真实存在,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只要使用视图名称即可获取结果集,并可以将其当做表来使用,可以将视图当做存储起来的SELECT语句。数据库中只存放了视图的定义,而并没有存放视图中的数据,这些数据存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据,因此,视图中的数据是依赖于原来的表中的数据的,一旦表中的数据发生改变,显示在视图中的数据也会发生变化。视图可以用于数据库权限的管理,视图建立在已有表的基础上,这些已有的表称为基表,视图的创建和删除只会影响视图本身而不会影响对应的基表,但是当对视图中的数据进行增删改操作时数据表中的数据会相应发生变化,反之亦然。注意,视图和表不能有相同的名字。

3.视图的作用:

(1).简化复杂的查询:视图有助于简化复杂的查询。如果你有任何经常使用的复杂查询,你可以基于它创建一个视图,这样你就可以通过使用一个简单的 SELECT 语句来引用该视图,而不是重新输入查询内容。

(2)使业务逻辑一致:假设你不得不在每个查询中重复写相同的公式。或者你有一个具有复杂业务逻辑的查询。为了使这种逻辑在不同的查询中保持一致,你可以使用一个视图来存储计算结果,并隐藏其复杂性

(3)增加额外的安全层:一个表可能会暴露出很多数据,包括敏感数据。通过使用视图和权限,你可以限制用户可以访问哪些数据,只向他们暴露必要的数据

简化代码,可以把重复使用的查询封装成为视图重复使用,同时可以使复杂的查询易于理解和使用。控制数据的访问权限,安全。如果一张表中有很多数据,很多信息不希望被所有人看到,可以使用视图。

4.视图的操作

(1).视图的创建:

CREATE [OR REPLACE] [ALGORITHM = {undefined | merge | temptable}]
VIEW view_name [(column_list)]
AS select_statement
[WITH[CASCADED | LOCAL] check option]
参数说明:
1.algorithm:可选项,表示视图选择的算法
MERGE:当从 MERGE 视图查询时,MySQL首先将输入查询与视图定义中的SELECT语句合并为一个单一的查询。然后,执行合并后的查询以返回结果集。
TEMPTABLE:当向TEMPTABLE视图发出查询时,MySQL首先创建一个临时表来存储视图定义中的SELECT的结果。然后,针对该临时表执行输入查询。因为 MySQL 必须创建临时表来存储结果集,并将数据从基表移到临时表,所以TEMPTABLE算法的效率比MERGE算法低。注意,TEMPTABLE视图不能被更新。
UNDEFINED:当创建视图而不指定ALGORITHM子句或明确指定ALGORITHM=UNDEFINED时,UNDEFINED是默认算法。此外,当用ALGORITHM=MERGE创建视图而MySQL只能用临时表处理该视图时,MySQL会自动将算法设置UNDEFINED并产生一个警告。UNDEFINED允许MySQL选择MERGE或TEMPTABLE。而如果可能的话,MySQL更倾向于MERGE而不是 TEMPTABLE,因为MERGE通常比TEMPTABLE更有效。
2.view_name:表示要创建的视图名称
3.column_list:可选项,指定视图中各个属性的名词,默认情况下与SELECT语句中的查询的属性相同
4.select_statement:表示一个完整的查询语句,将查询记录导入到视图当中
5.[with [cascaded | local] check  option]:可选项,表示更新视图时要保证在该视图的权限范围内
有时创建一个视图来显示一个表的部分数据。然而,一个简单的视图是可更新的,因此有可能更新那些通过视图不可见的数据。这种更新会使视图不一致。为了确保视图的一致性,在创建或修改视图时,要使用WITH CHECK OPTION 子句。WITH CHECK OPTION防止视图更新或插入通过它不可见的行。换句话说,每当通过视图更新或插入基表的行时,MySQL确保插入或更新操作符合视图的定义。

(2).查看视图:

SHOW TABLES;查看数据库的表对象,视图对象
SHOW FULL TABLES WHERE table_type = 'VIEW';只显示当前数据库中的所有视图
DESC view_name;查看视图的结构
SHOW TABLE STATUS LIKE '视图名称';查看视图的属性信息
SHOW CREATE VIEW view_name;查看视图的创建语句信息
SELECT * FROM information_schema.tables;

(3).修改视图:

修改视图是指修改数据库中已存在的表的定义,当基本表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致。MySQL中通过CREATE OR REPLACE VIEW语句和ALTER VIEW语句来修改视图。

ALTER VIEW 视图名 AS select 语句

(4).更新视图:

某些视图是可以更新的,也就是说可以在UPDATE,DELETE或INSERT等语句中使用它们,以更新基表的内容,对于可以更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。如果视图包含下面结构中的一种,那么它就是不可以更新的:

a.在定义视图的时候指定了ALGORITHM = TEMPTABLE,视图将不支持INSERT和DELETE操作;

b.视图中不包含基表中所有被定义为非空又未指定默认值的列,视图将不支持INSERT操作

c.在定义视图的SELECT的语句中使用了JOIN联合查询,视图将不支持INSERT和DELETE操作

d.在定义视图的SELECT语句后的字段列表中使用了数学表达式或子查询,视图将不支持INSERT,也不支持UPDATE使用了数学表达式、子查询的字段值;

e.在定义视图的SELECT语句后的字段列表中使用了DISTINCT、聚合函数、GROUP BY、HAVING、UNION等,视图将不支持INSERT,UPDATE和DELETE.

f.在定义视图的SELECT语句中包含了子查询,而子查询中引用了FROM后面的表,视图将不支持INSERT、UPDATE和DELETE

g.视图定义基于一个不可更新视图;

h.常量视图

视图中虽然可以更新数据,但是有很多的限制,一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,就可能会造成数据更新失败。

(5).重命名视图:

RENAME TABLE 视图名 TO 新视图名;

(6).删除视图:删除视图时,只能删除视图的定义,而不能删除视图的数据。

DROP VIEW IF EXISTS 视图名[,视图名...];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值