好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

mysql---视图

= {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_rank\G
 *************************** 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_rank\G  --  他是以一张表的形式存在的,可通过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

mysql---视图

标签:nbsp   ica   数据   一个   针对   mysq   ODB   oca   ccf   

查看更多关于mysql---视图的详细内容...

  阅读:23次