MySql 视图

一、MySql视图概述

1、什么是视图?

视图本质上是一种虚拟表,在物理上是不存在的,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以储存的数据值形式存在。行和列数据来自定义视图的查询所引用基本表,并且在具体引用视图时动态生成。

2、为什么要使用视图?

为了提高复杂SQL语句的复用性和表操作的安全性,MySQL数据库管理系统提供了视图特性。视图使开发者只关心感兴趣的某些特定数据和所负责的特定任务,只能看到视图中所定义的数据,而不是视图所引用表中的数据,从而提高了数据库中数据的安全性。

3、视图有哪些特点?

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

  • 视图是由基本表(实表)产生的表(虚表)。

  • 视图的建立和删除不影响基本表。

  • 对视图内容的更新(添加,删除和修改)直接影响基本表。

  • 当视图来自多个基本表时,不允许添加和删除数据。

4、视图的使用场景有哪些?

视图根本用途:简化sql查询,提高开发效率。如果说还有另外一个用途那就是兼容老的表结构。下面是视图的常见使用场景:

  • 重用SQL语句;

  • 简化复杂的SQL操作。在编写查询后,可以方便的重用它而不必知道它的基本查询细节;

  • 使用表的组成部分而不是整个表;

  • 保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限;

  • 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。

5、视图的优点

视图与表在本质上虽然不相同,但视图经过定义以后,结构形式和表一样,可以进行查询、修改、更新和删除等操作。同时,视图具有如下优点:

  • 定制用户数据,聚焦特定的数据

在实际的应用过程中,不同的用户可能对不同的数据有不同的要求。例如,当数据库同时存在时,如学生基本信息表、课程表和教师信息表等多种表同时存在时,可以根据需求让不同的用户使用各自的数据。学生查看修改自己基本信息的视图,安排课程人员查看修改课程表和教师信息的视图,教师查看学生信息和课程信息表的视图。

  • 简化数据操作

在使用查询时,很多时候要使用聚合函数,同时还要显示其他字段的信息,可能还需要关联到其他表,语句可能会很长,如果这个动作频繁发生的话,可以创建视图来简化操作。

  • 提高数据的安全性

视图是虚拟的,物理上是不存在的。可以只授予用户视图的权限,而不具体指定使用表的权限,来保护基础数据的安全。

  • 共享所需数据

通过使用视图,每个用户不必都定义和存储自己所需的数据,可以共享数据库中的数据,同样的数据只需要存储一次。

  • 更改数据格式

通过使用视图,可以重新格式化检索出的数据,并组织输出到其他应用程序中。

  • 重用 SQL 语句

视图提供的是对查询操作的封装,本身不包含数据,所呈现的数据是根据视图定义从基础表中检索出来的,如果基础表的数据新增或删除,视图呈现的也是更新后的数据。视图定义后,编写完所需的查询,可以方便地重用该视图。

6、视图的缺点

  • 性能。数据库必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,数据库也把它变成一个复杂的结合体,需要花费一定的时间。

  • 修改限制。当用户试图修改视图的某些行时,数据库必须把它转化为对基本表的某些行的修改。事实上,当从视图中插入或者删除时,情况也是这样。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的

二、创建视图

1、基本语法

可以使用 CREATE VIEW 语句来创建视图。语法格式如下:

CREATE VIEW <视图名> AS <SELECT语句>

语法说明如下:

  • <视图名>:指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名。
  • <SELECT语句>:指定创建视图的 SELECT 语句,可用于查询多个基础表或源视图。

对于创建视图中的 SELECT 语句的指定存在以下限制:

  • 用户除了拥有 CREATE VIEW 权限外,还具有操作中涉及的基础表和其他视图的相关权限。
  • SELECT 语句不能引用系统或用户变量。
  • SELECT 语句不能包含 FROM 子句中的子查询。
  • SELECT 语句不能引用预处理语句参数。

