一 视图 定义:视图是由基本表或者其他视图导出的续表,视图在大多数情况下不能进行更新。 视图的主要优点: Ø 减轻普通用户的工作[主要在查询时] Ø 视图是数据库系统的一种安全机制[grant语句可以直接操控视图] Ø 视图可以提高数据的逻
视图
参考mysql必知必会, 有不足和误解处还望指点。
视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
视图的作用是让你把复杂的查询写在一起,方便重用。他的优点如下
重用SQL语句。
简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道它的基本查询细节。
使用表的组成部分而不是整个表。
保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。
更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。
假设有一查询语句
-- 根据用户id查询该用户姓名、地址、订单id, 订单价格(用户和订单的关系应该是一对多, 这里只做演示)
select u.name, u.address, o.id, o.price from user u, order o where u.id = o.u_id and u.id = 1
假设该sql足够复杂, 每次我们想获取用户名和订单时都要经过这复杂的sql来查询,这是可把该sql语句封装成一视图
-- 创建视图用create view 跟试图名, 视图名要求在该数据库唯一, 在在后面跟上AS语句即可跟上自己的sql
create view viewname as select u.name, u.address, o.id, o.price from user u, order o where u.id = o.u_id and u.id = 1
此时该视图viewname 相当于一张表,只是是虚拟的表, 该虚拟表会又你的sql语句所查询的各个字段组成, 如上面的这个视图打开后就是如下格式 name address id price admin chongqing 1 5200 admin2 chongqing1 11 5202 admin3 chongqing2 12 5203 admin4 chongqing3 13 5204
既原sql中的查询字段组成视图虚拟表得各个字段。创建好视图后, 就可以直接对改视图进行查询操作,而不关心该视图的类别结构。
select * from viewname where id > 10 and name like '%admin%'
可直接把该视图当做表来查询, 当基础表(此为用户表和点单表)数据发生改变时, 视图也相应的更新。
迄今为止的所有视图都是和SELECT语句使用的。
然而,视图的数据能否更新?答案视情况而定。通常,视图是可更新的(即,可以对它们使用INSERT、UPDATE和DELETE)。更新一个视图将更新其基表(可以回忆一下,视图本身没有数据)。如果你对视图增加或删除行,实际上是对其基表增加或删除行。
但是,并非所有视图都是可更新的。基本上可以说,如果MySQL不能正确地确定被更新的基数据,则不允许更新(包括插入和删除)。这实际上意味着,如果视图定义中有以下操作,则不能进行视图的更新:
分组(使用GROUP BY和HAVING);
联结;
子查询;
并;
聚集函数(Min()、Count()、Sum()等);
使用视图应注意的限制
与表一样,视图必须唯一命名(不能给视图取与别的视图或表相同的名字)
对于可以创建的视图数目没有限制。
为了创建视图,必须具有足够的访问权限。这些限制通常由数据库管理人员授予。
视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造一个视图。
ORDER BY可以用在视图中,但如果从该视图检索数据SELECT中也含有ORDER BY,那么该视图中的ORDER BY将被覆盖。
视图不能索引,也不能有关联的触发器或默认值。
视图可以和表一起使用。例如,编写一条联结表和视图的SELECT语句。