以前也只是知道数据库中有视图这么个概念,但是没有去深究,今天正好有时间,就来总结一下吧。

视图的定义

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

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

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

视图可以包含表的全部或者部分记录,也可以由一个表或者多个表来创建,当我们创建一个视图的时候,实际上是在数据库里执行了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 视图技术的更多相关文章

  1. MYSQL视图的学习笔记

    MYSQL视图的学习笔记,学至Tarena金牌讲师,金色晨曦科技公司技术总监沙利穆 课程笔记的综合. 视图及图形化工具   1.       视图的定义 视图就是从一个或多个表中,导出来的表,是一个虚 ...

  2. 2020重新出发,MySql基础,MySql视图&索引&存储过程&触发器

    @ 目录 视图是什么 视图的优点 1) 定制用户数据,聚焦特定的数据 2) 简化数据操作 3) 提高数据的安全性 4) 共享所需数据 5) 更改数据格式 6) 重用 SQL 语句 MySQL创建视图 ...

  3. Mysql 视图 游标 触发器 存储过程 事务

    Mysql 视图 触发器 存储过程 游标 游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中 ...

  4. Mysql视图的作用及其性能分析

    定义:视图是从一个或几个基本表导出的表,它与基本表不同,是一个虚表. 作用: 1.简化操作,不用进行多表查询. 2.当不同种类的用用户共享同一个数据库时,非常灵活,(用户以不同的 方式看待同一数据. ...

  5. MySQL分区技术 (一)

    4:MySQL 分区技术(是mysql 5.1以版本号后開始用->是甲骨文mysql技术团队维护人员以插件形式插入到mysql里面的技术) 眼下,针对海量数据的优化主要有2中方法: 1:大表拆成 ...

  6. 深入解析MySQL视图view

    阅读目录---深入解析MySQL视图view 创建视图 查看视图 视图的更改 create or replace view alter DML drop 使用with check option约束 嵌 ...

  7. MySQL视图view/存储过程和函数的使用

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...

  8. MySQL视图更新

    昨天在写美团2019秋招笔试题的时候遇到了关于视图是否能更新的问题,突然感觉这个问题之前复习的时候重点关注过,但是却又想不全.今天特地搜了一些资料总结一下.本文主要说明视图的更新限制,如需关于视图的更 ...

  9. 一个MySQL视图的优化过程

    1.需要优化的sql 最近做一个基于.net mvc和MySQL的仓储系统的优化工作,遇到了一个执行特别慢的SQL语句,经过一番折腾,终于搞定啦,分享一下过程.问题就是下面这个家伙: create o ...

随机推荐

  1. [HNOI2012]与非

    题目描述 NAND(与非)是一种二元逻辑运算,其运算结果为真当且仅当两个输入的布尔值不全为真.NAND运算的真值表如下(1表示真,0表示假): 两个非负整数的NAND是指将它们表示成二进制数,再在对应 ...

  2. ●POJ 3378 Crazy Thairs

    题链: http://poj.org/problem?id=3378 题解: 树状数组维护,高精度. 依次考虑以每个位置结尾可以造成的贡献. 假设当前位置为i,为了达到5个元素的要求,我们需要求出,在 ...

  3. NOIP2014-6-14模拟赛

    Problem 1 抓牛(catchcow.cpp/c/pas) [题目描述] 农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来. 他们都站在数轴上.约翰在N(O≤N≤1 ...

  4. THUWC逛街记

    1/28 这次打算去THUWC划个水,就定了1/29中午的飞机.同校有几个同学去PKUWC,求稳搭今天的飞机.中午时候听说今天飞长沙的飞机全都取消了,明天有没有也不好说( 事实证明29号有飞机:( ) ...

  5. [HNOI2006]超级英雄

    题目描述 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确回答一道题后,才 ...

  6. poj 3904(莫比乌斯反演)

    POJ 3904 题意: 从n个数中选择4个数使他们的GCD = 1,求总共有多少种方法 Sample Input 4 2 3 4 5 4 2 4 6 8 7 2 3 4 5 7 6 8 Sample ...

  7. bzoj2669[cqoi2012]局部极小值 容斥+状压dp

    2669: [cqoi2012]局部极小值 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 774  Solved: 411[Submit][Status ...

  8. candy(动态规划)

    题目描述 There are N children standing in a line. Each child is assigned a rating value. You are giving ...

  9. SQL_SERVER_2008升级SQL_SERVER_2008_R2的方法

    SQL 2008升级到SQL 2008 R2. 说到为什么要升级是因为,从另一台机器上备份了一个数据库,到我的机器上还原的时候提示"948错误,意思就是不能把高版本的数据库附加到低版本上,所 ...

  10. react 踩的坑

    1.如上图所示:没有任何语法错误,可是只要加上</button>闭合标签后就乱套了 解决方案:sublimetext view-syntax-babel-javascript(babel) ...