mysql好看的_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.16sec)

mysql> insert into test_rank values(1, 10), (2, 20), (3, 30), (4, 30), (5, 40), (6, 40);

Query OK,6 rows affected (0.05sec)

Records:6 Duplicates: 0 Warnings: 0mysql> select *from test_rank;+------+-------+

| id | score |

+------+-------+

| 1 | 10 |

| 2 | 20 |

| 3 | 30 |

| 4 | 30 |

| 5 | 40 |

| 6 | 40 |

+------+-------+

6 rows in set (0.00sec)--

--创建视图--mysql> create view view_rank as select * from test_rank; --针对上面的test_rank创建一个视图

Query OK,0 rows affected (0.03sec)--也可以对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=utf8mb41 row in set (0.00sec)

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_ci1 row in set (0.00sec)

mysql> select * from view_rank; --可以直接查询该视图得结果+------+-------+

| id | score |

+------+-------+

| 1 | 10 |

| 2 | 20 |

| 3 | 30 |

| 4 | 30 |

| 5 | 40 |

| 6 | 40 |

+------+-------+

6 rows in set (0.00sec)--视图的作用是,可以对开发人员是透明的,可以隐藏部分关键的列--视图在mysql是虚拟表。根据视图的定义,还是去执行定义中的select语句。--只开放部分列

mysql> create view view_rank_1 as select id from test_rank; --只开放id列

Query OK,0 rows affected (0.04sec)

mysql> select * from view_rank_1; -- 即使 select *,也只能看到id列,具有隐藏原来表中部分列的功能+------+

| id |

+------+

| 1 |

| 2 |

| 3 |

| 4 |

| 5 |

| 6 |

+------+

6 rows in set (0.00sec)-- 不要取用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.30sec)

Records:0 Duplicates: 0 Warnings: 0mysql> 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.00sec)

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 自己去判断。

参考:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值