视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。——百度百科
关系型数据库中的数据是由一张一张的二维关系表所组成,简单的单表查询只需要遍历一个表,而复杂的多表查询需要将多个表连接起来进行查询任务。对于复杂的查询事件,每次查询都需要编写MySQL代码效率低下。为了解决这个问题,数据库提供了视图(view)功能。
0 视图相关的MySQL指令
操作指令 代码
创建视图 CREATE VIEW 视图名(列1,列2...) AS SELECT (列1,列2...) FROM ...;
使用视图 当成表使用就好
修改视图 CREATE OR REPLACE VIEW 视图名 AS SELECT [...] FROM [...];
查看数据库已有视图 >SHOW TABLES [like...];(可以使用模糊查找)
查看视图详情 DESC 视图名或者SHOW FIELDS FROM 视图名
视图条件限制 [WITH CHECK OPTION]
1 视图
百度百科定义了什么是视图,但是对缺乏相关知识的人可能还是难以理解或者只有一个比较抽象的概念,笔者举个例子来解释下什么是视图。
朕想要了解皇宫的国库的相关情况,想知道酒窖有什么酒,剩多少,窖藏多少年,于是派最信任的高公公去清点,高公公去国库清点后报给了朕;朕又想知道藏书情况,于是又派高公公去清点并回来报告给朕,又想知道金银珠宝如何,又派高公公清点。。。过一段时间又想知道藏书情况,高公公还得重新再去清点,皇上问一次,高公公就得跑一次路。
后来皇上觉得高公公不容易,就成立了国库管理部门,小邓子负责酒窖,小卓子负责藏书,而小六子负责金库的清点。。。后来皇上每次想了解国库就直接问话负责人,负责人就按照职责要求进行汇报。
安排专人管理后,每次皇上想要了解国库情况,就不必让高公公每次都跑一趟,而是指定的人员按照指定的任务完成指定的汇报工作就可以了。
和数据库相对应,每次进行查询工作,都需要编写查询代码进行查询;而视图的作用就是不必每次都重新编写查询的SQL代码,而是通过视图直接查询即可。因此:
视图是虚拟表,本身不存储数据,而是按照指定的方式进行查询。
比如,我们希望从前文提到的四张表,order_baisc,order_details,user和product中查找所有记录,需要写入代码指令:
想再次查询这几个表中uid为u0001的用户的记录,有需要键入一次操作指令:
也就是说,每次查询都得重新键入查询指令SQL代码,这种费时费力的体力活,对于时间就是生命的你我来说,是不划算的。所以借助视图,来执行相同或相似的查询。
2 创建视图
2.1 创建视图create view
创建视图的代码为:
>CREATE VIEW 视图名(列1,列2...)
AS SELECT (列1,列2...)
FROM ...;
可以看到,创建视图和查询相比,增加了前面的CREATE VIEW 视图名 AS
2.2 视图运用
使用视图和使用表完全一样,只需要把视图当成一张表就OK了。视图是一张虚拟表。
eg:创建order_baisc,order_details,user和product的查询视图,并通过视图查找uid为u0001的记录:
2.3 修改视图CREATE OR REPLACE VIEW
修改和创建视图可以使用代码:
CREATE OR REPLACE VIEW 视图名 AS SELECT [...] FROM [...];
eg:
2.4 查看视图
(1)查看数据库中有哪些视图 show tables
前面提到,视图就是虚拟的表,因此,查看视图的方法和查看表的方法是一样的:
>SHOW TABLES;
通过show tables;反馈得到所有的表和视图。同样的,我们可以通过模糊检索的方式专门查看视图,这个时候,视图的命令统一采用v_视图名v_视图名的优势就体现出来了。
(2)查看视图详情
查看视图详情的方法有两种,一种是和查看表详情一样使用desc 视图名,另外一种方法是show fields from 视图名:
>DESC 视图名;
或者
>SHOW FIELDS FROM 视图名;
两种方法得到的详情都是一毛一样的。
3 视图与数据变更
3.1 表格数据变更
将表product中的数据进行更新,在通过视图检索:
可以看到表格数据变化后,在通过视图检索,得到的结果也同步发生了变化,因此,在此证明了:
视图不是表,不保存数据,知识一张虚拟表;
3.2 通过视图变更数据
(1)插入数据
>INSERT INTO v_order(pid,pname,price) VALUES('p010','柴油','34');
在此查询视图,发现插入了数据。
(2)跨表插入数据
通过上图,我们可以看到,跨表插入数据系统反馈报错,提示不能修改超过一个表的数据。
因此,可以通过视图插入数据,但是只能基于一个基础表进行插入,不能跨表更新数据。
(3)WITH CHECK OPTION
如果在创建视图的时候制定了“WITH CHECK OPTION”,那么更新数据时不能插入或更新不符合视图限制条件的记录。
eg:对表product创建一个单价超过3000的视图,并加上“WITH CHECK OPTION”,之后插入一个价格为42的记录:
可以看到系统提示错误CHECK OPTION FAILED。因为视图限制了价格要高于3000.
后面再次尝试了不加“WITH CHECK OPTION”的视图,后者可以成功插入。
同样的,在不加“WITH CHECK OPTION”的情况下,通过视图修改记录,也可以成功执行:
通过视图修改,可能导致数据无故消失,因此:
没有特殊的理由,建议加上“WITH CHECK OPTION”命令。
————————————————
版权声明:本文为CSDN博主「moxigandashu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/moxigandashu/article/details/63254901
一、视图的概念
视图(子查询):是从一个或多个表导出的虚拟的表,其内容由查询定义。具有普通表的结构,但是不实现数据存储。单表视图一般用于查询和修改,会改变基本表的数据;多表视图一般用于查询,不会改变基本表的数据。
【例子】:
在一个班级里,作为班主任需要知道全班同学所有课程的成绩,便于全面指导;而数学老师只需要知道全班学生的数学成绩就行了。所以视图的一个重要作用就是区分权限。
二、视图的SQL相关操作
/**** 1、创建和删除视图 ****/// 创建视图(指定某些字段,显示字段时重命名),后面还可以接WHERE进行条件查询CREATEVIEWv1(b,a)ASSELECTbookName,authorFROMt_book;// 通过视图来查询(只能查询到指定的字段,提高了安全性)SELECT*FROMv1;// 删除视图(视图只是一种虚拟的表,删除视图对原来的数据表没有影响)DROPVIEWIFEXISTSv1;/**** 2、查看视图 ****/// 查看视图descv1;// 查看视图基本信息SHOWTABLESTATUSLIKE'v1';// 查看视图详细信息SHOWCREATEVIEWv1;/**** 3、修改视图 ****/// 修改视图CREATEORREPLACEVIEWv1(b,p)ASSELECTbookName,priceFROMt_book;ALTERVIEWv1ASSELECT*FROMt_book;/**** 4、更新视图 ****/// 向视图中插入数据(其实就是在表中插入数据)INSERTINTOv1VALUES("6","中国历史","MK","45","4");// 更新视图的数据UPDATEv1SETprice=54WHEREid=6;// 删除视图的数据DELETEFROMv1WHEREid=6;
三、视图总结
1、视图的作用
(1)简化了操作,把经常使用的数据定义为视图
我们在使用查询时,在很多时候我们要使用聚合函数,同时还要 显示其它字段的信息,可能还会需要关联到其它表,这时写的语句可能会很长,如果这个动作频繁发生的话,我们可以创建视图,这以后,我们只需要select * from view就可以啦,这样很方便。
(2)安全性,用户只能查询和修改能看到的数据
因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以将基表中重要的字段信息,可以不通过视图给用户,视图是动态的数据的集合,数据是随着基表的更新而更新。同时,用户对视图不可以随意的更改和删除,可以保证数据的安全性。
(3)逻辑上的独立性,屏蔽了真实表的结构带来的影响
视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。
2、视图的缺点
(1)性能差
数据库必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,数据库也要把它变成一个复杂的结合体,需要花费一定的时间。
(2)修改限制
当用户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的视图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。
参考:https://blog.csdn.net/buhuikanjian/article/details/53105416
网友评论