关于数据库的视图,你了解多少

简介: 视图(View)并不在数据库中实际存在,而是一种虚拟表,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。即视图就是执行查询语句后所返回的结果集,所以在创建视图的时候,主要就是创建这条SQL查询语句。

一、什么是视图


视图(View)并不在数据库中实际存在,而是一种虚拟表,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。即视图就是执行查询语句后所返回的结果集,所以在创建视图的时候,主要就是创建这条SQL查询语句。


对于普通的数据表来说,视图具有以下的一些特点:


1、简单:因为视图是查询语句执行后返回的已经过滤好的复合条件的结果集,所以使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件。


2、安全:使用视图的用户只能访问他们被允许查询的结果集,对于表的权限管理并不能限制到某个行或者某个列,但是通过视图就可以简单的实现。


3、数据独立:一旦视图的结构被确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。


二、视图的语法


1、创建视图


创建视图的语法如下:


create [or replace][algorithm]={undefined|merge|temptable}
view view_name[(col_list)]
as select_statement
[with[cascaded|local|check option]]
复制代码


为了验证视图的使用,首先创建一个部门的表和一个员工的表:


部门表如下:


DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `departmentName` varchar(255) DEFAULT NULL,
  `departmentID` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
复制代码


然后向部门表中插入数据:


INSERT INTO `department` VALUES ('1', '开发部', '201');
INSERT INTO `department` VALUES ('2', '技术部', '202');
INSERT INTO `department` VALUES ('3', '测试部', '203');
复制代码


接着创建一个员工表:


DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `lastName` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `departmentID` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
复制代码


员工表中插入数据:


INSERT INTO `employee` VALUES ('1', '亚索', '123qq.com', '201');
INSERT INTO `employee` VALUES ('2', '李青', '12345@qq.com', '201');
INSERT INTO `employee` VALUES ('3', '剑圣', '2354@qq.com', '202');
INSERT INTO `employee` VALUES ('4', '嘉文', '6565@qq.com', '203');
复制代码


两张表联合查询:


select e.*,d.departmentName from employee e,department d where e.departmentID = d.departmentID
复制代码


查询结果如下:


0dcd836365b14bf0bac4539c245c503b~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


这里就可以使用视图为以上的结果集创建视图,语句如下:


create view VIEW_emp_dep as select e.*,d.departmentName from employee e,department d where e.departmentID = d.departmentID
复制代码


6c51f073dd3d47b790ade4d35ef12e6a~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


查询视图:


select * from view_emp_dep
复制代码


查询结果如下:


f275dfbd3f8846a082833f178c4baf1a~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


也可以更新视图:


update view_emp_dep set lastName='德玛西亚' where departmentID=203
select * from view_emp_dep
复制代码


更新后查询结果如下:


d354d36e046a46759a41d55208795ad3~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


2、修改视图


alter [algorithm]={undefined|merge|temptable}
view view_name[(col_list)]
as select_statement
[with[cascaded|local|check option]]
复制代码


参数解释: with[cascaded|local|check option]决定了是否允许更新数据使记录不再满足视图的条件


local:只要满足本视图的条件就可以更新


cascaded:必须满足所有针对该视图的所有视图的条件才可以更新


例如修改刚刚创建的view_emp_dep视图,然后查询视图:


alter view view_emp_dep as select e.lastName,d.departmentName from employee e,department d where e.departmentID = d.departmentID
select * from view_emp_dep
复制代码


更改后查询的结果如下:


3f8f76cfc3454b0aa6a3fb524dd6ef8a~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


3、查看视图


在MySQL5.1版本之后,使用show tables不仅仅能够显示表,而且也能够显示视图,并且不存在单独显示视图的show views命令:


show tables
复制代码


b60c096af49244ae978319c2a35cb993~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


ff41f06807fe4d2390b45aa0813d9c61~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

使用show table status命令不仅仅能够显示表的信息,也能够显示视图信息:

SHOW table status LIKE 'view_emp_dep'
复制代码


数据过长,在命令行窗口执行:


b5cf8a7d0df54820b647efe139e36621~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


或者执行


SHOW table status LIKE 'view_emp_dep'\G
复制代码


dbb2ecdfad4c4e2fa9446017512cf7c8~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


如果需要查询某个视图的定义,可以使用show create view命令查看:


show create view view_emp_dep;
复制代码


aa38316cf7044459a57f791ac919b8fb~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


show create view view_emp_dep\G;
复制代码


65c92d6994ff46d7a3baa217449b1506~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


4、删除视图


删除视图的语法:


drop view [if exists]viewname[,viewname]...[restrict|cascade]
复制代码


例如:删除刚刚创建的view_emp_dep视图:


drop view view_emp_dep;
复制代码


91ca82523b644f96a098177ddee9a1af~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


三、总结


以上就是关于数据库中视图的简单介绍以及具体的使用。视图(View)并不在数据库中实际存在,而是一种虚拟表,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。即视图就是执行查询语句后所返回的结果集,所以在创建视图的时候,主要就是创建这条SQL查询语句。


有任何问题或者不正确的地方欢迎讨论指正!

目录
相关文章
|
6月前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:视图之美,简化查询、提升效率的数据库利器(14)
轻松入门MySQL:视图之美,简化查询、提升效率的数据库利器(14)
256 0
|
6月前
|
关系型数据库 MySQL 程序员
【MySQL 数据库】8、视图
【MySQL 数据库】8、视图
87 0
|
6月前
|
存储 数据库
Navicate 如何导出数据库中的存储过程、事件、视图等?
Navicate 如何导出数据库中的存储过程、事件、视图等?
343 0
|
6月前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之视图
【数据库SQL server】关系数据库标准语言SQL之视图
146 0
|
6月前
|
数据库
数据库第十一次作业 视图的应用
数据库第十一次作业 视图的应用
59 1
|
存储 SQL Oracle
Oracle数据库批量删除表、视图、序列、存储过程、函数脚本
Oracle数据库批量删除表、视图、序列、存储过程、函数脚本
126 0
|
6月前
|
SQL 数据库 数据库管理
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(一)模式、表、索引与视图
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(一)模式、表、索引与视图
175 11
|
SQL 关系型数据库 MySQL
MySql数据库中的视图,索引与数据库sql脚本如何导入与导出---(详细介绍)
MySql数据库中的视图,索引与数据库sql脚本如何导入与导出---(详细介绍)
356 0
|
2月前
|
存储 缓存 关系型数据库
MySQL 视图:数据库中的灵活利器
视图是数据库中的虚拟表,由一个或多个表的数据经筛选、聚合等操作生成。它不实际存储数据,而是动态从基础表中获取。视图可简化数据访问、增强安全性、提供数据独立性、实现可重用性并提高性能,是管理数据库数据的有效工具。
|
5月前
|
存储 SQL 关系型数据库
MySQL数据库进阶第四篇(视图/存储过程/触发器)
MySQL数据库进阶第四篇(视图/存储过程/触发器)