MySQL全面瓦解15:视图

MySQL全面瓦解15:视图,第1张

概述概述 很多时候,我们会有一些很复杂的数据库 *** 作,比如整合用户的行为数据,那这些数据可能包含用户的餐饮、生活日用、充值消费、交通出行、通讯物流、交通出行、医疗保健、住房物业、运动健康... 基于此,我们 概述

很多时候,我们会有一些很复杂的数据库 *** 作,比如整合用户的行为数据,那这些数据可能包含用户的餐饮、生活日用、充值消费、交通出行、通讯物流、交通出行、医疗保健、住房物业、运动健康...

基于此,我们可能要去关联很多的用户行为信息表,写一大堆的合并、统计,以及条件过滤的脚本,来输出最终的二维表,这才是用户真正需要的数据。如果把这些复杂的脚本写在业务程序中不是很合理,那有什么办法把

这些脚本细节隐藏,只显示只显示简洁的结果呢,那就要用到视图了。

视图是由数据库中的一个表或多个表导出的虚拟表,是一种虚拟存在的表,方便用户对数据的 *** 作。

概念

视图是在MysqL5之后出现的,是一种虚拟表,行和列的数据来自于定义视图时使用的一些表中,视图的数据是在使用视图的时候动态生成的,视图只保存了sql的逻辑,不保存查询的结果。

使用场景

多个业务场景使用到相同的查询结果,并且该查询结果比较复杂的时候,我们可以使用视图来隐藏复杂的实现细节。

视图和表比较
 语法实际中是否占用物理空间使用
视图create vIEw否,仅保存sql的逻辑增删改查,实际上我们只使用查询
create table是,保存了数据增删改查
视图的作用

对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其他数据库的一个或多个表,或者其他视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。视图的作用归纳为如下几点。

1、简单性

看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化他们的 *** 作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的 *** 作每次指定查询的条件。

经常需要联合查询的内容也可以指定为视图,这样就不需要每次都写大量的联表脚本。

2、安全性

视图的安全性可以防止未授权用户查看特定的行或列,使有权限用户只能看到表中特定行的方法,比如把只有某部分数据查询视图授权给某个用户。

3、逻辑数据独立性

视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,程序一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。视图可以在以下几个方面使程序与数据独立。

(1)如果应用建立在数据库表上,当数据库表发生变化时,可以在表上建立视图,通过视图屏蔽表的变化,从而使应用程序可以不动。

(2)如果应用建立在数据库表上,当应用发生变化时,可以在表上建立视图,通过视图屏蔽应用的变化,从而使数据库表不动。

(3)如果应用建立在视图上,当数据库表发生变化时,可以在表上修改视图,通过视图屏蔽表的变化,从而使应用程序可以不动。

(4)如果应用建立在视图上,当应用发生变化时,可以在表上修改视图,通过视图屏蔽应用的变化,从而使数据库可以不动。

数据准备

 

表名描述
departments部门表
employees员工信息表
jobs职位信息表
locations位置表(部门表中会用到)
job_grades薪资等级表
创建视图

MysqL中,创建视图是通过CREATE VIEW语句实现的。

语法
1 CREATE [OR REPLACE] ALGORITHM={UNdefineD|MERGE|TEMPtable}]2 VIEW VIEwname(ColumnList)3 AS SELECT ...4 WITH [CASCADED|LOCAL] CHECK OPTION];

参数说明:

(1)ALGORITHM:可选项,表示视图选择的算法。

(2)VIEwname 视图名:表示要创建的视图名称。

(3)ColumnList 属性清单:可选项,指定视图中各个属性的名词,默认情况下与SELECT语句中的查询的属性相同。

(4)SELECT语句:表示一个完整的查询语句,将查询记录导入视图中。

(5)WITH CHECK OPTION:可选项,表示更新视图时要保证在该视图的权限范围之内。

视图的使用步骤

(1)创建视图

(2)对视图执行查询 *** 作

对单表的 *** 作

查询出订单表中,单笔订单额度超过100元的数据,下面依次展示创建视图和查询视图。

 1 MysqL> select *  from t_order; 2 +---------+-----+-------+--------+---------------------+------+ 3 | orderID | uID | uname | amount | time                | year | 4  5 |      20 |   1 | brand | 91.23  2018-0817:22:21 2018  6 87.54  20190716 09:21:30 2019  7 22 166.88 0404 12:23:55  8 23 2 | helyn 93.73  0915 10:11:11  9 24 102.32 0108 33:25 10 106.06 1225:11 26 73.42  202003 16:2020 12 27 3 | sol   55.55  05 19:13 28 69.96  14 29 4 | weng  199.99 0655:06 15 16 10 rows in set17 18 MysqLcreate vIEw vIEw119     -> as * from t_order where amount >100;20 query OK,0 rows affected21 22 MysqL vIEw1;23 24 25 26 27 28 29 30 31 4 rows 32 33 MysqL>  from vIEw1 where = 201934 35 36 37 38 39 40 41 3 rows set

 

上面我们创建了一个视图:vIEw1,我们需要看某个条件下的信息时,不用关心这个视图内部是什么样的,只需要查询视图就可以了,sql简单很多。 

对多表的 *** 作

