zoukankan      html  css  js  c++  java
  • MySQL系列:视图基本操作(3)

    1. 视图简介

    1.1 视图定义

      视图是一种虚拟的表,是从数据库中一个或多个表中导出来的表。

      视图可以从已存在的视图的基础上定义。

      数据库中只存放视图的定义,并没有存放视图中的数据,数据存放在原来的表中。

      视图中的数据依赖于原来的表中的数据,表中的数据发生变化,显示在视图中的数据也会改变。

    1.2 视图作用

      (1)增加数据安全性

      通过视图,用户只能查询和修改指定的数据。

      数据库授权命令可以限制用户的操作权限,但不能限制到特定行和列上。使用视图可以将用户的权限限制到特定的行和列上。

      (2)提高表的逻辑独立性

      视图可以屏蔽原有表结构变化带来的影响。

      原有的表结构增加列和删除未被引用的列,对视图不造成影响。

    2. 创建视图

    2.1 创建视图语法

      CREATE VIEW语法形式:

    CERATE [ALGORITHM = { UNDEFINED | MERGE | TEMPTABLE }]
        VIEW view_name [(column_name, .. ,column_name)]
        AS SELECT statement
        [WITH [CASCADED | LOCAL] CHECK OPTION];

      其中:

      ALGORITHM:视图选择的算法,包括UNDEFINED,MERGE及TEMPTABLE。

        UNDEFINED:MySQL将自动选择所需要的算法;

        MERGE:将使用视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分;

        TEMPTABLE:将视图的结果存入临时表,使用临时表执行语句。

      CASCADED:表示更新视图时,要满足所有相关视图和表的条件,该参数为默认值。

      LOCAL:表示更新视图时,要满足该视图本身的定义的条件即可。

      使用CREATE VIEW语句创建视图时,最好加上WITH CASCADED CHECK OPTION参数。

      创建视图时,需要有CREATE VIEW权限。同时具有查询涉及列的SELECT权限。

      在mysql数据库的user表中保存用户权限,使用SELECT语句查询:

    mysql> SELECT Select_priv,Create_view_priv FROM mysql.user WHERE user='root';
    +-------------+------------------+
    | Select_priv | Create_view_priv |
    +-------------+------------------+
    | Y           | Y                |
    +-------------+------------------+

    2.2 创建视图示例

    mysql> CREATE VIEW vproduct
        -> AS
        -> SELECT ProductID,ProductName FROM product;
    mysql> CREATE VIEW vproduct(ProductID,ProductName)
        -> AS
        -> SELECT ProductID,ProductName FROM product;

    3. 查看视图

      查看视图是指查看数据库中已存在的视图的定义,查看视图要有SHOW VIEW权限。

      查看视图的方法包括:DESCRIBE、SHOW TABLE STATUS、SHOW CREATE VIEW及查询information_schema数据库下的views表。

    3.1 DESCRIBE语句查看视图基本信息

      语法格式:

    DESCRIBE view_name

      示例:

    mysql> DESC vproduct;
    +-------------+-------------+------+-----+---------+-------+
    | Field       | Type        | Null | Key | Default | Extra |
    +-------------+-------------+------+-----+---------+-------+
    | ProductID   | int(11)     | NO   |     | NULL    |       |
    | ProductName | varchar(50) | YES  |     | NULL    |       |
    +-------------+-------------+------+-----+---------+-------+

    3.2 SHOW TABLE STATUS语句查看视图基本信息

      语法格式:

    SHOW TABLE STATUS LIKE 'view_name'

      示例:

    mysql> SHOW TABLE STATUS LIKE 'vproduct';
    mysql> show table status like 'vproduct'G
    *************************** 1. row ***************************
               Name: vproduct
             Engine: NULL
            Version: NULL
         Row_format: NULL
               Rows: NULL
     Avg_row_length: NULL
        Data_length: NULL
    Max_data_length: NULL
       Index_length: NULL
          Data_free: NULL
     Auto_increment: NULL
        Create_time: NULL
        Update_time: NULL
         Check_time: NULL
          Collation: NULL
           Checksum: NULL
     Create_options: NULL
            Comment: VIEW
    1 row in set (0.00 sec)

      执行结果显示,Comment值为VIEW,说明该表为视图。存储引擎、数据长度等信息都显示为NULL,说明视图是虚拟表。

    3.3 SHOW CREATE VIEW语句查看视图详细信息

      语法格式:

    SHOW CREATE VIEW view_name

      示例:

    mysql> SHOW CREATE VIEW vproductG
    *************************** 1. row ***************************
                    View: vproduct
             Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `vproduct` AS select `product`.`ProductID` AS `ProductID`,`product`.`ProductName` AS `ProductName` from `product`
    character_set_client: gbk
    collation_connection: gbk_chinese_ci
    1 row in set (0.11 sec)

    3.4 在views表中查看视图详细信息

    mysql> SELECT * FROM information_schema.views WHERE TABLE_NAME='vproduct'G
    *************************** 1. row ***************************
           TABLE_CATALOG: def
            TABLE_SCHEMA: portal
              TABLE_NAME: vproduct
         VIEW_DEFINITION: select `portal`.`product`.`ProductID` AS `ProductID`,`portal`.`product`.`ProductName` AS `ProductName` from `portal`.`product`
            CHECK_OPTION: NONE
            IS_UPDATABLE: YES
                 DEFINER: root@localhost
           SECURITY_TYPE: DEFINER
    CHARACTER_SET_CLIENT: gbk
    COLLATION_CONNECTION: gbk_chinese_ci
    1 row in set (0.00 sec)

    4. 修改视图

      MySQL中通过CREATE OR REPLACE VIEW语句和ALTER语句来修改视图。

    4.1 CREATE OR REPLACE VIEW语句修改视图

      CREATE OR REPLACE VIEW语句可以用来修改视图,在视图已存在的情况下,修改视图;视图不存在时,创建视图。

      CREATE OR REPLACE VIEW语法格式:

    CERATE OR REPLACE [ALGORITHM = { UNDEFINED | MERGE | TEMPTABLE }]
        VIEW view_name [(column_name, .. ,column_name)]
        AS SELECT statement
        [WITH [CASCADED | LOCAL] CHECK OPTION];

      示例:

    mysql> CREATE OR REPLACE VIEW vproduct
        -> AS
        -> SELECT ProductID,ProductName FROM product;

    4.2 ALTER语句修改视图

      ALTER VIEW语法格式:

    ALTER [ALGORITHM = { UNDEFINED | MERGE | TEMPTABLE }]
        VIEW view_name [(column_name, .. ,column_name)]
        AS SELECT statement
        [WITH [CASCADED | LOCAL] CHECK OPTION];

      示例:

    mysql> ALTER VIEW vproduct
        -> AS
        -> SELECT ProductID,ProductName FROM product
        -> WITH CASCADED CHECK OPTION;

    5. 删除视图

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

      语法形式:

    DROP VIEW [IF EXISTS] view_name,[view_name] [RESTRICT | CASCADE]

      其中,IF EXISTS判断视图存在,若存在则执行,不存在则不执行。删除多个视图之间使用逗号隔开。

      示例:

    mysql> DROP VIEW IF EXISTS vproduct;
  • 相关阅读:
    java中的各种Queue
    关闭线程的一些问题
    Exchanger
    文件锁FileLock
    StringBuffer和String需要注意的
    maven出现:Failed to execute goal on project ...: Could not resolve dependencies for project ...
    pringboot pom文件引入本地jar包和对其打jar包
    SpringBoot热部署的两种方式
    idea 自动导入包和自动将没用的包去除
    springCould:使用Feign 实现声明式服务调用
  • 原文地址:https://www.cnblogs.com/libingql/p/6456152.html
Copyright © 2011-2022 走看看