视图
参考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语句。