MySQL 视图技术
以前也只是知道数据库中有视图这么个概念,但是没有去深究,今天正好有时间,就来总结一下吧。
视图的定义
视图就是从一个或多个表中,导出来的表,是一个虚拟存在的表。视图就像一个窗口(数据展示的窗口),通过这个窗口,可以看到系统专门提供的数据(也可以查看到数据表的全部数据),使用视图就可以不用看到数据表中的所有数据,而是只想得到所需的数据。
在数据库中,只存放了视图的定义,并没有存放视图的数据,数据还是存储在原来的表里,视图的数据是依赖原来表中的数据的,所以原来的表的数据发生了改变,那么显示的视图的数据也会跟着改变,例如向数据表中插入数据,那么在查看视图的时候,会发现视图中也被插入了同样的数据。
视图在外观上和表很相似,但是它不需要实际上的物理存储,视图实际上是由预定义的查询形式的表所组成的。
视图可以包含表的全部或者部分记录,也可以由一个表或者多个表来创建,当我们创建一个视图的时候,实际上是在数据库里执行了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
总结
视图就是一个特殊的不占用物理存储的表,基于表而又高于表的存在。我们要充分的利用视图的优点,来优化我们的应用程序的开发!
MySQL 视图技术的更多相关文章
- MYSQL视图的学习笔记
MYSQL视图的学习笔记,学至Tarena金牌讲师,金色晨曦科技公司技术总监沙利穆 课程笔记的综合. 视图及图形化工具 1. 视图的定义 视图就是从一个或多个表中,导出来的表,是一个虚 ...
- 2020重新出发,MySql基础,MySql视图&索引&存储过程&触发器
@ 目录 视图是什么 视图的优点 1) 定制用户数据,聚焦特定的数据 2) 简化数据操作 3) 提高数据的安全性 4) 共享所需数据 5) 更改数据格式 6) 重用 SQL 语句 MySQL创建视图 ...
- Mysql 视图 游标 触发器 存储过程 事务
Mysql 视图 触发器 存储过程 游标 游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中 ...
- Mysql视图的作用及其性能分析
定义:视图是从一个或几个基本表导出的表,它与基本表不同,是一个虚表. 作用: 1.简化操作,不用进行多表查询. 2.当不同种类的用用户共享同一个数据库时,非常灵活,(用户以不同的 方式看待同一数据. ...
- MySQL分区技术 (一)
4:MySQL 分区技术(是mysql 5.1以版本号后開始用->是甲骨文mysql技术团队维护人员以插件形式插入到mysql里面的技术) 眼下,针对海量数据的优化主要有2中方法: 1:大表拆成 ...
- 深入解析MySQL视图view
阅读目录---深入解析MySQL视图view 创建视图 查看视图 视图的更改 create or replace view alter DML drop 使用with check option约束 嵌 ...
- MySQL视图view/存储过程和函数的使用
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...
- MySQL视图更新
昨天在写美团2019秋招笔试题的时候遇到了关于视图是否能更新的问题,突然感觉这个问题之前复习的时候重点关注过,但是却又想不全.今天特地搜了一些资料总结一下.本文主要说明视图的更新限制,如需关于视图的更 ...
- 一个MySQL视图的优化过程
1.需要优化的sql 最近做一个基于.net mvc和MySQL的仓储系统的优化工作,遇到了一个执行特别慢的SQL语句,经过一番折腾,终于搞定啦,分享一下过程.问题就是下面这个家伙: create o ...
随机推荐
- bzoj 5287: [Hnoi2018]毒瘤
Description Solution \(dfs\) 出一棵生成树之后,多出来的边就都是反祖边了 把反祖边两个端点都拿出来,就会得到最多 \(k=2*(m-n+1)\) 个关键点 除了关键点以外的 ...
- 2015 多校联赛 ——HDU5301(技巧)
Your current task is to make a ground plan for a residential building located in HZXJHS. So you must ...
- hdu 1130 How Many Trees?(Catalan数)
How Many Trees? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 最近i学习微信卡券中的会员卡功能,弄清楚不容易 ,分享一下。
创建会员卡接口 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025283 [4.1 创建会员卡接口] { " ...
- 笔记13 AOP中After和AfterReturning的区别
AOP中 @Before @After @AfterThrowing@AfterReturning的执行顺序 public Object invoke(Object proxy, Method met ...
- Ambari2.6.0 安装HDP2.6.3(离线安装)
一.下载安装包 因为使用在线安装特别慢,所有的安装包加起来有9个G左右,所以本教程是通过迅雷下载包,然后上传到服务器,通过配置本地源的方式来实现的离线安装.通过ambari安装需要下载下面的三个主要包 ...
- java反射 概念
一.什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 ...
- 关于npm run build 报错解决方案
# 特定的错误 ERROR in statics/mobile/js/vendor.cef13a0e680a5bc0d8b3.js from UglifyJsUnexpected token: pun ...
- Bootstrap 遮罩层实现方式
直接上代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <me ...
- Laravel-admin 使用Layer相册功能
使用Laravel-admin后台,Laravel-admin已经集成了很多前端组件,但是在手册中也没有发现能够展示相册的插件,而本人比较喜欢Layer弹窗的插件所以想使用Layer来进行效果展示 通 ...