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

166 阅读4分钟

这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战

| 作者:江夏

| CSDN:blog.csdn.net/qq_41153943

| 掘金:juejin.cn/user/651387…

| 知乎:www.zhihu.com/people/1024…

| GitHub:github.com/JiangXia-10…

本文大概1165字,建议阅读9分钟

一、什么是视图

视图(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

查询结果如下:

图片

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

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

图片

查询视图:

select * from view_emp_dep

查询结果如下:

图片

也可以更新视图:

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

更新后查询结果如下:

图片

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

更改后查询的结果如下:

图片

3、查看视图

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

show tables

图片

图片

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

SHOW table status LIKE 'view_emp_dep'

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

图片

或者执行

SHOW table status LIKE 'view_emp_dep'\G

图片

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

show create view view_emp_dep;

图片

show create view view_emp_dep\G;

图片

4、删除视图

删除视图的语法:

drop view [if exists]viewname[,viewname]...[restrict|cascade]

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

drop view view_emp_dep;

图片

三、总结

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

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

今日推荐

你还不知道什么是数据库的索引吗

面试题系列之String,Stringbuffer,StringBuilder的区别(源码分析)

你知道String类为什么不能被继承吗?

SpringBoot整合Druid配置数据源监控

Spring注解(五):容器注册组件的四种方式