使用视图可以获得以下好处:
- 可以将实体数据表隐藏起来,让外部程序无法得知实际的数据结构,让访问者可以使用表的组成部分而不是整个表,降低数据库被攻击的风险。
- 在大多数的情况下视图是只读的(更新视图的操作通常都有诸多的限制),外部程序无法直接透过视图修改数据。
- 重用SQL语句,将高度复杂的查询包装在视图表中,直接访问该视图即可取出需要的数据;也可以将视图视为数据表进行连接查询。
- 视图可以返回与实体数据表不同格式的数据
注意:因为视图不包含数据,所以每次使用视图时,都必须执行查询以获得数据,如果你使用了连接查询、嵌套查询创建了较为复杂的视图,你可能会发现查询性能下降得很厉害。因此,在使用复杂的视图前,应该进行测试以确保其性能能够满足应用的需求
创建视图
create view vw_avg_score
as
select sid, round(avg(score), 1) as avgscore
from tb_record group by sid;
create view vw_student_score
as
select stuname, avgscore
from tb_student, vw_avg_score
where stuid=sid;
使用视图
跟table的操作一样
select stuname, avgscore from vw_student_score order by avgscore desc;
视图的更新
视图的可更新性要视具体情况而定,以下类型的视图是不能更新的:
- 使用了聚合函数(SUM、MIN、MAX、AVG、COUNT等)、DISTINCT、GROUP BY、HAVING、UNION或者UNION ALL的视图。
- SELECT中包含了子查询的视图。
- FROM子句中包含了一个不能更新的视图的视图。
-
删除视图
drop view vw_student_score;
视图的规则和限制。
视图可以嵌套,可以利用从其他视图中检索的数据来构造一个新的视图。视图也可以和表一起使用。
- 创建视图时可以使用
order by
子句,但如果从视图中检索数据时也使用了order by
,那么该视图中原先的order by
会被覆盖。 - 视图无法使用索引,也不会激发触发器(实际开发中因为性能等各方面的考虑,通常不建议使用触发器)的执行