1 视图

1.1 什么是视图?

视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。相比多表查询,它使得我们获取数据更容易和快捷。

1.2 使用视图的优点:

  1. 视图隐藏了底层的表结构,简化了数据访问操作,提升了访问效率,因为视图是用hash表存储的,相当于直接查询,大大减少了I/O次数,所以比join 拼接各种表快
  2. 因为隐藏了底层的表结构,所以大大加强了安全性,用户只能看到视图提供的数据,
  3. 使用视图,方便了权限管理,让用户对视图有权限而不是对底层表[基层表]有权限,进一步加强了安全性
  4. 视图提供了一个用户访问的接口,当底层表改变后,会修改相应的视图,使已经建立在这个视图上客户端程序不受影响

1.3 使用视图的缺点

  1. 更新视图需要花费额外的开销
  2. 存放视图也会占用一定的磁盘空间
  3. 更复杂的视图不能更新,是只读视图。

1.4 视图的使用场景有两类?

  • 只暴露部分字段给访问者,所以就建一个虚表,就是视图。
  • 查询的数据来源于不同的表,而查询者希望以统一的方式查询(而不是select语句通过join拼接的方式查询),这样也可以建立一个视图,把多个表查询结果联合起来,查询者只需要直接从视图中获取数据,不必考虑数据来源于不同表所带来的差异

2 临时表

临时表详解,请看这篇文章,非常通俗易懂:https://zhuanlan.zhihu.com/p/64520100

3 临时表和视图的应用区别

3.1 应用场景

什么时候使用视图呢?

应用场景1:对应1.4的第一种情况;保密工作,比如有一个员工工资表,如果你只希望财务看到员工工资这个字段,而其他人不能看到工资字段,那就用一个视图,把工资这个敏感字段过滤掉。

应用场景2:对应1.4的第二种情况;有一个查询语句非常复杂,大概有100行这么多,有时还想把这个巨大无比的select语句和其他表关联起来得到结果,写太多很麻烦,可以用一个视图来代替这100行的select语句,充当一个变量角色

什么时候使用临时表呢

  1. 应用场景 - 嵌套查询, 请查看2中给出的链接
  2. 应用场景2:你在短期内有很多DML操作,比如京东淘宝亚马逊的购物车表,把东西放购物车(insert),变更数量(update),删除商品(delete),一旦结算金钱后,这些数据就要清掉,这时需要用临时表。
  3. 应用场景3:在导出数据时,你可能不想导完整的数据库,或者表,你可能只想要导出符合某些条件的数据,那么你可以创建临时表,把select语句插入到临时表,接着导出这个临时表,导完以后通过结束session或者事务的方式,让这些没用的数据自动清理掉。
  4. 应用场景4:你在写存储过程时,有很多的连接,比如你需要连接A,B,C,D,E,F,G,H那么多张表,才能得到你的结果表,同时做连接的消耗太大,你可以先A,B,C连接的结果,放在临时表,接着再把这张临时表,跟D,E,F连接,作为新的结果放在临时表,接着再把临时表与G,H连接,最后得到临时表数据,一次插入到结果表(永久表)。