您的位置:首页 > 数据库 > MySQL

MySQL 视图技术

2016-06-11 14:03 399 查看
以前也只是知道数据库中有视图这么个概念,但是没有去深究,今天正好有时间,就来总结一下吧。

视图的定义


视图就是从一个或多个表中,导出来的表,是一个虚拟存在的表。视图就像一个窗口(数据展示的窗口),通过这个窗口,可以看到系统专门提供的数据(也可以查看到数据表的全部数据),使用视图就可以不用看到数据表中的所有数据,而是只想得到所需的数据。

在数据库中,只存放了视图的定义,并没有存放视图的数据,数据还是存储在原来的表里,视图的数据是依赖原来表中的数据的,所以原来的表的数据发生了改变,那么显示的视图的数据也会跟着改变,例如向数据表中插入数据,那么在查看视图的时候,会发现视图中也被插入了同样的数据。

视图在外观上和表很相似,但是它不需要实际上的物理存储,视图实际上是由预定义的查询形式的表所组成的。

视图可以包含表的全部或者部分记录,也可以由一个表或者多个表来创建,当我们创建一个视图的时候,实际上是在数据库里执行了SELECT语句,SELECT语句包含了字段名称、函数、运算符,来给用户显示数据。

在数据库中,视图的使用方式与表的使用方式一致,我们可以像操作表一样去操作视图,或者去获取数据。

一般来说,我们只是利用视图来查询数据,不会通过视图来操作数据。



注意:基于已经存在的视图,我们可以创建新的视图。

视图和表的主要的区别就在于是否占用物理的存储空间。表是占用实际空间的,视图是基于表的更高层的存在。



视图释义

我们可以把视图看做一个连接着黑盒子的管道,而表就可以比喻成那个黑盒子。有了视图,我们就可以不关心底层的表是怎么实现的,我们只需要关注怎么能从这个管道获取数据。底层表结构的变化可以通过修改视图来达到不更改应用,同样反过来也成立。

创建表

视图很普通,我们没必要将它想象的多么复杂,看成是一个虚拟存在的表结构就行了。在建立视图之前,我们需要有物理存在的表结构才行。

建表:

mysql> show tables;
+--------------------+
| Tables_in_practice |
+--------------------+
| course             |
| sc                 |
| student            |
+--------------------+
3 rows in set (0.00 sec)

mysql> create table author(
-> id int(10) not null primary key auto_increment,
-> name varchar(30) not null
-> );
Query OK, 0 rows affected (0.03 sec)

mysql> create table book(
-> id int(10) not null primary key auto_increment,
-> title varchar(30) not null);
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+--------------------+
| Tables_in_practice |
+--------------------+
| author             |
| book               |
| course             |
| sc                 |
| student            |
+--------------------+
5 rows in set (0.00 sec)


填充数据

表结构已经创建完成,接下来就先填充点数据进去吧。

mysql> insert into author(name) values('fenger'),('zhangsan'),('lisi'),('wangwu'),('zhaoliu');
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> insert into book(title) values('Programming in C'),('C++ Primer'),('Thinking in Java'),('Effective Python'),('The King ,PHP');
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0


创建视图

下面就在这些表的基础上创建一个最简单的视图吧。作用是用于连接两张表。

mysql> create view myview as
-> select name , title from author,book;
Query OK, 0 rows affected (0.01 sec)



是不是和创建普通表结构很相似啊 关键就在于AS语句咯。因为那是视图数据的来源。



我们需要关注的就是AS后面的实现,和正常写SQL语句很类似,就不过多的叙述了。

使用创建好的视图

使用创建好的视图也是很简单的,类似于使用正常的表。如下:

mysql> select * from myview ;
+----------+------------------+
| name     | title            |
+----------+------------------+
| fenger   | Programming in C |
| zhangsan | Programming in C |
| lisi     | Programming in C |
| wangwu   | Programming in C |
| zhaoliu  | Programming in C |
| fenger   | C++ Primer       |
| zhangsan | C++ Primer       |
| lisi     | C++ Primer       |
| wangwu   | C++ Primer       |
| zhaoliu  | C++ Primer       |
| fenger   | Thinking in Java |
| zhangsan | Thinking in Java |
| lisi     | Thinking in Java |
| wangwu   | Thinking in Java |
| zhaoliu  | Thinking in Java |
| fenger   | Effective Python |
| zhangsan | Effective Python |
| lisi     | Effective Python |
| wangwu   | Effective Python |
| zhaoliu  | Effective Python |
| fenger   | The King ,PHP    |
| zhangsan | The King ,PHP    |
| lisi     | The King ,PHP    |
| wangwu   | The King ,PHP    |
| zhaoliu  | The King ,PHP    |
+----------+------------------+
25 rows in set (0.00 sec)


由于没有SQL语句很简单,没有加约束,所以展示的数据可能有点不太美观。不过视图的功能已经实现了。优化的话还需要我们来自己实现。

视图算法

这里看似高深,其实就是创建视图的时候可选的参数而已。

ALGORITHM=

- UNDEFINED:MYSQL自动选择要使用的算法

- MERGE:使用视图的语句与视图的定义是合并在一起的,视图定义的某一部分取代语句对应的部分

- TEMPTABLE:临时表,视图的结果存入临时表,然后使用临时表来执行语句


WHIT [CASCADED|LOCAL] CHECK OPTION:表示更新视图的时候,要保证在视图的权限范围之内:

- CASCADED 默认值,表示更新视图的时候,要满足视图和表的相关条件

- LOCAL:表示更新视图的时候,要满足该视图定义的一个条件即可



使用WITH[CASADED|LOCAL] CHECK OPTION 宣子昂可以保证数据的安全性。



创建一个完整的视图的小例子:

CREATE ALGORITHM=UNDEFINED VIEW myview(name,title) AS SELECT

name,title FROM author,book WITH CASCADED CHECK OPTION;

查看已经创建好的视图

查看视图有如下几种方式:

DESC “ViewName”

DESCRIBE “ViewName”

SHOW COLUMNS FROM “ViewName”

SHOW TABLE STATUS LIKE “ViewName”

SHOW CREATE VIEW “ViewName”


详细性的介绍可以参考下面的这篇文章,我就不在这重复的造轮子了。http://www.cnblogs.com/4php/p/4108157.html



总结

视图就是一个特殊的不占用物理存储的表,基于表而又高于表的存在。我们要充分的利用视图的优点,来优化我们的应用程序的开发!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: