使用视图可以获得以下好处:

  1. 可以将实体数据表隐藏起来,让外部程序无法得知实际的数据结构,让访问者可以使用表的组成部分而不是整个表,降低数据库被攻击的风险。
  2. 在大多数的情况下视图是只读的(更新视图的操作通常都有诸多的限制),外部程序无法直接透过视图修改数据。
  3. 重用SQL语句,将高度复杂的查询包装在视图表中,直接访问该视图即可取出需要的数据;也可以将视图视为数据表进行连接查询。
  4. 视图可以返回与实体数据表不同格式的数据

    注意:因为视图不包含数据,所以每次使用视图时,都必须执行查询以获得数据,如果你使用了连接查询、嵌套查询创建了较为复杂的视图,你可能会发现查询性能下降得很厉害。因此,在使用复杂的视图前,应该进行测试以确保其性能能够满足应用的需求

创建视图

  1. create view vw_avg_score
  2. as
  3. select sid, round(avg(score), 1) as avgscore
  4. from tb_record group by sid;
  5. create view vw_student_score
  6. as
  7. select stuname, avgscore
  8. from tb_student, vw_avg_score
  9. where stuid=sid;

使用视图

table的操作一样

  1. select stuname, avgscore from vw_student_score order by avgscore desc;

视图的更新

视图的可更新性要视具体情况而定,以下类型的视图是不能更新的:

  1. 使用了聚合函数(SUM、MIN、MAX、AVG、COUNT等)、DISTINCT、GROUP BY、HAVING、UNION或者UNION ALL的视图。
  2. SELECT中包含了子查询的视图。
  3. FROM子句中包含了一个不能更新的视图的视图。
  4. WHERE子句的子查询引用了FROM子句中的表的视图

    删除视图

    1. drop view vw_student_score;

    视图的规则和限制。

  5. 视图可以嵌套,可以利用从其他视图中检索的数据来构造一个新的视图。视图也可以和表一起使用。

  6. 创建视图时可以使用order by子句,但如果从视图中检索数据时也使用了order by,那么该视图中原先的order by会被覆盖。
  7. 视图无法使用索引,也不会激发触发器(实际开发中因为性能等各方面的考虑,通常不建议使用触发器)的执行