MySQL入门篇-视图简介

news2024/11/23 1:18:30

备注:测试数据库版本为MySQL 8.0

这个blog我们来聊聊MySQL视图。

前言:

视图是从一个或几个基本表导出的表。视图本身不独立存储在数据库中,是一个虚表。
即数据库中只存放视图的定义而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中。
视图在概念上与基本表等同,用户可以如同基本表那样使用视图,可以在视图上再定义视图。
引进VIEW的优点有:
(1)视图能够简化用户内的操作。
(2)视图使用户能以多种角度看待同一数据。
(3)视图对重构数据库提供了一定程度的逻辑独立性。
(4)视图能够对机容密数据提供安全保护。

视图语法

视图创建语法:

CREATE
    [OR REPLACE]
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = user]
    [SQL SECURITY { DEFINER | INVOKER }]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

视图修改语法:

ALTER
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = user]
    [SQL SECURITY { DEFINER | INVOKER }]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

视图删除语法:

DROP VIEW [IF EXISTS]
    view_name [, view_name] ...
    [RESTRICT | CASCADE]

语法解读:
1)OR REPLACE: 如已存在同名的视图,进行替换

2)ALGORITHM : 表示视图选择算法,一般无需指定,使用默认值即可。

3)DEFINER: 视图的定义用户,如不指定,则为创建用户。

4)SQL SECURITY:SQL安全性。

5)select_statement:查询的SQL语句,可以从基表也可以从视图出。

6)WITH CHECK OPTION:表示视图在更新时保证约束,默认是CASCADED。
 

视图案例

视图能够简化用户内的操作

如需要scott用户下建表及录入数据语句,可参考:
scott建表及录入数据sql脚本

也可以直接复制下面准备数据

-- Oracle scott用户下四张表,比较便于做实验,验证数据,现修改为MySQL版本
-- 1.部门表 --dept
-- 2.员工表 --emp
-- 3.工资等级表 --salgrade
-- 4.奖金表 --bonus
-- Create table
-- 
-- create database testdata;
-- use testdata;
create table dept
(
  deptno INT(2) not null,
  dname  VARCHAR(14),
  loc    VARCHAR(13)
)  engine=InnoDB charset=utf8; 
-- Create/Recreate primary, unique and foreign key constraints 
alter table dept
  add constraint PK_DEPT primary key (DEPTNO)
;

insert into dept(DEPTNO, DNAME, LOC)
values (10, 'ACCOUNTING', 'NEW YORK');

insert into dept(DEPTNO, DNAME, LOC)
values (20, 'RESEARCH', 'DALLAS');

insert into dept(DEPTNO, DNAME, LOC)
values (30, 'SALES', 'CHICAGO');

insert into dept(DEPTNO, DNAME, LOC)
values (40, 'OPERATIONS', 'BOSTON');

-- Create table
create table emp
(
  empno    INT(4) not null,
  ename    VARCHAR(10),
  job      VARCHAR(9),
  mgr      INT(4),
  hiredate DATE,
  sal      decimal(7,2),
  comm     decimal(7,2),
  deptno   INT(2)
) engine=InnoDB charset=utf8;
-- Create/Recreate primary, unique and foreign key constraints 
alter table emp
  add constraint PK_EMP primary key (EMPNO);
alter table emp
  add constraint FK_DEPTNO foreign key (DEPTNO)
  references dept (DEPTNO);
	
	insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7369, 'SMITH', 'CLERK', 7902,'1980-12-17', 800, null, 20);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7788, 'SCOTT', 'ANALYST', 7566, '1987-06-13', 3000, null, 20);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7876, 'ADAMS', 'CLERK', 7788, '1987-06-13', 1100, null, 20);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);

insert into emp(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);

create table salgrade
(
  grade INT,
  losal INT,
  hisal INT
) engine=InnoDB charset=utf8;

insert into salgrade(GRADE, LOSAL, HISAL)
values (1, 700, 1200);

insert into salgrade(GRADE, LOSAL, HISAL)
values (2, 1201, 1400);

insert into salgrade(GRADE, LOSAL, HISAL)
values (3, 1401, 2000);

insert into salgrade(GRADE, LOSAL, HISAL)
values (4, 2001, 3000);

insert into salgrade(GRADE, LOSAL, HISAL)
values (5, 3001, 9999);