注意事项:

  • 视图定义中引用的表或视图必须存在。但是,创建完视图后,可以删除定义引用的表或视图。可使用 CHECK TABLE 语句检查视图定义是否存在这类问题。

  • 视图定义中允许使用 ORDER BY 语句,但是若从特定视图进行选择,而该视图使用了自己的 ORDER BY 语句,则视图定义中的 ORDER BY 将被忽略。

  • 视图定义中不能引用 TEMPORARY 表(临时表),不能创建 TEMPORARY 视图。

  • WITH CHECK OPTION 的意思是,修改视图时,检查插入的数据是否符合 WHERE 设置的条件。

2、创建基于单表的视图

查看下表信息:

mysql> SELECT * FROM user_info;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  1 | xys  |  20 |
|  2 | a    |  21 |
|  3 | b    |  23 |
|  4 | c    |  50 |
|  5 | d    |  15 |
|  6 | e    |  20 |
|  7 | f    |  21 |
|  8 | g    |  23 |
|  9 | h    |  50 |
| 10 | i    |  15 |
+----+------+-----+
10 rows in set

在user_info表上创建view_user_info视图:

mysql> create view view_user_info as select *from user_info;
mysql> select *from view_user_info;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  1 | xys  |  20 |
|  2 | a    |  21 |
|  3 | b    |  23 |
|  4 | c    |  50 |
|  5 | d    |  15 |
|  6 | e    |  20 |
|  7 | f    |  21 |
|  8 | g    |  23 |
|  9 | h    |  50 |
| 10 | i    |  15 |
+----+------+-----+
10 rows in set

3、创建基于多表的视图

在表 user_info和表 order_info上创建视图 view_user_order_info

mysql> CREATE VIEW view_user_order_info(name,product_name)
    -> as
    -> select u.name,o.product_name from user_info u,order_info o where u.id=o.user_id;
Query OK, 0 rows affected
mysql> select *from view_user_order_info;
+------+--------------+
| name | product_name |
+------+--------------+
| xys  | p1           |
| xys  | p1           |
| xys  | p2           |
| a    | p1           |
| a    | p5           |
| b    | p3           |
| c    | p1           |
| e    | p1           |
| h    | p8           |
+------+--------------+
9 rows in set

三、查看视图

1、查看视图的字段信息

查看视图的字段信息与查看数据表的字段信息一样,都是使用 DESCRIBE 关键字来查看的。具体语法如下:

DESCRIBE 视图名;

或简写成:

DESC 视图名;
mysql> desc view_user_order_info;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| name         | varchar(50) | NO   |     |         |       |
| product_name | varchar(50) | NO   |     |         |       |
+--------------+-------------+------+-----+---------+-------+
2 rows in set

2、查看视图的详细信息

在 MySQL 中,SHOW CREATE VIEW 语句可以查看视图的详细定义。其语法如下所示:

SHOW CREATE VIEW 视图名;
mysql> SHOW CREATE VIEW view_user_order_info;
+----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View                 | Create View                                                                                                                                                                                                                                                                 | character_set_client | collation_connection |
+----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| view_user_order_info | CREATE ALGORITHM=UNDEFINED DEFINER=`devtest`@`%` SQL SECURITY DEFINER VIEW `view_user_order_info` (`name`,`product_name`) AS select `u`.`name` AS `name`,`o`.`product_name` AS `product_name` from (`user_info` `u` join `order_info` `o`) where (`u`.`id` = `o`.`user_id`) | utf8                 | utf8_general_ci      |
+----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set

3、拓展

所有视图的定义都是存储在 information_schema 数据库下的 views 表中,也可以在这个表中查看所有视图的详细信息,SQL 语句如下:

SELECT * FROM information_schema.views;

不过,通常情况下都是使用 SHOW CREATE VIEW 语句。

四、修改视图

