郭璞 2016-06-11 688浏览量
以前也只是知道数据库中有视图这么个概念,但是没有去深究,今天正好有时间,就来总结一下吧。
注意:基于已经存在的视图,我们可以创建新的视图。
视图和表的主要的区别就在于是否占用物理的存储空间。表是占用实际空间的,视图是基于表的更高层的存在。
我们可以把视图看做一个连接着黑盒子的管道,而表就可以比喻成那个黑盒子。有了视图,我们就可以不关心底层的表是怎么实现的,我们只需要关注怎么能从这个管道获取数据。底层表结构的变化可以通过修改视图来达到不更改应用,同样反过来也成立。
视图很普通,我们没必要将它想象的多么复杂,看成是一个虚拟存在的表结构就行了。在建立视图之前,我们需要有物理存在的表结构才行。
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;
查看视图有如下几种方式:
详细性的介绍可以参考下面的这篇文章,我就不在这重复的造轮子了。http://www.cnblogs.com/4php/p/4108157.html
视图就是一个特殊的不占用物理存储的表,基于表而又高于表的存在。我们要充分的利用视图的优点,来优化我们的应用程序的开发!
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
分享数据库前沿,解构实战干货,推动数据库技术变革