1 引言

为了简化复杂SQL语句编写,以及提高数据库安全性,MySQL数据库视图特性。视图是一张虚拟表,不在数据库中以储存的数据值形式存在。在开发中,开发者往往只对某些特定数据和所负责的特定任务感兴趣,只需要看到这一部分数据即可。这时候就可以用到视图来完成。

2 视图简介

2.1 什么是视图

  数据库中的视图是一个虚拟表,但它同真实表一样,包含一系列带有名称的行和列数据。行和列数据来自由定义视图查询所引用的表,并且在应用视图时动态生成。另外,视图还可以在已经存在的视图的基础上定义。

  视图一经定义变存储在数据库中,与其相对应的数据并没有像表那样在数据库中再存储一份,通过视图看到的数据只是存储在基本表中的数据。对视图的操作与对标的操作一样,可以对其进行查询、修改和删除。当对通过视图看到的数据进行修改时,相应的基本表中的数据也会发生变化;同时,若是基本表的数据发生变化,则这种变化也会自动地反映在视图上。

2.2 视图的作用

与直接从真实数据表中进行数据操作相比,视图具有以下的有点:

(1)简单化

看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而用户不必为以后的每一次操作指定全部的条件。

    (2)安全性

通过视图用户只能查询和修改他们所能看到的数据。数据库中的其他数据则既看不见也娶不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能限制到特定行和特定列上。但通过视图,用户可以被限制到数据库的行列级别的子集上。

         (3)逻辑数据独立性

视图可以帮助用户屏蔽真实表结构变化带来的影响。

3 创建视图

视图包含了SELECT查询结果,因此属兔的创建基于SELECT语句和已存在的数据库,视图可以建立在一张表上,也可以建立在多张表上。

本篇博文中,所有操作基于以下两张数据表(emp表、dept表)进行:

emp表:

  

emp表sql语句如下:

SET NAMES utf8mb4;

SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------

-- Table structure for emp

-- ----------------------------

DROP TABLE IF EXISTS `emp`;

CREATE TABLE `emp`  (

  `empno` int(4) NOT NULL,

  `ename` varchar(10) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,

  `job` varchar(9) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,

  `mgr` int(4) NULL DEFAULT NULL,

  `hiredate` date NULL DEFAULT NULL,

  `sal` float(7, 2) NULL DEFAULT NULL,

  `comm` float(7, 2) NULL DEFAULT NULL,

  `deptno` int(2) NULL DEFAULT NULL,

  PRIMARY KEY (`empno`) USING BTREE

) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;

-- ----------------------------

-- Records of emp

-- ----------------------------

INSERT INTO `emp` VALUES (7369, 'SMITH', 'CLERK', 7902, '1998-12-17', 800.00, NULL, 20);

INSERT INTO `emp` VALUES (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600.00, 300.00, 30);

INSERT INTO `emp` VALUES (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250.00, 500.00, 30);

INSERT INTO `emp` VALUES (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975.00, NULL, 20);

INSERT INTO `emp` VALUES (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250.00, 1400.00, 30);

INSERT INTO `emp` VALUES (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850.00, NULL, 30);

INSERT INTO `emp` VALUES (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450.00, NULL, 10);

INSERT INTO `emp` VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1981-11-17', 3000.00, NULL, 20);

INSERT INTO `emp` VALUES (7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000.00, NULL, 10);

INSERT INTO `emp` VALUES (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500.00, 0.00, 30);

INSERT INTO `emp` VALUES (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100.00, NULL, 20);

INSERT INTO `emp` VALUES (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950.00, NULL, 30);

INSERT INTO `emp` VALUES (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000.00, NULL, 20);

INSERT INTO `emp` VALUES (7934, 'MILLER', 'CLERK', 7782, '1982-02-23', 1300.00, NULL, 10);

INSERT INTO `emp` VALUES (8888, 'CHB', 'CLERK', 7369, '2018-12-10', 8000.00, 100.00, NULL);

SET FOREIGN_KEY_CHECKS = 1;

emp表SQL语句

  dept表:

  

  dept表SQL语句如下:

SET NAMES utf8mb4;

SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------

-- Table structure for dept

-- ----------------------------

DROP TABLE IF EXISTS `dept`;