create table bonus
(
  ename VARCHAR(10),
  job   VARCHAR(9),
  sal   INT,
  comm  INT
) engine=InnoDB charset=utf8 ;

 需求:需要查询员工表该部门最高薪水以及最低薪水以及全公司最高最低薪水

with tmp1 as
(
select d1.dname,
			 max(e1.sal) sal_dept_max,
			 min(e1.sal) sal_dept_min
from emp e1
left join dept d1
on e1.deptno = d1.deptno
group by d1.dname
),
tmp2 as
(
select max(e1.sal) sal_com_max,
			 min(e1.sal) sal_com_min
from emp e1
left join dept d1
on e1.deptno = d1.deptno
)
select  dname,     -- 部门名称
        sal_dept_max,  -- 部门最高工资
				sal_dept_min,  -- 部门最低工资
				(select sal_com_max from tmp2) sal_com_max, -- 公司最高工资
				(select sal_com_min from tmp2) sal_com_min  -- 公司最低工资
from tmp1

现在,我已经写了上述的一个复杂的sql,实现了需求。
过了一段时间后,如果业务再次需要这个数据,我又得重新花时间写一遍。
如果此时我创建了视图,将复杂sql语句保存为视图,下次我直接查询视图即可。

-- 就是在原来的语句加了create view 
create view v1 as with tmp1 as
(
select d1.dname,
			 max(e1.sal) sal_dept_max,
			 min(e1.sal) sal_dept_min
from emp e1
left join dept d1
on e1.deptno = d1.deptno
group by d1.dname
),
tmp2 as
(
select max(e1.sal) sal_com_max,
			 min(e1.sal) sal_com_min
from emp e1
left join dept d1
on e1.deptno = d1.deptno
)
select  dname,     -- 部门名称
        sal_dept_max,  -- 部门最高工资
				sal_dept_min,  -- 部门最低工资
				(select sal_com_max from tmp2) sal_com_max, -- 公司最高工资
				(select sal_com_min from tmp2) sal_com_min  -- 公司最低工资
from tmp1

查询视图

select * from v1;

可以看到同样得到了结果 

参考文章

MySQL 8.0 视图简介_只是甲的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/197470.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Windows] 微信超级管家,自动好友回复、计数、自动同意、群发、好友导出、消息日志、无限多开

简介 微信超级管家是一款大神针对微信制作的工具,它的主要功能包括了自动回复、好友计数、自动同意、群发、好友导出、消息日志、无限多开等等,让你拥有无限潜力哈,经常使用微信电脑版的朋友一定会用的上。 下载 微信超级管家 软件功能 1…

安全测试之浅析静态应用

SAST,Static Application Security Testing,即静态应用安全测试,也叫静态分析,是一种测试方法,一直是应用程序安全性工作的核心部分。根据Forrester的 The State Of Application Security, 2022一文的预测,…

云计算|OpenStack|社区版OpenStack安装部署文档(七--- 仪表盘服务dashboard的安装部署---Rocky版)

前言: 仪表盘是一般项目的标配,有了仪表盘可以降低运维工作,并且很多的管理工作是可以可视化的。本节计划在控制节点安装openstack官网的仪表盘项目 openstack由于是一个开源的社区版本云计算项目,因此,它的web仪表盘…

【Core】.net core 3.1 api 返回实体类数据存在null,导致小程序调用接口也直接显示了null,原来要这样设置才可

对接过API接口的小伙伴都知道,接口返回的Json格式数据,有些字段可能会出现null的情况,并且还是个字符串,直接显示在用户界面上给人感觉出bug了 文章目录【开发环境】【场景描述】【返回null值重现】1)创建新项目2&…

细讲TCP三次握手四次挥手(二)

TCP/IP 协议族 应用层 应用层( application-layer )的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。 对于不同的网络应用需要不同的应用层协议…

基本放大器电路- (一)

运算放大器组成的电路五花八门,令人眼花瞭乱,是模拟电路中学习的重点。在分析它的工作原理时倘没有抓住核心,往往令人头大。为此本人特搜罗天下运放电路之应用,来个“庖丁解牛”,希望各位从事电路板维修的同行&#xf…

精讲rpc框架,这么讲不怕你不明白!

谈到rpc框架可能有点陌生感,但是如果换成框架语言Ocaml,大家一定不陌生。 众所周知,ocaml是一款专门做functional programming的一款软件,尤其是它的界面非常简洁,还是专门的server进行线上编写。 rpc框架和ocaml是什…

