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

总结

视图就是一个特殊的不占用物理存储的表,基于表而又高于表的存在。我们要充分的利用视图的优点,来优化我们的应用程序的开发!

时间: 2024-10-01 12:49:47

MySQL 视图技术的相关文章

【数据库优化专题】MySQL视图优化(二)

本期继续为大家带来MySQL视图优化的原创专家文章分享,来自DBA+社群MySQL领域原创专家--李海翔.以下是衔接上周所发布的第二部分的内容,未完部分敬请继续关注后续更新. 专家简介   李海翔 网名:那海蓝蓝 DBA+社群MySQL领域原创专家 从事数据库研发.数据库测试与技术管理等工作10余年,对数据库的内核有深入研究,擅长于PostgreSQL和MySQL等开源数据库的内核与架构.现任职于Oracle公司MySQL全球开发团队,从事查询优化技术的研究和MySQL查询优化器的开发工作.著有

mysql 5 mysql 5 技术内幕

mysql 5 mysql 5 技术内幕: http://www.kitebird.com/mysql-book/4ed.php

Apache Geronimo和Spring框架,第6部分:Spring MVC:使用Web视图技术

简介:本教程是系列教程(共六部分)的最后一部分,向您展示了如何利用 Spring 框架来使用 JavaServer Page(JSP).Velocity.Tile 和 PDF 导出功能.您将用 Model-View-Controller (MVC)中的 V 做试验,即 Spring MVC 中内置的各种 Web 视图.通过对 Spring MVC 所支持的各种视 图技术的全面介绍,您将看到在整个系列教程中构建的样例电话本应用程序中实现这些技术有多么轻松. 开始之前 本系列教程适合于需要了解 Sp

MySQL分页技术、6种分页方法总结

  这篇文章主要介绍了MySQL分页技术.6种分页方法总结,本文总结了6种分页的方法并分别一一讲解它们的特点,需要的朋友可以参考下 概述 有朋友问: MySQL的分页似乎一直是个问题,有什么优化方法吗? 网上看到赶集网XX推荐了一些分页方法,但似乎不太可行,你能点评一下吗? 方法总结 方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N 适应场景: 适用于数据量较少的情况(元组百/千级) 原因/缺点: 全表扫描

MySQL DBA技术难度低为什么工资比Oracle高?

编辑手记:前几天在知乎上出现了一个很热的帖子,话题是"MySQL DBA技术难度低为什么工资比oracle高?",这个话题很快引起了热烈的讨论.从回帖的情况来看,大部分人几乎都默认了MySQL DBA工资的确高这个事实,那么原因是什么,我们节选MySQL专家刘伟的回帖跟大家分享. 以下是他回帖的原文: 主要有以下两个原因: 1.市场供需关系 2.技术要求相对高 这两个因素一直没有得到改善,导致现在市场的行情是:招MySQL DBA难,招称心的MySQL DBA就更难. 先说一个工资议价

【JAVA秒会技术之玩转SQL】MySQL优化技术(二)

MySQL优化技术(二) [前文连接]MySQL优化技术(一) (五)常用SQL优化 1.默认情况,在使用group by 分组查询时,会先分组,其后还会默认对组内其他条件进行默认的排序,可能会降低速度.这与在查询中指定order by col1, col2类似. 如果查询中包括group by但用户想要避免排序结果的消耗,则可以使用order by null禁止排序. 例子:   2.尽量使用左连接(或右连接)来替代普通多表联查.因为使用JOIN,MySQL不需要在内存中创建临时表.    s

mysql 视图怎么增加自增字段

问题描述 mysql 视图怎么增加自增字段 mysql 从两张不含自增字段的表格生成一张含自增字段视图,应该怎么实现啊,各位大神. 简单来说,视图可以新增原表格没有的字段吗? 解决方案 用行号http://www.cnblogs.com/xinlei/archive/2011/12/16/2290349.html 解决方案二: mysql 实现行号的方法--如何获取当前记录所在行号 解决方案三: MySQL的自增字段MySQL中设置自增字段如何用mysql增加字段

MySQL 视图的基础操作(五)_Mysql

1.为什么使用视图:      为了提高复杂SQL语句的复用性和表操作的安全性(例如:工资字段不想展示给所有能查看该查询结果的人),MySQL提供了视图特性.所谓视图,本质上是一种虚拟表,其内容与真实的表相似,包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储数据值的形式存在.行和列的数据来自定义视图的查询所引用基本表,并且在具体使用视图时动态生成.  视图有如下特点;       1. 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系.       2. 视图是由基本表

【JAVA秒会技术之玩转SQL】MySQL优化技术(一)

MySQL优化技术(一)         开发的路上,总会碰到一些老系统,越用越慢."慢"的原因也许有很多,但是,博主个人觉得,数据库的设计和sql语句写的好坏,对系统效率的影响是最直接,最显而易见的!所以,学习一下MySQL的优化,还是很有必要的.当然,博主能力有限,没那么多经验,更多的是"道听途说"和"纸上谈兵".如有不正之处,望大神开后给予指正,不胜感激! (一)MySQL优化技术概述 ①表的设计合理化(符合3NF,即符合"三范式