• mysql---视图


    一、定义

      视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索 数据的查询。

    二、语法 

    CREATE
        [OR REPLACE]
        [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
        [DEFINER = user]
        [SQL SECURITY { DEFINER | INVOKER }]
        VIEW view_name [(column_list)]
        AS select_statement
        [WITH [CASCADED | LOCAL] CHECK OPTION]

    三、使用示例

    mysql> create table test_rank(id int, score int);
    Query OK, 0 rows affected (0.16 sec)
    
    mysql> insert into test_rank values(1, 10), (2, 20), (3, 30), (4, 30), (5, 40), (6, 40);
    Query OK, 6 rows affected (0.05 sec)
    Records: 6  Duplicates: 0  Warnings: 0
    
    mysql> select * from test_rank;
    +------+-------+
    | id   | score |
    +------+-------+
    |    1 |    10 |
    |    2 |    20 |
    |    3 |    30 |
    |    4 |    30 |
    |    5 |    40 |
    |    6 |    40 |
    +------+-------+
    6 rows in set (0.00 sec)
    
    --
    -- 创建视图
    --
    mysql> create view view_rank as select * from test_rank;  -- 针对上面的test_rank创建一个视图
    Query OK, 0 rows affected (0.03 sec)
    
    -- 也可以对select结果增加条件进行过滤后,再创建视图
    
    mysql> show create table test_rankG
    *************************** 1. row ***************************
           Table: test_rank
    Create Table: CREATE TABLE `test_rank` (    -- 得到的是表结构
      `id` int(11) DEFAULT NULL,
      `score` int(11) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    1 row in set (0.00 sec)
    
    
    mysql> show create table view_rankG  -- 他是以一张表的形式存在的,可通过show tables看到
    *************************** 1. row ***************************
                    View: view_rank
             Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_rank` AS select `test_rank`.`id` AS `id`,`test_rank`.`score` AS `score` from `test_rank`
                          -- 和真正的表不同的是,这里show出来的是视图的定义
    character_set_client: utf8
    collation_connection: utf8_general_ci
    1 row in set (0.00 sec)
    
    mysql> select * from view_rank;  -- 可以直接查询该视图得结果
    +------+-------+
    | id   | score |
    +------+-------+
    |    1 |    10 |
    |    2 |    20 |
    |    3 |    30 |
    |    4 |    30 |
    |    5 |    40 |
    |    6 |    40 |
    +------+-------+
    6 rows in set (0.00 sec)
    
    -- 视图的作用是,可以对开发人员是透明的,可以隐藏部分关键的列
    -- 视图在mysql是虚拟表。根据视图的定义,还是去执行定义中的select语句。
    
    -- 只开放部分列
    mysql> create view view_rank_1 as select id from test_rank; -- 只开放id列
    Query OK, 0 rows affected (0.04 sec)
    
    mysql> select * from view_rank_1;  -- 即使 select * ,也只能看到id列,具有隐藏原来表中部分列的功能                        
    +------+
    | id   |
    +------+
    |    1 |
    |    2 |
    |    3 |
    |    4 |
    |    5 |
    |    6 |
    +------+
    6 rows in set (0.00 sec)
    
    -- 不要取用select * from 去创建视图,因为mysql会把*逐个解析成列。
    -- 当原来的表结构发生变化时,视图的表结构是不会发生变化的,视图在创建的瞬间,便确定了结构。
    -- 比如,当你alter原来的表 增加列(add columns)时,再去查询该视图,新增加的列是不存在的。
    
    mysql> alter table test_rank add column  c int default 0; -- 增加一列名字为c,默认值为0
    Query OK, 0 rows affected (0.30 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> select * from test_rank;  -- 查询原表,新的列c出现了
    +------+-------+------+
    | id   | score | c    |
    +------+-------+------+
    |    1 |    10 |    0 |
    |    2 |    20 |    0 |
    |    3 |    30 |    0 |
    |    4 |    30 |    0 |
    |    5 |    40 |    0 |
    |    6 |    40 |    0 |
    +------+-------+------+
    6 rows in set (0.00 sec)
    
    mysql> select * from view_rank; -- 尽管view_rank用select * 创建,但当时没有列c,所以无法得到c列的值
    +------+-------+
    | id   | score |
    +------+-------+
    |    1 |    10 |
    |    2 |    20 |
    |    3 |    30 |
    |    4 |    30 |
    |    5 |    40 |
    |    6 |    40 |
    +------+-------+
    6 rows in set (0.00 sec)

    视图的算法

    通过 show create table 命令查看视图定义的时候,可以看到一个字段:ALGORITHM,这个是用来定义视图算法的,视图的算法(ALGORITHM)有三种方式:

    • UNDEFINED:默认方式,由 MySQL 来判断使用下面的哪种算法。
    • MERGE:每次通过物理表查询得到结果,把结果 MERGE(合并)起来返回。
    • TEMPTABLE:产生一张临时表,把数据放入临时表后,客户端再去临时表取数据(不会缓存)。

    TEMPTABLE 特点:即使访问条件一样,第二次查询还是会去读取物理表中的内容,并重新生成一张临时表,并不会取缓存之前的表。(临时表是 Memory 存储引擎,默认放内存,超过配置大小放磁盘)。 

    当查询有一个较大的结果集时,使用 TEMPTABLE 可以快速的结束对该物理表的访问,从而可以快速释放这张物理表上占用的资源。然后客户端可以对临时表上的数据做一些耗时的操作,而不影响原来的物理表。

    所以一般我们使用 UNDEFINED,由 MySQL 自己去判断。

    参考:

    https://www.yuque.com/yinjianwei/vyrvkf/nzk6x8

  • 相关阅读:
    215. Kth Largest Element in an Array
    214. Shortest Palindrome
    213. House Robber II
    212. Word Search II
    210 Course ScheduleII
    209. Minimum Size Subarray Sum
    208. Implement Trie (Prefix Tree)
    207. Course Schedule
    206. Reverse Linked List
    sql 开发经验
  • 原文地址:https://www.cnblogs.com/mwq1992/p/14179675.html
Copyright © 2020-2023  润新知