有两个表:学生、班级,数据基数如下,需要创建一个视图,统计每个班级的人数和平均成绩和总成绩。

 classes;-------+-----------+| classID | classname |       | 初三一班  | 初三二班  | 初三三班  10 11 MysqL students;---------+-------------+-------+---------+| studentID | studentname | score |         | brand       97.5  | helen       96.5  17 | lyn         96    18 | sol         97    19 7 | b1          81    20 8 | b2          82    21 |        13 | c1          71    22 14 | c2          72.5  19 | lala        51    0 9 rows set 
vIEw vIEw2 select a.classname as '班级名称',count(b.studentID) 总人数sum(b.score) 总分avg(b.score) 平均分' 2 from classes a inner join students b on a.classID = b.classID  3 group by a.classID,a.classname; 4 query OK,1)"> 5  6 MysqL vIEw2;--------+--------+--------+-----------+| 班级名称 | 总人数 | 总分   | 平均分    | 初三一班 387.00 96.750000 | 初三二班 163.00 81.500000 | 初三三班 143.50 71.750000 set
查询视图结构

使用 desc  vIEwname 语法查看视图的结构

desc--------+---------------+------+-----+---------+-------+| FIEld    | Type          | Null Key Default | Extra varchar(30)   | YES  |     NulL    | 总人数   bigint(21)    | NO   0       | 总分     decimal(32,1); Font-weight: bold">2) | 平均分   14,1); Font-weight: bold">6) set

使用show create vIEw语法查看视图创建信息

1 MysqL> show 2 -----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+3 VIEw  Create VIEw                                                                                                                                                                                                                                                                                                                                    | character_set_clIEnt | collation_connection 4 5 | vIEw2 CREATE ALGORITHM=UNdefineD defineR=`root`@`localhost` sql Security defineR VIEW `vIEw2` AS select `a`.`classname` AS `班级名称`,1)">count(`b`.`studentID`) AS `总人数`,1)">sum(`b`.`score`) AS `总分`,1)">avg(`b`.`score`) AS `平均分` from (`classes` `a` join `students` `b` on((`a`.`classID` = `b`.`classID`))) by `a`.`classID`,`a`.`classname` | utf8                 | utf8_general_ci      6 7 1 row set
修改视图

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

create or replace方式

当视图存在时,修改,不存在时,创建新的视图。

create or replace set 
alter方式
alter set 
删除视图

删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据。MysqL中,使用DROP VIEW语句来删除视图。但是,用户必须拥有DROP权限。

语法
DROP VIEW IF EXISTS vname1[,vname2][,vname3];

 可以删除多个视图,多个视图名称使用都好隔开。

EXISTS vIEw1,vIEw2;2 query OK,1); Font-weight: bold">0 rows affected 
更新视图数据

即更改视图中的数据,而不是更改视图中的sql逻辑。当对视图进行更新后,也会对原始表的数据进行更新。

为了防止对原始表的数据产生更新,可以为视图添加只读权限,只允许读视图,不允许对视图进行更新。一般比较少这么 *** 作:

vIEw vIEw1  2 query OK,1)"> 3  4 MysqL13 14 MysqLinsert into vIEw1 values(4,1)">出三四班');15 query OK,1); Font-weight: bold">1 row affected16 17 MysqLupdate vIEw1 set classname=初三四班' where classID=418 query OK,1)">19 Rows matched: 1  Changed: 1  Warnings: 020 21 MysqL| 初三四班  set 

视图的更新我们一般不使用,为了保护视图的某部分区间的数据不被修改,一般会使用WITH CHECK OPTION约束 ,甚至设置为只读视图。

with check option

视图只 *** 作它能够查询出来的数据,对于查询不出的数据,即使基表中存在数据,也不可以通过视图来 *** 作。针对这方面的限制有 with check option 表达式进行 *** 作。他对delete、insert、update分别有如下约束:

关键字类型描述
update有with check option,要保证update后,数据能被视图查询出来
delete有无with check option都一样
insert有with check option,要保证insert后,数据要被视图查询出来

下面创建两个同样结果的视图,一个带with check option,一个不带。

vIEw v from  t_order where amount 3  vIEw v_option 0 with check option 5 query OK,1)"> 6  7 MysqL-------+---------+---------+-------+| account | amount  | goods | brand   52.2    9 | hen     1752.02 10 | helyn   88.5    | sol     1007.9  |    12 | diny    12      | weng    5 | sally   99.71   |18 |      15 | brand1  | -99.99  |     6 |8 rows set

原表有8条数据,因为条件限制,视图无法读取到最后一条数据,即只有前7条数据。那根据上面的规则,使用v_option视图进行修改,修改他查询范围之外的数据应该是不允许的,我们来试试:

update v_option set amount=-8 where orderID121369 - OPTION Failed test.v_option' 

amout = -8,改完后数据会跑到视图可查询范围之外,所以被限制了。使用不限制的视图就可以了,如下:

update v  3 Rows matched:  4  5 MysqL8      | brand1  99.99  6 set 

同理,delete、insert 也可以验证下。 

总结

了解视图的用途及与表的区别。

掌握视图的创建、使用、修改、删除。

 了解视图的优点:简单简洁(隐藏细节,输出结果)、安全性(用户只能看到表中特定行的方法)、逻辑数据独立性。

总结

以上是内存溢出为你收集整理的MySQL全面瓦解15:视图全部内容,希望文章能够帮你解决MySQL全面瓦解15:视图所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1151533.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存