修改视图是指修改 MySQL 数据库中存在的视图,当基本表的某些字段发生变化时,可以通过修改视图来保持与基本表的一致性。

1、基本语法

可以使用 ALTER VIEW 语句来对已有的视图进行修改。语法格式如下:

ALTER VIEW <视图名> AS <SELECT语句>

语法说明如下:

  • <视图名>:指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名。
  • <SELECT 语句>:指定创建视图的 SELECT 语句,可用于查询多个基础表或源视图。

需要注意的是,对于 ALTER VIEW 语句的使用,需要用户具有针对视图的 CREATE VIEW 和 DROP 权限,以及由 SELECT 语句选择的每一列上的某些权限。
修改视图的定义,除了可以通过 ALTER VIEW 外,也可以使用 DROP VIEW 语句先删除视图,再使用 CREATE VIEW 语句来实现。

2、修改视图内容

视图是一个虚拟表,实际的数据来自于基本表,所以通过插入、修改和删除操作更新视图中的数据,实质上是在更新视图所引用的基本表的数据。

注意:对视图的修改就是对基本表的修改,因此在修改时,要满足基本表的数据定义。

某些视图是可更新的。也就是说,可以使用 UPDATE、DELETE 或 INSERT 等语句更新基本表的内容。对于可更新的视图,视图中的行和基本表的行之间必须具有一对一的关系。还有一些特定的其他结构,这些结构会使得视图不可更新。更具体地讲,如果视图包含以下结构中的任何一种,它就是不可更新的:

  • 聚合函数 SUM()、MIN()、MAX()、COUNT() 等。
  • DISTINCT 关键字。
  • GROUP BY 子句。
  • HAVING 子句。
  • UNION 或 UNION ALL 运算符。
  • 位于选择列表中的子查询。
  • FROM 子句中的不可更新视图或包含多个表。
  • WHERE 子句中的子查询,引用 FROM 子句中的表。
  • ALGORITHM 选项为 TEMPTABLE(使用临时表总会使视图成为不可更新的)的时候。


(1)使用 ALTER 语句修改视图view_user_info ,输入的 SQL 语句和执行结果如下所示。

mysql> ALTER VIEW view_user_info AS SELECT id,name,age FROM user_info;
Query OK, 0 rows affected
mysql> desc view_user_info;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | bigint(20)  | NO   |     | 0       |       |
| name  | varchar(50) | NO   |     |         |       |
| age   | int(11)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set

用户可以通过视图来插入、更新、删除表中的数据,因为视图是一个虚拟的表,没有数据。通过视图更新时转到基本表上进行更新,如果对视图增加或删除记录,实际上是对基本表增加或删除记录。

(2)使用 UPDATE 语句更新视图 view_user_info ,输入的 SQL 语句和执行结果如下所示。

mysql> update view_user_info 
    -> set name='qxh' where id=1;
Query OK, 1 row affected
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select *from view_user_info where id=1;
+----+------+-----+
| id | name | age |
+----+------+-----+
|  1 | qxh  |  20 |
+----+------+-----+
1 row in set

3、修改视图名称

修改视图的名称可以先将视图删除,然后按照相同的定义语句进行视图的创建,并命名为新的视图名称。

五、删除视图

删除视图是指删除 MySQL 数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据。

基本语法

可以使用 DROP VIEW 语句来删除视图。语法格式如下:

DROP VIEW <视图名1> [ , <视图名2> …]

其中:<视图名>指定要删除的视图名。DROP VIEW 语句可以一次删除多个视图,但是必须在每个视图上拥有 DROP 权限。

mysql> DROP VIEW IF EXISTS view_user_info,view_user_order_info;
Query OK, 0 rows affected
SHOW CREATE VIEW view_user_info;
1146 - Table 'qxhfx.view_user_info' doesn't exist

可以看到,view_user_info视图已不存在,将其成功删除

原文地址:https://www.cnblogs.com/qtiger/p/14357378.html