SQL的视图

  1、什么是视图

  视图是虚拟的表,是一个存储的查询,虽然不需要实际的物理存储,但是也被看作是一个数据库对象;它与包含数据的表不一样,它不包含任何列或数据,它只是包含使用时动态检索数据的查询,并且只包含一个SELECT语句(不限制子查询)。视图实际上是由预定义查询形式的表所组成的。

  视图与表之间的主要区别在于:表占据物理空间,包含实际的饿数据;而视图不需要物理空间,不包含数据,它只是从表里引用数据。

  视图只保存在内存里,而且只需要保存其定义本身(查询语句),也就是说视图所需的空间只是定义语句所需要的。

  2、视图的用途

  (1)简化数据访问,简化复杂的SQL,对数据库里的数据进行归一化处理,达到重用SQL语句;

  (2)对数据进行保护,起到安全的作用,例如只让用户访问部分字段信息;

  (3)维护摘要数据;

  (4)更改数据格式和表示,视图仅仅是用来查看存储在别处数据的一种设施。

  3、视图的使用

  在数据库里,视图的使用方式与表是一样的;当创建一个视图时,实际上是在数据库里执行了一个SELECT语句。

  (1)表创建视图

CREATE VIEW view_name AS
SELECT *
FROM table_name
[WHERE exp1]
[WITH CHECK OPTION]
[GROUP BY]

  WITH CHECK OPTION选项的目的是确保全部的UPDATE和INSERT语句满足视图定义里的WHERE条件子句,这样保证了引用的完整性。WITH CHECK OPTION有两个选项,CASCADED和LOCAL,其中CASCADED是默认选项。这两个属性都会检查视图的完整性约束和新视图的定义条件,但是LOCAL不检查底层的表,而CASCADED会检查。所以,现对于来说CASCADED更安全些。

  (2)视图创建视图

CREATE view2 AS
SELECT * FROM view1;

  如果从基表和从另一个视图创建视图具有一样的难度和效率,那么首选从基表创建视图。

  (3)视图创建表

CREATE TABLE table_name AS
SELECT col1,col2
FROM view_name;

  (4)删除视图

DROP VIEW view_name;

  (5)更改视图

  虽然ANSI SQL不包含ALTER VIEW语句,但是某些实现也会支持它,例如:MySQL\SQL Server\Oracle,在MySQL的旧版本中还可以通过REPLACE VIEW来修改视图。

  (6)使用视图

  通过视图来检索数据的时候,若是该条检索语句存在WHERE子句,并且视图定义中也存在WHERE子句,那么前一个WHERE子句会被添加到视图查询中已有的WHERE子句中,以便正确过滤数据。也即是说,一个WHERE子句在视图定义中,另外一个WHERE子句在传递给视图的中,那么这两组WHERE子句会自动合并,并且会放置在视图定义中。

  (7)嵌套视图对性能的影响

  因为搜索引擎需要分析每一层的视图,所以若视图嵌套的层数越多,那么搜索引擎需要进行更多的分析工作,这样导致性能降低,故最好控制视图的嵌套层数。实际上,大多数搜索引擎无法 确保获得一个完美的执行计划,而只能保证执行一个耗时最短的计划。

  4、视图的规则

  (1)视图名必须唯一,并在只能创建不存在的视图,视图数目没有限制;

  (2)视图可以嵌套,但是要注意性能问题;

  (3)视图不能有索引,也不能有关联的触发器或默认值;

  (4)有些DBMS禁止在视图中使用ORDER BY子句;

  (5)有些DBMS把视图作为只读的查询,禁止将数据写会底层表;

  (6)有些DBMS要求返回的列进行命名,若是计算字段的话,那么必须要使用别名;

  (7)有些DBMS可以创建这样的视图,即不能进行导致行不再属于视图的插入或更新;

  (8)视图权限:

    • 创建视图必须要有足够的权限;
    • 视图由创建者或规划所有者所拥有,视图所有者自动拥有视图的全部权限,并且可以把视图的权限授予其他用户;

SQL的视图

上一篇:Laravel7 安装 laravel-admin 出现 Illuminate\Database\QueryException SQLSTATE[42000]: Syntax error or access violation: 1103 Incorrect table name ''


下一篇:一分钟掌握MySQL的InnoDB引擎B+树索引