【Mysql专题】视图介绍及其基本操作

前言

前段时间,跟客户开个线上会议,在和对方技术人员讨论到如何把数据给我们的时候,对方说【丢给你们一个视图,你们查视图就好了】我一下子懵了。当时现场贼尴尬,我只能假装断线了,然后又模棱两可的说了几句,勉强把场子圆回来了。
话说回来,楼主虽然敲代码敲了很多年了,但是基本上没碰过多少sql。因为以前是游戏行业,管理后台基本上都是专门的人写的,我只是写游戏业务内容的。
想着以后避免再次遇到这种尴尬的场景,还是稍微花点时间学习一下【视图】这个东西吧。

一、视图的介绍

1. 什么是视图

视图是一个虚拟表,其内容由查询定义。同真实表一样,视图包含一系列带有名称的列和行数据,但视图并不是数据库真实存储的数据表。
视图是从一个、多个表,或者其他视图中导出的表,包含一系列带有名称的数据列和若干条数据行。
它跟真实的数据库表有如下区别:

  • 视图不是真实存在的表,而是一张虚拟表。其结构和数据都是建立在对数据库中,真实表的查询基础上的
  • 存储在数据库中的查询操作 SQL 语句定义了视图的内容,列数据和行数据来自于视图查询所引用的实际表,引用视图时动态生成这些数据(PS:这意味着,其实每次查询视图时,其实就是做一次当初定义视图时引用的操作)
  • 视图没有实际的物理记录,不是以数据集的形式存储在数据库中的,它所对应的数据实际上是存储在视图所引用的真实表中的
  • 视图是数据的窗口,而表是内容。表是实际数据的存放单位,而视图只是以不同的显示方式展示数据,其数据来源还是实际表
  • 视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些 SQL 语句的集合。从安全的角度来看,视图的数据安全性更高,使用视图的用户不接触数据表,不知道表结构(PS:所以这里可以看出来了,为什么当时客户跟我说要丢个视图给我,其实就是懒得写接口,但是又出于保护自己数据库表的目的,所以要特意编写个视图给我们)
  • 视图的建立和删除只影响视图本身,不影响对应的基本表

2. 视图的作用

通过上面的基本介绍,我估计大家对视图应该有关大概的印象了。当然,想要更具体的了解,还要结合下面的【视图的基本操作】,这个我们后面再继续说。
那视图有什么作用呢?我们这里先大概写一下,现在不理解也无所谓,看了后面的【视图的基本操作】你肯定能了解了。
作用如下:

  1. 定制用户数据,聚焦特定的数据。在实际的应用场景中,不同的用户或者接口对不同的数据有不同的需求。
    例如:数据库有公司表(公司id,公司名),部门表(部门id,部门名字),员工表(工号,员工姓名)同时存在。我们想要直接明了地查看,某个员工是属于哪个分公司,哪个部门的,就需要联合三张表进行查询。这时,我们就可以定义一个视图联合查询这三个部门的,并且无需关心公司id部门id那些冗余字段
  2. 简化数据库操作。在使用查询时,很多时候要使用聚合函数,同时还要显示其他字段的信息,可能还需要关联到其他表,语句可能会很长,如果这个动作频繁发生的话,可以创建视图来简化操作(看吧,其实数据库视图没什么神奇的,就是做这些事情而已)
  3. 提高基表数据的安全性。视图是虚拟的,物理上是不存在的。可以只授予用户视图的权限,而不具体指定使用表的权限,来保护基础数据的安全
  4. 共享所需数据。通过使用视图,每个用户不必都定义和存储自己所需的数据,可以共享数据库中的数据,同样的数据只需要存储一次
  5. 更改数据格式。通过使用视图,可以重新格式化检索出的数据,并组织输出到其他应用程序中
  6. 重用 SQL 语句视图提供的是对查询操作的封装,本身不包含数据,所呈现的数据是根据视图定义从基础表中检索出来的,如果基础表的数据新增或删除,视图呈现的也是更新后的数据。视图定义后,编写完所需的查询,可以方便地重用该视图

不过使用视图的时候,还应该注意以下几点:

  • 创建视图需要足够的访问权限
  • 创建视图的数目没有限制
  • 视图可以嵌套,即从其他视图中检索数据的查询来创建视图
  • 视图不能索引,也不能有关联的触发器、默认值或规则
  • 视图可以和表一起使用
  • 视图不包含数据,所以每次使用视图时,都必须执行查询中所需的任何一个检索操作。如果用多个连接和过滤条件创建了复杂的视图或嵌套了视图,可能会发现系统运行性能下降得十分严重。因此,在部署大量视图应用时,应该进行系统测试

二、视图的基本操作

我这边直接拿我们生产环境的表来做实验了。不过这边都是简单操作,更具体的东西还需要大家自己去了解。其实视图的操作,基本上跟表操作没啥两样,都是增删查改。
这边用到了3张表做基本操作演示,分别为:餐厅表(kitchen_canteen)、档口表(kitchen_stall)、经营报表(unify_report_stall)。具体表的定义我这边就不给了,我相信大家看了下面的sql代码基本也知道我想要干啥。

2.1 创建视图

语法格式如下:

CREATE VIEW <视图名> AS <SELECT语句>

示例:

CREATE VIEW view_canteen_store_turnover AS
SELECT
	kc.name AS canteenName,
	ks.name AS stallName,
	urs.biz_date AS bizDate,
	urs.turnover
FROM
	unify_report_stall urs
INNER JOIN kitchen_canteen kc ON urs.store_id = kc.id
INNER JOIN kitchen_stall ks ON urs.line_id = ks.id;

解析:我这边就是连了最开始说的3张表,获取餐厅名字,档口名字,以及档口营业额,组合成一个【商家营业额】视图。后续,我们就可以对这个视图直接做查询操作了,效果等同于上述的select查询片段。

2.2 查询视图

查询上面的视图,跟普通查询是一样的,为了证明,我们用explain给大家看看。首先先看select的结果:

SELECT * FROM view_canteen_store_turnover;

【Mysql专题】视图介绍及其基本操作_第1张图片
看explain的结果:
【Mysql专题】视图介绍及其基本操作_第2张图片
【Mysql专题】视图介绍及其基本操作_第3张图片
看,explain的结果是一样的。

2.3 修改视图

语法格式如下:

ALTER VIEW <视图名> AS <SELECT语句>

其实也可以不修改的,先删除,再重新创建也是一样道理。

2.4 删除视图

语法格式如下:

DROP VIEW <视图名> [ , <视图名2>]

PS:一次性可以删除多个视图

感谢

感谢小白教程的《Mysql教程》

你可能感兴趣的:(数据库,Java,mysql,oracle,数据库)