MySQL 视图简介

数据库中数据的查询有时是非常复杂的,如表连接、子查询等。这种查询很难写,而且容易出错。此外,当您专门操作表时,有时只需要操作部分字段。

[En]

The query about the data in the database is sometimes very complex, such as table join, subquery and so on. This kind of query is difficult to write and easy to make mistakes. In addition, when you specifically manipulate the table, it is sometimes required to manipulate only part of the fields.

为了提高复杂 SQL 语句的复用性和表的操作的安全性,MySQL 提供了视图特性。所谓视图,本质上是一种虚拟表,同样包含一系列带有名称的列和行数据。行和列的数据来自自定义视图的查询所引用的基本表,并在具体引用视图时动态生成

视图的特点如下:

  • 视图的列可以来自不同的表,这是在表的抽象和逻辑意义上建立的新关系。
    [En]

    the columns of the view can come from different tables, which is a new relationship established in the abstract and logical sense of the table.*

  • view是由基本表(实表)生成的表(虚表)
    [En]

    View is a table (virtual table) generated by a basic table (real table)*

  • 创建和删除视图不影响基本表
    [En]

    the creation and deletion of views do not affect the basic table*

  • 对视图内容的更新(增删改)直接影响基本表
    [En]

    updates (additions, deletions and changes) to the contents of the view directly affect the basic table*

  • 当视图来自多个基本表时,不允许增加和删除数据
    [En]

    adding and deleting data is not allowed when the view comes from multiple basic tables*

创建视图

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]VIEW view_name [column_list]AS SELECT statement[WITH [CASCADED | LOCAL] CHECK OPTION]
  • CREATE 表示创建新的视图,REPLACE 表示替换已经创建的视图
  • ALGORITHM 表示视图选择的算法,取值有三种:
  • UNDEFINED:MySQL 自动选择算法
  • MERGE:将使用的视图语句与视图定义合并起来,使得视图定义的某一部分取代语句对应的部分
  • TEMPLATE:表示将视图的结果放入临时表,然后用临时表来执行语句
  • view_name 表示视图的名称
  • column_list 为属性列
  • SELECT statement 表示 SELECT 语句
  • 参数 [WITH [CASCADED | LOCAL] CHECK OPTION] 表示视图在更新时保证在视图的权限范围内,CASCADED 与 LOCAL 为可选参数:
  • CASCADED 为默认值,表示更新视图时要满足所有相关视图和表的条件
  • LOCAL 表示更新视图时满足该视图本身定义的条件即可

该语句要求具有针对视图的 CREATE VIEW 权限,以及针对由 SELECT 语句选择的每一列上的某些权限。对于在 SELECT 语句中其他地方使用的列,必须具有 SELECT 权限,如果还有 OR REPLACE 子句,就必须在视图上具有 DROP 权限

示例:在数据库 company 中,由员工表 t_employee 创建出隐藏工资字段 salary 的视图 view_selectemployee

CREATE VIEW view_selectemployee AS
SELECT id,name,gender,age,deptno FROM t_employee;

查询视图

SELECT * FROM view_selectemployee;

示例:在数据库 company 中,由部门表 t_dept 和员工表 t_employee 创建一个名为 view_dept_employee 的视图

CREATE ALGORITHM=MERGE VIEW
view_dept_employee(name,dept,gender,age,loc)
AScSELECT iname,t_dept.deptname,gender,age,t_dept.location
FROM t_employee, t_dept WHERE t_employee.deptno = t_dept.deptno
WITH LOCAL CHECK OPTION;

查看视图

使用 DESCRIBE | DESC 语句查看视图基本信息,因为视图也是一张表,只不过比较特殊

DESCRIBE | DESC viewname

在 MySQL 中,所有视图的定义都存在数据库 information_schema 中的表 views 中,查询 views 表可以得到数据库中所有视图的详细信息

SELECT * FROM information_schema.views
WHERE table_name = 'viewname' \G

修改视图

修改视图是指修改数据库中存在的视图。当基本表的某些字段发生变化时,您可以更改视图以使其与基本表保持一致。

[En]

Modifying the view refers to modifying the view that exists in the database. When some fields of the basic table change, you can change the view to keep it consistent with the basic table.

在 MySQL 中, CREATE OR REPLACE VIEW 语句可以用来修改视图。当视图已经存在,对视图进行修改,否则创建视图

CREATE OR REPLACE [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [column_list]
AS SELECT statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

也可以使用 ALTER 语句修改视图,其语法中的关键字和参数都与创建视图是一样的

ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [column_list]
AS SELECT statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

更新视图

更新视图是指通过视图来插入、更新和删除表中的数据。可以使用 SQL 语句更新视图,达到更新基本表数据。反过来,更新基本表的数据,也会更新视图的数据

但是,实际上并不是所有的视图都可以更新,在以下情况下不能更新视图:

[En]

However, in fact, not all views can be updated, and views cannot be updated in the following situations:

  • 视图中包含 SUM()、COUNT()、MAX() 和 MIN() 函数
  • 视图中包含 UNION、UNION ALL、DISTINCT、GROUP BY 和 HAVING 等关键字
  • 常量视图,例如: CREATE VIEW view_1 AS SELECT 'Rebecca' AS name;
  • 包含子查询的视图
  • 由不可更新的视图导出的视图
    [En]

    views exported by non-updatable views*

  • 创建视图时,ALGORITHM 为 TEMPTABLE 类型
  • 存在该视图对应的列没有缺省值的列,且该列不包含在该视图中
    [En]

    there is a column with no default value for the column corresponding to the view, and the column is not included in the view*

  • 设置了 [WITH [CASCADED | LOCAL] CHECK OPTION] 参数,需要符合对应条件才能更新

删除视图

删除视图意味着删除数据库中已存在的视图,并且不会删除数据

[En]

Deleting a view means deleting a view that already exists in the database and will not delete the data

在 MySQL 中,可以使用 DROP VIEW 语句来删除视图,但是用户必须拥有 DROP 权限

DROP VIEW viewname [viewname1,viewname2,...]

Original: https://www.cnblogs.com/Yee-Q/p/16154656.html
Author: 低吟不作语
Title: MySQL 视图简介

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505478/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球