一篇就看懂的文件操作

文件操作1为什么使用文件我们前面学习结构体时,写了通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了&#xff…

【Java并发编程】 interrupt 方法详解

【Java并发编程】 interrupt 方法详解 文章目录【Java并发编程】 interrupt 方法详解1.介绍2.打断阻塞状态线程3.打断正常状态的线程4.两阶段终止模式5.打断 park 线程1.介绍 程序中,有些线程的终端需要外部干预,比如有线程存在while(true)循环&#xf…

值得拥有并收藏的 3个安卓/鸿蒙手机解锁软件

手机无论支持哪种操作系统,都占据了每个人口袋里的空间。随着大量移动设备的使用,搜索引擎上也出现了同样数量的查询,其中最常见的是提供安卓/鸿蒙屏幕锁定删除工具。由于安卓是当今最畅销的设备,我们的首要任务是为您提供最好的安…

矿山安全生产监测预警系统 opencv

矿山安全生产监测预警系统通过pythonopencv网络模型计算机视觉技术,对现场画面中人的不安全行为”、“物的不安全状态”、“环境的不安全因素”三方面出发进行实时监测,当监测到现场画面中人员未穿反光衣行为、明火烟雾、未穿安全帽行为、矿车掉道识别、…

【王道数据结构】第三章 | 栈和队列

目录 一、栈stack 基本概念 基本操作 存储结构​​​​​​​ 二、队列Queue 基本概念 队列的基本操作 存储结构 三、栈的应用 栈在括号匹配中的应用 栈在表达式求值中的应用​编辑 栈在递归中的应用 一、栈stack 基本概念 只允许在一端(栈顶top)进行插入或删除操…

大数据看全国疫情生活,北京、武汉已过疫情拐点

自2022年11月末,很多地区新冠病例数据呈现下降趋势,与实际感知有明显差异。2022年12月14日,国家疾控中心发布消息,核酸检测实行“愿检尽检”,不再公布无症状感染者数据。因此,网友们想要了解所在地和老家的…

python能做的100件事04 - python解析PDF

1. python常用pdf库 名称特点PyPDF2已不再维护,继任者PyPDF4 ,但很长时间没有更新了,能读不能写pdfrw能读不能写,但可以兼容ReportLab写ReportLab商业版的开源版本,能写不能读pikepdf能读不能写pdfplumber能读不能写PyMuPDF读写均可,基于GPL…

Vue面试题2

1:vue.js的两个核心是什么? 答:数据驱动和组件化。 2:vue生命周期钩子函数有哪些? 答:总共分为8个阶段创建前/后,载入前/后,更新前/后,销毁前/后 3:第一次页面加载会触发哪几个钩子…

C语言二维数组中:主次对角线求和,上下三角求和,杨辉三角,矩阵转置

p8 有些的结论需要直接记住 目录 矩阵转置 主对角线和次对角线 下三角 和上三角(一般是让求和) 下三角 上三角 杨辉三角 矩阵转置 不是方阵 需要用到第二个二维数组 b[i][j]a[i][j] 是方阵 方法1 借助第二个二维数组,同上 方…

C++基础-3函数

一、函数 1.概述 作用:将一段经常使用的代码封装起来,减少重复代码 而一个较大的程序,一般分为若干个代码块,每个模块实现特定的功能 2.定义 5个内容: ①返回值类型 ②函数名 ③参数列表 ④函…

力扣刷题记录——1287. 有序数组中出现次数超过25%的元素、1299. 将每个元素替换为右侧最大元素 、1413. 逐步求和得到正数的最小值

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《力扣刷题记录——1287. 有序数组中出现次数超过25%的元素…

【vector的模拟实现】

目录 1 类的成员变量 2 常用成员函数和迭代器 3 增删查改 3.1 reverse 3.2 push_back 3.3 resize 3.4 insert && erase 4 默认成员函数 4.1 构造函数 4.2 拷贝构造 4.3 赋值运算符重载 4.4 析构函数 前面我们详细介绍了string类的使用,vector的…

关于 JSON 数据格式的完全使用指南

前言 本文将对 JSON 的语法、解析、序列化进行详细的说明,帮助大家掌握 JSON 的使用方式。 如果文中有不对、疑惑或者错字的地方,欢迎在评论区留言指正🌻 一、JSON简介 在 JSON 之前,XML 曾经一度成为互联网上传输数据的事实标…