mysql - 视图

视图

  • 视图(View)是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图时动态生成的。
  • 数据库中只存放了视图的定义,并没有存放视图中的数据,这些数据都存放在定义视图查询所引用的真实表中。使用视图查询数据时,数据库会从真实表中取出对应的数据。因此,视图中的数据是依赖于真实表中的数据的。一旦真实表中的数据发生改变,显示在视图中的数据也会发生改变。

视图与数据库表的区别

  • 视图不是数据库中真实的表,而是一张虚拟表,其结构和数据是建立在对数据中真实表的查询基础上的。
  • 存储在数据库中的查询操作 SQL 语句定义了视图的内容,列数据和行数据来自于视图查询所引用的实际表,引用视图时动态生成这些数据。
  • 视图没有实际的物理记录,不是以数据集的形式存储在数据库中的,它所对应的数据实际上是存储在视图所引用的真实表中的。
  • 视图是数据的窗口,而表是内容。表是实际数据的存放单位,而视图只是以不同的显示方式展示数据,其数据来源还是实际表。
  • 视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些 SQL 语句的集合。从安全的角度来看,视图的数据安全性更高,使用视图的用户不接触数据表,不知道表结构。
  • 视图的建立和删除只影响视图本身,不影响对应的基本表。

创建视图

  • 语法格式:
CREATE VIEW 视图名 AS SELECT语句
  • 语法格式说明:
视图名:指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名。
SELECT语句:指定创建视图的 SELECT 语句,可用于查询多个基础表或源视图。
  • 对于创建视图中的 SELECT 语句的指定存在以下限制:
  • 用户除了拥有 CREATE VIEW 权限外,还具有操作中涉及的基础表和其他视图的相关权限。
  • SELECT 语句不能引用系统或用户变量。 SELECT 语句不能包含 FROM 子句中的子查询。
  • SELECT 语句不能引用预处理语句参数。
  • 创建基于单表的视图:
//在 user_test 表上创建一个名为 view_user_test 的视图
CREATE VIEW view_user_test AS SELECT * FROM user_test;
//在 user_test 表上创建一个名为 view_user_test 的视图
CREATE VIEW view_user_test
    (s_id,s_name,d_id,s_age,s_sex,s_height,s_date)
    AS SELECT id,name,dept_id,age,sex,height,login_date
    FROM user_test;

查看视图

  • 语法格式:
DESCRIBE 视图名;
  • 或者:
DESC 视图名;
  • eg:
DESCRIBE view_user_test;
  • 注意:DESCRIBE 一般情况下可以简写成 DESC,输入这个命令的执行结果和输入 DESCRIBE 是一样的。
  • 查看视图的详细信息:
SHOW CREATE VIEW 视图名;
  • eg:
SHOW CREATE VIEW view_user_test

修改视图

  • 语法格式:
ALTER VIEW 视图名 AS SELECT语句
  • 视图是一个虚拟表,实际的数据来自于基本表,所以通过插入、修改和删除操作更新视图中的数据,实质上是在更新视图所引用的基本表的数据。
  • 某些视图是可更新的。也就是说,可以使用 UPDATE、DELETE 或 INSERT等语句更新基本表的内容。对于可更新的视图,视图中的行和基本表的行之间必须具有一对一的关系。
还有一些特定的其他结构,这些结构会使得视图不可更新。更具体地讲,如果视图包含以下结构中的任何一种,它就是不可更新的:
聚合函数 SUM()、MIN()、MAX()、COUNT() 等。
DISTINCT 关键字。
GROUP BY 子句。
HAVING 子句。
UNION 或 UNION ALL 运算符。
位于选择列表中的子查询。
FROM 子句中的不可更新视图或包含多个表。
WHERE 子句中的子查询,引用 FROM 子句中的表。
ALGORITHM 选项为 TEMPTABLE(使用临时表总会使视图成为不可更新的)的时候
  • eg:
//使用 ALTER 语句修改视图 view_user_test
ALTER VIEW view_user_test
    AS SELECT id,name,age
    FROM user_test;

//使用 UPDATE 语句更新视图 view_user_test
UPDATE view_user_test SET age=25 WHERE id=1;
  • 修改视图名称:修改视图的名称可以先将视图删除,然后按照相同的定义语句进行视图的创建,并命名为新的视图名称。

删除视图

  • 语法格式:
DROP VIEW 视图名1 [ , 视图名2 …]
  • DROP VIEW 语句可以一次删除多个视图,但是必须在每个视图上拥有 DROP 权限。
  • eg:
//删除 view_user_test 视图
DROP VIEW IF EXISTS view_user_test;