MySQL 视图技术
2016-06-11 14:03
399 查看
以前也只是知道数据库中有视图这么个概念,但是没有去深究,今天正好有时间,就来总结一下吧。
视图就是从一个或多个表中,导出来的表,是一个虚拟存在的表。视图就像一个窗口(数据展示的窗口),通过这个窗口,可以看到系统专门提供的数据(也可以查看到数据表的全部数据),使用视图就可以不用看到数据表中的所有数据,而是只想得到所需的数据。
在数据库中,只存放了视图的定义,并没有存放视图的数据,数据还是存储在原来的表里,视图的数据是依赖原来表中的数据的,所以原来的表的数据发生了改变,那么显示的视图的数据也会跟着改变,例如向数据表中插入数据,那么在查看视图的时候,会发现视图中也被插入了同样的数据。
视图在外观上和表很相似,但是它不需要实际上的物理存储,视图实际上是由预定义的查询形式的表所组成的。
视图可以包含表的全部或者部分记录,也可以由一个表或者多个表来创建,当我们创建一个视图的时候,实际上是在数据库里执行了SELECT语句,SELECT语句包含了字段名称、函数、运算符,来给用户显示数据。
在数据库中,视图的使用方式与表的使用方式一致,我们可以像操作表一样去操作视图,或者去获取数据。
一般来说,我们只是利用视图来查询数据,不会通过视图来操作数据。
注意:基于已经存在的视图,我们可以创建新的视图。
视图和表的主要的区别就在于是否占用物理的存储空间。表是占用实际空间的,视图是基于表的更高层的存在。
建表:
是不是和创建普通表结构很相似啊 关键就在于AS语句咯。因为那是视图数据的来源。
我们需要关注的就是AS后面的实现,和正常写SQL语句很类似,就不过多的叙述了。
由于没有SQL语句很简单,没有加约束,所以展示的数据可能有点不太美观。不过视图的功能已经实现了。优化的话还需要我们来自己实现。
ALGORITHM=
WHIT [CASCADED|LOCAL] CHECK OPTION:表示更新视图的时候,要保证在视图的权限范围之内:
使用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”
视图的定义
视图就是从一个或多个表中,导出来的表,是一个虚拟存在的表。视图就像一个窗口(数据展示的窗口),通过这个窗口,可以看到系统专门提供的数据(也可以查看到数据表的全部数据),使用视图就可以不用看到数据表中的所有数据,而是只想得到所需的数据。
在数据库中,只存放了视图的定义,并没有存放视图的数据,数据还是存储在原来的表里,视图的数据是依赖原来表中的数据的,所以原来的表的数据发生了改变,那么显示的视图的数据也会跟着改变,例如向数据表中插入数据,那么在查看视图的时候,会发现视图中也被插入了同样的数据。
视图在外观上和表很相似,但是它不需要实际上的物理存储,视图实际上是由预定义的查询形式的表所组成的。
视图可以包含表的全部或者部分记录,也可以由一个表或者多个表来创建,当我们创建一个视图的时候,实际上是在数据库里执行了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”
总结
视图就是一个特殊的不占用物理存储的表,基于表而又高于表的存在。我们要充分的利用视图的优点,来优化我们的应用程序的开发!相关文章推荐
- MySQL插入中文不乱码的5种方法
- mysql 表锁——读锁和写锁
- mysql定时备份
- Mysql 技术内幕(二)
- Mysql 技术内幕(一)
- mysql索引的类型和优缺点
- 学习笔记之MySQL
- mysql数据库中的十进位是什么意思?
- 解决 2003 Can’t connect to MySQL server on ‘localhost’ (10048)
- mysql status关键字 数据表设计中慎重使用
- mysql 中LIMIT 分页查询
- mysql中GROUP BY 分组查询
- mysql对查询结果排序
- MySQL主从复制的原理及配置方法(比较详细)
- mysql备份与还原
- MySQL数据库的优化技术
- hive 元数据 mysql-2
- hive 元数据 mysql-1
- mysql将两张表的两个列连接后更新到第三张表中
- mysql行变列