CREATE TABLE `dept`  (

  `deptno` int(2) NOT NULL,

  `dname` varchar(14) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,

  `loc` varchar(13) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,

  PRIMARY KEY (`deptno`) USING BTREE

) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;

-- ----------------------------

-- Records of dept

-- ----------------------------

INSERT INTO `dept` VALUES (10, 'ACCOUNTING', 'NEW YORK');

INSERT INTO `dept` VALUES (20, 'RESEARCH', 'DALLAS');

INSERT INTO `dept` VALUES (30, 'SALES', 'CHICAGO');

INSERT INTO `dept` VALUES (40, 'OPERATIONS', 'BOSTON');

SET FOREIGN_KEY_CHECKS = 1;

demp表SQL语句

3.1 创建视图的基本格式

创建视图的基本格式如下:

   CREATE VIEW <视图名称> [(column_list)]

  AS SELECT语句;

  虽然还有更加完整的详细语法格式,但一般情况下,使用上述基本格式就够用了。

  (1)基于单个数据表建立视图

  在使用emp表时,如果需要查询查询empno(编号)、ename(姓名)、job(职位)、hiredate(雇用日期)、sal(月薪)等字段,并指定中文拼音别名,SQL语句如下:

select empno bianhao , ename xinmin, job zhiwei, hiredate guyongriqi, sal yuexin from emp;

如果需要频繁得进行该语句查询,那么每次都要重写这一行语句。使用视图可以简化操作,对empno、ename、job、hiredate、sal创建视图:

create view view_01 as select empno , ename , job , hiredate , sal from emp;

  执行完上述语句即可创建名为view_01的视图,如果你是通过Navicat等图形界面工具创建视图,在左侧视图栏下可找到view_01视图。

  

  在刚创建好的view_01视图进行查询:

select * from view_01 ;

  查询结果如下:

  

  可以发现,我们并未指定查询的字段,但查询效果却与直接在真实数据表上指定字段查询效果一样。但view_01视图并未实现字段别名,继续创建一个view_02为每个列添加别名:

create view view_02 (bianhao , xinmin , zhiwei , guyongriqi , yuexin) as select empno , ename , job , hiredate , sal from emp;

  查看view_02:

select * from view_02 ;

  结果如下:

  可以看到,每一个列的列名都是我们在创建视图时自己重新指定的。

  (2)创建基于多个表上视图

创建一个视图,视图中包含每个员工编号(empno)、姓名(ename)、职位(job)、领导编号(mgr)、领导姓名(empno)、部门名称(dname)、部门位置(loc),在真实数据表中查询语句如下:

select e1.empno bianhao, e1.ename xingming, e1.job zhiwei, e1.mgr lindaobianhao, e2.ename lindaoxingming, d.dname bumenmingchen, d.loc bumenweizhi

from emp e1 , emp e2 , dept d

where e1.mgr=e2.empno and e1.deptno=d.deptno ;

  创建视图:

create view view_03 as select e1.empno bianhao, e1.ename xingming, e1.job zhiwei, e1.mgr lindaobianhao, e2.ename lindaoxingming, 
d.dname bumenmingchen, d.loc bumenweizhi from emp e1 , emp e2 , dept d where e1.mgr=e2.empno and e1.deptno=d.deptno ;

  对刚建立的view_03视图进行查询:

select * from view_03 ;

  查询结果如下:

  可以发现,在select中指定别名与在view视图中指定别名效果是一样的。

4 查看视图

  (1)查看视图基本信息:describe 视图名;

查看上一章节创建的视图view_03的基本信息:

describe view_03 ;

  describe一般情况下都写成desc,两者是完全等效的。

另外还可以通过“show create view 视图名;”来查看视图详细信息。

  (2)查看所有视图

  在MySQL中,information_schema数据库下的views表中存储了所有视图的定义,通过对views表的查询,可以查看数据库中说哟视图的详细信息,查询语句如下:

select * FROM information_schema.views ;

  部分查询结果如下所示:

5 修改视图

  (1)使用create or replace view语句修改视图

  create or replace view语句从字面上也可以理解:既可以创建视图,也可以修改视图(存在的话就修改,不存在就创建)。create or replace view语句的语法结构与创建视图的create语句语法结构是完全一样的。

  修改上文中创建的视图view_01,添加一个部门编号字段(deptno):

