一、定义
视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索 数据的查询。
二、语法
复制代码
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_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 自己去判断。
参考文本
学习视频资料:http://www.makeru.com.cn/live/1392_1164.html?s=143793