• 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视图已不存在,将其成功删除

  • 相关阅读:
    Android实现文件上传功能(接收端用strust2)
    创建一个多页面,基于UINavigationController的控制的跳转的iOS应用程序
    NSURL中带有汉字参数的乱码处理
    Google Directions API通过请求获取导航数据简介
    iOS下用UIWebView打开文档
    关于Objectivec和Java下DES加密保持一致的方式
    struts2中通过Action以InputStream的下载文件以及在iOS以及Android端接收的实现方式
    NSURL中的参数带有特殊字符的处理
    UIColor设置自定义的颜色不成功问题
    Android中TabHost中实现标签的滚动以及一些TabHost开发的奇怪问题
  • 原文地址:https://www.cnblogs.com/qtiger/p/14357378.html
Copyright © 2020-2023  润新知