create or replace view view_02 (bianhao , xinmin , zhiwei , guyongriqi , yuexin , bumenbiaohao) as select empno , ename , job , hiredate , sal , 
deptno from emp;

  再次查询view_02,发现确实多了部门编号这一列:

select * from view_02 ;

  (2)使用alter语句修改视图

  alter语句是MySQL提供的另一种修改视图的方法,其语法结果与create or replace语句也是基本一样的。

  继续修改视图view_02,添加一个奖金字段(comm):

alter view view_02 (bianhao , xinmin , zhiwei , guyongriqi , yuexin , bumenbiaohao , jiangjin) as select empno , ename , job , hiredate , sal ,
deptno , comm from emp;

查看view_01视图:

  alter语句与create orreplace语句的区别是当视图不存在是,alter语句会报错。

6 更新视图

  更新视图是指通过视图来插入、更新、删除表中的数据,因为视图是一个虚拟表,其中是没有数据的。通过视图更新的时候都是转到真实表上进行的。对视图的更新操作也包括update、insert和delete。

(1)update

通过视图将员工编号为7369的员工月薪改为1000,在更新前,其数据为:

select * from view_02 where bianhao=7369;

  用update语句进行更新

update view_02 set yuexin=1000 where bianhao=7369;

  再次通过视图查看数据,发现数据确实已更新:

  

再看看真实表中数据有没有更新:

select * from emp where empno=7369;

可以看出,真实表中的数据也一起更新了,说明对视图的更新操作本质上是对真实表的更新。

(2)insert

  先创建一个视图view_04,该视图结果与emp表一样:

create view view_04 as select * from emp ;

  使用insert语句向view_04视图中插入一条数据:

insert into view_04 values(8002 , 'MARK' , 'CLERK' ,  7902 , '1998-12-12' , 1100 ,  20 ,500 ) ;

  查看真实emp表中是否添加这么一条数据:

select * from emp where empno =8002  ;

  证明在视图进行insert操作是可以添加数据到真实表的。但一般来说,视图的表结构与视图的表结构可能不一样,若真实表中存在非空等约束,这通过视图的insert操作就回失败。所以,insert操作一般不会通过视图来进行。

    (3)delete

  通过视图删除刚创建的empno为8002的记录:

delete from view_04 where empno =8002  ;

  查看真实表中数据是否删除:

select * from emp where empno =8002  ;

  返回的是一个空表,证明真实表中的这条记录也已经被删除了。

  最后总结一下视图的更新操作,当视图中包含如下内容时,视图的更新操作将不能被执行:

  (1)视图中不包含真实表中被定义为非空的列(视图中没有,但真实表中为非空约束)。

  (2)在定义视图的select语句后的字段列表中使用了数学表达式。

  (3)在定义视图的select语句后的字段列表中使用了聚合函数。

  (4)在定义视图的select语句中使用了distinct,union,top, group by,或having子句。

7 总结

本文是对MySQL数据中视图的详细总结,包括了对视图概念、特性的介绍,然后通过实际示例展示了对视图的增删改查操作。

