zoukankan      html  css  js  c++  java
  • 07 MySQL之视图

    01-视图的含义

    视图是从一个或者多个表中导出的,视图的行为与表非常相似,但视图是一个虚拟表。视图还可以从已经存在的视图的基础上定义。

    02-创建视图

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

    在单表上创建视图:

    mysql> mysql> create t (quantity int, price int);
    ERROR 2006 (HY000): MySQL server has gone away
    No connection. Trying to reconnect...
    Connection id:    6
    Current database: test_db
    
    Query OK, 0 rows affected (0.15 sec)
    
    mysql> insert into t values (3, 50);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> create view view_t as select quantity,price, quantity*price from t;
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> select * from views_t;
    ERROR 1146 (42S02): Table 'test_db.views_t' doesn't exist
    mysql> select * from view_t;
    +----------+-------+----------------+
    | quantity | price | quantity*price |
    +----------+-------+----------------+
    |        3 |    50 |            150 |
    +----------+-------+----------------+
    1 row in set (0.01 sec)
    
    mysql> create view view_t2 (qty, price, total) as select quantity, price, quantity*price from t;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> select * from view_t2;
    +------+-------+-------+
    | qty  | price | total |
    +------+-------+-------+
    |    3 |    50 |   150 |
    +------+-------+-------+
    1 row in set (0.01 sec)

    在多表上创建视图

    mysql> create table student (s_id int, name varchar(255));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert into student values (1, 'liming'), (2, 'wangwu'), (3, 'lisi');
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> create table stu_info (s_id int, glass varchar(255), address varchar(255));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert into stu_info values (1, 'wuban', 'jilin'), (2, 'liuban', 'shandong'), (3, 'qiban', 'beijing');
    Query OK, 3 rows affected (0.01 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    # 创建视图
    mysql> create view stu_glass (id, name, glass) as select student.s_id, student.name, stu_info.glass from student, stu_info where student.s_id = stu_info.s_id;
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> select * from stu_glass;
    +------+--------+--------+
    | id   | name   | glass  |
    +------+--------+--------+
    |    1 | liming | wuban  |
    |    2 | wangwu | liuban |
    |    3 | lisi   | qiban  |
    +------+--------+--------+
    3 rows in set (0.01 sec)

    03-查看视图

    查看视图是查看数据库中已存在的视图的定义。查看视图必须要有 SHOW VIEW 的权限,MySQL数据库下的user 表中保存着这个信息。

    查看视图的方法包括:DESCRIBE、SHOW TABLE STATUS 和 SHOW CREATE VIEW。

    DESCRIBE、SHOW TABLE STATUS 和 SHOW CREATE VIEW。
    
    # 1、使用DESCRIBE 语句查看视图基本信息
    DESCRIBE 视图名;
    例:
    mysql> DESCRIBE stu_glass;
    +-------+--------------+------+-----+---------+-------+
    | Field | Type         | Null | Key | Default | Extra |
    +-------+--------------+------+-----+---------+-------+
    | id    | int(11)      | YES  |     | NULL    |       |
    | name  | varchar(255) | YES  |     | NULL    |       |
    | glass | varchar(255) | YES  |     | NULL    |       |
    +-------+--------------+------+-----+---------+-------+
    3 rows in set (0.01 sec)
    
    mysql> DESC view_t;
    +----------------+------------+------+-----+---------+-------+
    | Field          | Type       | Null | Key | Default | Extra |
    +----------------+------------+------+-----+---------+-------+
    | quantity       | int(11)    | YES  |     | NULL    |       |
    | price          | int(11)    | YES  |     | NULL    |       |
    | quantity*price | bigint(21) | YES  |     | NULL    |       |
    +----------------+------------+------+-----+---------+-------+
    3 rows in set (0.00 sec)
    
    # 2、使用SHOW TABLE STATUS语句查看视图基本信息
    语法如下:
    SHOW TABLE STATUS LIKE '视图名';
    例:
    mysql> SHOW TABLE STATUS like 'view_t' G
    *************************** 1. row ***************************
               Name: view_t
             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)
    
    # 3、使用 SHOW CREATE VIEW 语句查看视图详细信息
    语法如下:
    SHOW CREATE VIEW 视图名;
    例:
    mysql> SHOW CREATE VIEW view_t G;
    *************************** 1. row ***************************
                    View: view_t
             Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`skip-grants user`@`skip-grants host` SQL SECURITY DEFINER VIEW `view_t` AS select `t`.`quantity` AS `quantity`,`t`.`price` AS `price`,(`t`.`quantity` * `t`.`price`) AS `quantity*price` from `t`
    character_set_client: utf8
    collation_connection: utf8_general_ci
    1 row in set (0.00 sec)
    
    ERROR: 
    No query specified
    
    # 4、在views表中查看视图详细信息
    在MySQL中,information_schema 数据库下的views表中存储了所有视图的定义。通过对views表的查询,可以查看数据库中所有视图的详细信息,查询语句如下:
    SELECT * FROM information_schema.views;
    查询结果太长就不在这里显示,结果显示当前以及定义的所有视图的详细信息,在这里也可以看到前面定义的 stu_glass、view_t 视图的详细信息。

    04-修改视图

    # 1、使用 CREATE OR REPLACE VIEW 语句修改视图
    语法如下:
    CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] 
    VIEW view_name [(column_list)] 
    AS SELECT_statement 
    [WITH [CASCADED | LOCAL] CHECK OPTION]
    
    修改视图的语句和创建视图的语句是完全一样的。当视图已经存在时,修改语句对视图进行修改;当视图不存在时,创建视图。
    例:
    mysql> desc view_t;
    +----------------+------------+------+-----+---------+-------+
    | Field          | Type       | Null | Key | Default | Extra |
    +----------------+------------+------+-----+---------+-------+
    | quantity       | int(11)    | YES  |     | NULL    |       |
    | price          | int(11)    | YES  |     | NULL    |       |
    | quantity*price | bigint(21) | YES  |     | NULL    |       |
    +----------------+------------+------+-----+---------+-------+
    3 rows in set (0.00 sec)
    
    mysql> create or replace view view_t as select * from t;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> desc view_t;
    +----------+---------+------+-----+---------+-------+
    | Field    | Type    | Null | Key | Default | Extra |
    +----------+---------+------+-----+---------+-------+
    | quantity | int(11) | YES  |     | NULL    |       |
    | price    | int(11) | YES  |     | NULL    |       |
    +----------+---------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    
    # 2、使用 ALTER 语句修改视图
    语法如下:
    ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] 
    VIEW view_name [(column_list)] 
    AS SELECT_statement 
    [WITH [CASCADED | LOCAL] CHECK OPTION]
    
    ALTER VIEW view_t AS SELECT quantity from t;
    例:
    mysql> desc view_t;
    +----------+---------+------+-----+---------+-------+
    | Field    | Type    | Null | Key | Default | Extra |
    +----------+---------+------+-----+---------+-------+
    | quantity | int(11) | YES  |     | NULL    |       |
    | price    | int(11) | YES  |     | NULL    |       |
    +----------+---------+------+-----+---------+-------+
    2 rows in set (0.01 sec)
    
    mysql> ALTER VIEW view_t AS SELECT quantity from t;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> desc view_t;
    +----------+---------+------+-----+---------+-------+
    | Field    | Type    | Null | Key | Default | Extra |
    +----------+---------+------+-----+---------+-------+
    | quantity | int(11) | YES  |     | NULL    |       |
    +----------+---------+------+-----+---------+-------+
    1 row in set (0.00 sec)

    05-更新视图

    1、更新视图是指通过视图来插入、更新、删除表中的数据,因为视图是一个虚拟表,其中没有数据。
    2、通过视图更新的时候都是转到基本表上进行更新的,如果对视图增加或者删除记录,实际上是对基本表增加或者删除记录。
    
    # 1、使用 UPDATE 语句更新视图 view_t
    UPDATE view_t SET quantity=5;
    例:
    mysql> select * from view_t;
    +----------+
    | quantity |
    +----------+
    |        3 |
    +----------+
    1 row in set (0.00 sec)
    
    mysql> UPDATE view_t SET quantity=5;
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from view_t;
    +----------+
    | quantity |
    +----------+
    |        5 |
    +----------+
    1 row in set (0.00 sec)
    
    # 当视图中包含有如下内容时,视图的更新操作将不能被执行:
    (1)视图中不包含基本表中被定义为非空的列。
    (2)在定义视图的 SELECT 语句后的字段列表中使用了数学表达式。    
    (3)在定义视图的SELECT 语句后的字段列表中使用了聚合函数。
    (4)在定义视图的SELECT 语句中使用了DISTINCT,UNION,TOP,GROUP BY 或HAVING子句。

    06-删除视图

    当视图不再需要时,可以将其删除。删除一个或多个使用 DROP VIEW 语句,
    语法如下:
    DROP VIEW [IF EXISTS]
        view_name [, view_name] ...
        [RESTRICT | CASCADE]
    其中,view_name 是要删除的视图名称,可以添加多个需要的视图名称,各个名称之间使用逗号分隔开。
    删除视图必须拥有 DROP 权限。
    例:
    mysql> drop view if exists stu_glass;
    Query OK, 0 rows affected (0.01 sec)
  • 相关阅读:
    2018-12-25-dot-net-double-数组转-float-数组
    2018-12-25-dot-net-double-数组转-float-数组
    2019-10-24-dotnet-列表-Linq-的-Take-用法
    2019-10-24-dotnet-列表-Linq-的-Take-用法
    2018-8-10-C#-代码占用的空间
    2018-8-10-C#-代码占用的空间
    2018-4-29-C#-金额转中文大写
    2018-4-29-C#-金额转中文大写
    Java实现 LeetCode 630 课程表 III(大小堆)
    Java实现洛谷 P1072 Hankson 的趣味题
  • 原文地址:https://www.cnblogs.com/pgxpython/p/11725712.html
Copyright © 2011-2022 走看看