一、什么是视图?
视图是虚拟的表,与包含数据的表不一样,视图不包含数据,只包含使用时动态检索数据的查询。可以理解为:视图只是一条被包装的SQL语句,它可以重复使用,简化了SQL语句的编写操作。同时,因其不包含数据,每次都需要从表中重新检索,因此速度较慢。
二、视图的一些常见应用
- 重用的SQL语句
- 简化复杂的SQL操作,在编写查询后,可以方便地重用它,而不必知道它的基本查询细节
- 使用表的组成部分,而不是整个表
- 保护数据,可以给用户授予表的特定部分的访问权限,而不是整个表的访问权限
- 更改数据格式和表示,视图可以返回与底层表的表示和格式不同的数据
三、视图的规则和限制
- 与表一样,视图必须唯一命名,不能与别的视图或表同名
- 对于视图数目,没有限制
- 创建视图必须有足够的访问权限
- 视图可以嵌套,可以从视图中检索数据构造另一个视图
- order by 可用在视图中,但是如果从该视图中检索数据时,也使用了order by ,那么视图中本身的order by 将被覆盖
- 视图不能索引,也不能有关联的触发器或默认值
- 视图可以和表一起使用,如将视图和表联结
四、使用视图
- 创建视图:
CREATE VIEW
- 查看视图:
SHOW CREATE VIEW view_name
- 删除视图:
DROP VIEW view_name
- 更新视图:第一种,先将原视图删除,再重新创建视图;第二种,使用
CREATE OR REPLACE VIEW
如果原视图不存在,将会创建一个新视图,如果原视图存在,则会替换原视图。
五、例子
1.有下面两张表City和CountryLanguage,表中信息如下:
City表:
CountryLanguage表:
2.创建视图
CREATE VIEW city_language AS
SELECT a.name,a.countrycode,a.district,a.population,b.language,b.IsOfficial,b.Percentage
FROM City AS a,CountryLanguage AS b
WHERE a.countrycode = b.countrycode;
该语句无返回结果,仅仅是创建了一个名为city_language 的视图,该视图将两张表按照countrycode列的值进行联结。
从视图中检索数据:
SELECT name,population,percentage
FROM city_language;
返回结果:
当然,我们也能在创建视图时,使用函数,这些原理和上面类似,最主要还是理解视图是什么,创建视图就不难了。
3.更新视图
视图可以使用INSERT、UPDATE 和 DELETE 更新,更新视图实际上就是更新其基表。但是如果MySQL不能正确地确定被更新的基数据,则不允许更新(包括插入和删除)。
如果视图定义中有以下操作,则不能更新视图:
- 分组(使用GROUP BY 和 HAVING)
- 联结
- 子查询
- 并
- 聚集函数(如MIN( ) 、COUNT( ) 、SUM( ) 等)
- 使用DISTINCT
- 导出(计算)列
六、总结
对于视图,最重要的还是理解视图是什么,可以理解为视图就是一个SQL语句,只不过给这个SQL语句起了一个名字,我们之后不用再重新编写该语句,直接使用它的名字就可以;当我们从视图中检索数据时,MySQL会自动将我们检索的SQL语句和视图的SQL语句合并,给出我们想要的结果,这样就大大简化了我们的操作。