MySQL数据库之视图的更多相关文章

  1. Navicat工具导出mySQL数据库某个视图结构的.sql脚本

    用Navicat工具怎么都导不出来mySQL数据库的某个视图.sql脚本,即使导出来也只是包含视图记录,不包含视图结构.经过一番研究,终于克服,操作如下: 1.在某个数据库中,新建备份,如下图 2.选 ...

  2. MySQL数据库创建视图

    视图可以说是一种虚拟表,建立在基本表的基础上,通过关联一个表或者多个表来获取多个表中需要的字段,视图只是用来查询数据并不能用来存储数据信息. 我有以下几张表: -------image表---- -- ...

  3. mysql数据库之视图、触发器

    视图 概念:通过查询得到的一张虚拟表,然后保存下来就是视图 视图的好处:如果要频繁使用某张虚拟表,那么就可以保存为视图,以后查找就直接拿这个视图就会非常方便 视图语法规则: create view t ...

  4. 39、mysql数据库(视图)

    39.1.视图: 0.创建表及插入数据: 1.创建teacher表及插入数据: (1)创建表: CREATE TABLE teacher( tid int PRIMARY KEY auto_incre ...

  5. spring boot使用jpa查询mysql数据库的视图时不报错,但查询结果数据总是重复第一条

    问题描述: 在数据库里查询到的结果是正常显示的 在程序中返回的结果: 解决方法: 添加行号作为主键: 解决! 我明明是前端啊前端,为啥在搞后台....,总感觉我要在向全栈进发,希望自己有朝一日真的能成 ...

  6. mysql 数据库视图迁移

    最近做一个项目,为了方便查询,建了好多的视图表,正式上线的时候需要把本地数据库迁移到服务器上. 按照常规方法: 1."导出sql","导入sql",发现视图没过 ...

  7. MySQL 之【视图】【触发器】【存储过程】【函数】【事物】【数据库锁】【数据库备份】

    1.视图 视图:是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据 视图有如下特点;  1. 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系.  2. 视 ...

  8. 第二百八十二节,MySQL数据库-MySQL视图

    MySQL数据库-MySQL视图 1.视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 2.也 ...

  9. MySQL数据库(6)_用户操作与权限管理、视图、存储过程、触发器、基本函数

    用户操作与权限管理 MySQL用户操作 创建用户 方法一: CREATE USER语句创建 CREATE USER "用户名"@"IP地址" IDENTIFIE ...

随机推荐

  1. 稳定排序nlogn之归并排序_一维,二维

    稳定排序nlogn之归并排序_一维,二维 稳定排序:排序时间稳定的排序 稳定排序包括:归并排序(nlogn),基数排序[设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排 ...

  2. IAR ------ 基本使用

    1.编译结果: 6 887 bytes of readonly code memory 621 bytes of readonly data memory 331 bytes of readwrite ...

  3. python独立环境virtualenv(并在pycharm中指定)

    上篇文章中讲到 Django 如何启动以及配置 sessions 功能.sessions 功能用是跟踪用户的状态,经常结合 Cookie 功能实现自动登录功能. 所谓的“自动登录”指的是:我们登录一些 ...

  4. windows服务写完之后怎么让它跑起来

    当然你可以在命令框里面自己去手动的敲代码,也可以写一个.bat文件一劳永逸......这里我就介绍写.bat文件的方法 就是上图所示的三个东东啦,有了这三个东东,把他们拖到你windows服务的deb ...

  5. Linux命令(七)Linux用户管理和修改文件权限

    1. 用户管理 1.1 创建用户/设置密码/删除用户 (-m很重要,自动添加用户家目录) 创建用户组dev, 给用户组dev新建xiaoqin用户,给新用户设置密码! 1.2 查看用户信息 1.3 设 ...

  6. ASP.NET MVC学习笔记-----ControllerFactory

    上面这张图是asp.net mvc的工作流程图,我们可以看到当一个http请求来临时,首先需要经过路由系统,路由系统从中获取一些路由信息,然后ControllerFactory根据所得到的路由信息生成 ...

  7. js 正则之 检测素数

    相信很多人应该看过这篇文章,我第一次看到的时候是11年的样子,那时候学vbs的时候看过这个问题.原文<检查素数的正则表达式>,在文章里已经解释了他是怎么判断的,我就不啰嗦了.我们来说说 j ...

  8. TTPRequest 提示#import <libxml/HTMLparser.h>找不到 的解决方法

    本文永久地址为http://www.cnblogs.com/ChenYilong/p/3984251.html ,转载请注明出处. ASIHTTPRequest 或者AFNetwork提示的#impo ...

  9. [R语言]关联规则1---不考虑items之间的时序关系

    本文介绍的是关联规则,分为两部分:第一部分是---不考虑用户购买的items之间严格的时序关系,每个用户有一个“购物篮”,查找其中的关联规则.第二部分--- 考虑items之间的严格的时序关系来分析用 ...

  10. 爬虫笔记之自如房屋价格图片识别(价格字段css背景图片偏移显示)

    一.前言 自如房屋详情页的价格字段用图片显示,特此破解一下以丰富一下爬虫笔记系列博文集. 二.分析 & 实现 先打开一个房屋详情页观察一下: 网页的源代码中没有直接显示价格字段,价格的显示是使 ...