视图是从一个或多个表中导出来的虚拟表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据。
1、视图简介
1.1 视图的含义
视图是从一个或多个表中导出来的虚拟表,还可以从已经存在的视图的基础上定义。
数据库中只存放视图的定义,而不存放视图中的数据,这些数据仍存放在原来的表中。一旦表中的数据发生变化,显示在视图中的数据也会相应变化。
MySQL的视图并不支持输入参数的功能,即交互性上较差,但对于变化不是很大的操作,使用视图可以很大程度上简化用户的操作。
1.2 视图的作用
视图起着类似于筛选的作用,具体可归纳为
(1)所见即所需,使操作简单化
(2)通过视图,用户只能查询和修改指定的数据,从而限制了用户的权限,增加了数据的安全性
(3)视图可以屏蔽原有表结构变化带来的影响,从而提高了表的逻辑独立性。
2、创建视图
MySQL中,创建视图是通过Creat View语句实现的,具体为
其中,Algorithm为视图选择的算法;属性清单指定了视图中各个属性的名词,默认情况下与Select语句中查询的属性相同;Select语句是一个完整的查询语句,表示从某个表中查出某些满足条件的记录并将这些记录导入到视图中;With Check Option表示更新视图时要保证在该视图的权限范围之内,CASCADED表示更新视图时要满足所有相关视图和表的条件,为默认值,Local表示更新视图时要满足该视图本身的定义即可;注意在使用创建视图时最好加上With Check Option,并选取默认的CASCADED参数。从而保证从视图派生出来的新视图在更新后可以考虑其父视图的约束条件,即更严谨。
(1)关于Algorithm中的三个选项,Undefined选项表示MySQL将自动选择所要使用的算法,Merge选项表示将使用视图的语句与视图定义合并起来,使得视图定义的某一部分代替语句的对应部分,Temptable选项表示将视图的结果存入临时表,然后使用临时表执行语句。
(2)需要注意的是,在创建视图之前,需穴ky"http://www.it165.net/qq/" target="_blank" class="keylink">qq87LLpyse38b7f09BDcmVhdGUgdmlld7XEyKjP3rrNsunRr8nmvLC1xMHQtcRTZWxlY3TIqM/eo6zV4tCpyKjP3rGjtObU2k15U1FMyv2+3b/iz8LD5rXEdXNlcrHt1tCjrL/J0tTKytPDc2VsZWN00+++5LLp0a+jrL7fzOXOqjwvcD4KPGJsb2NrcXVvdGU+Cgk8cD5zZWxlY3Qgc2VsZWN0X3ByaXYsIGNyZWF0ZV92aWV3X3ByaXYgZnJvbSBteXNxbC51c2VyIHdoZXJlIHVzZXI9JnJzcXVvO9PDu6fD+yZyc3F1bzs8L3A+CjwvYmxvY2txdW90ZT4KPHA+xuTW0KOs08O7p8P7ss7K/bHtyr7SqrLp0a/ExLj208O7p8rHt/HTtdPQRHJvcMioz96jrNTaztK1xM+1zbPW0KOs1rvT0HJvb3TTw7unoaM8YnIgLz4Kz8LD5srH0ru49rTTZGVwYXJ0bWVudLHtus13b3JrZXKx7cnPtLS9qNK7uPbD+86qd29ya2VyX3ZpZXcxtcTK0828tcSwuMD9PGJyIC8+CjxpbWcgYWx0PQ=="这里写图片描述" src="http://www.it165.net/uploadfile/files/2016/0412/201604121915222059.png" title="" />
3、查看视图
查看视图必须要有show view的权限,同样保存在user表中。
查看视图的方法包括describe语句、show table status语句、show create view语句和查询information_schema数据库下的views表等。
3.1 describe语句查看简单信息
查看视图的describe语句和查看表的语句是一样的,因为视图是一种特殊的表,基本形式为
describe 视图名;
3.2 show table status语句查看基本信息
基本形式为
Show Table Status Like ‘视图名’;
3.3 show create view语句查看详细信息
基本形式为
Show create view 视图名;
3.4 在views表中查看详细信息
MySQL中,所有视图的定义都存在information_schema数据库下的views表中,查询此表即可查看到数据库中所有视图的详细信息。
基本形式为
select * from information_schema.views;
其中*表示查询所有的列的信息。
显然用此语句查看到的是所有的视图,不方便查阅,一般查询详细信息时用3.3法即可。
4、修改视图
当基本表的某些字段发生改变时,有必要修改视图的定义来保持视图和基本表之间的一致性。
4.1 Create or replace view语句
此语句很好用,在存在视图情况下可对视图进行修改,在没有视图情况下,可以创建视图,具体语法为
实际上,感觉此语句就是重新定义了个视图并覆盖了原始图。
4.2 Alter语句
回顾前面,alter语句不仅可以创建索引,修改表的定义,在此处,还可以修改视图的定义。
基本形式为
5、更新视图
更新视图是指通过视图来插入、更新和删除表中的数据。
更新视图时,只能更新权限范围内的数据。
实际上对视图的更新最后都是实现在基本表上的。
注意以下情况不能更新视图:
(1)视图中包含sum(),count(),max()和min()等函数
(2)视图中包含union,union all,distinct,group by和having等关键字
(3)常量视图,即视图中的某个字段时常量类型
(4)视图中的select中包含子查询
(5)由不可更新的视图导出的视图
(6)创建视图时,algorithm选择了temptable类型,即系统默认临时表是不可更新的
(7)视图对应的表上存在没有默认值的列,且该列没有包含在视图中。因为,在更新视图时,这个没有默认值的记录将没有值插入,也没有NULL值插入,系统不允许这种情况出现
由于视图的更新存在很多限制,一般,最好把视图作为查询数据的虚拟表,而不要通过视图来更新数据,很容易造成更新失败。
6、删除视图
删除视图只会删除视图的定义,并不会删除数据。DROP View语句可用来删除视图,但用户必须拥有drop的权限,具体操作为
drop view [if exists] 视图名列表 [restrict|cascade]
其中,if exists用来判断视图存在,存在才执行;在视图名列表中不同视图名称之间通过逗号隔开。