mysql视图及存储过程
目录
mysql之视图
前言
理解:
视图语句
表用例-student
视图检查选项
举例:
注意:
视图的更新
视图的作用
mysql之存储过程
存储过程定义
存储过程的特性
关于存储过程的创建及删除和查看语句
dept表
创建简单存储过程
变量的声明和赋值
关于变量
局部变量
用户变量
into赋值
入参出参
入参
出参
流程控制
if判断
case分支
循环干预
loop循环
repeat循环
while循环
游标
handler句柄
mysql之视图
前言
含义:视图(view)是一种虚拟存在的表,视图中的数据并不在数据表中实际存在,行和列数据来自定义视图的查询中使用的表(基础表),并且在使用视图时动态生成的
理解:
- 视图只是保存了查询的sql逻辑,不保存查询的结果,所以我们在创建视图的时候,主要的工作就落在创建这条sql查询语句上
- 视图是一张虚拟存在的表,所以我们可以像操作表一样来操作视图
- 向视图中插入的数据会插入到基表当中
视图语句
创建视图:create [or replace] view 视图名[(列名列表)] as select语句 [检查选项];
查询视图:
- 查看创建视图语句:show create view 视图名;
- 查看视图数据:select 字段列表 from 视图名称 [where条件];
修改视图:
- 方式一:create or replace view 视图名称[(列名列表)] as select语句 [检查选项];
- 方式二:alter view 视图名[(列名列表)] as select语句 [检查选项];
删除视图:drop view [if exists] 视图名1,视图名2;
表用例-student
#创建视图
create or replace view student_v as select id,name from student where id<=3;#查询创建视图时执行的sql语句
show create view student_v;#查看视图数据
select * from student_v where id<3;#通过视图向表中插入数据
insert into student_v values(8,"程咬金");#修改视图
create or replace view student_v as select * from student where id<=3;
alter view student_v as select * from student where id<3;#删除视图
drop view if exists student_v;
视图检查选项
当使用with check option子句创建视图时,mysql会通过视图检查正在更改的每个行,例如插入,更新,删除,以使其符合视图的定义。mysql允许基于另一个视图创建视图,他还会检查依赖视图中的规则,以保持一致性。为了确定检查的范围,mysql提供了两个选项;cascaded和local,默认值为cascaded
举例:
此时没有检查选项,因此对这个v1视图进行增删改操作就不会检查后面的where条件,也就是说,你插了id>20的数据到基表里也可以,但是再查询视图,这个刚插入的数据在视图中不可见
如今我们又搞个视图,其基于v1,并且加了cascaded检查选项,所以在操作v2视图时他会检查插入等操作的数据是否会满足where后面的条件(这里的where条件是指自己v2后的where条件以及v1视图的where条件的交集不管v1有没有检查选项)满足则可以插入
注意:
- 被依赖的视图v2如果有cascaded/local的检查条件,那么依赖他的视图v3不管加不加检查选项在操作数据时都会遵循v2的条件
- 被依赖的视图v1如果没有检查选项,依赖他的视图v2有cascaded检查选项,那么在依赖他的视图v2中进行数据操作,不仅看v2的条件还需看v1条件是否满足
- 被依赖的视图v1如果没有检查选项,依赖他的视图v2有local检查选项,那么在依赖他的视图v2中进行数据操作,看v2的条件是否满足即可,不用管v1条件,若v1有检查条件,那么v2和v1的条件都应满足
视图的更新
要使视图更新,视图中的行与基础表中的行之间必须存在一对一的关系。如果视图包含以下任何一项,则该视图不可能更新
- 聚合函数或窗口函数
- distinct
- group by
- having
- union或union all
#创建视图
create or replace view student_a as select count(1) from student;#插入数据失败
insert into student_a values(20);
视图的作用
- 简单:视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使用户不必为以后的操作每次指定全部条件
- 安全:数据库可以授权,但不能授权到数据库的行和列上,通过视图用户只能查询和修改他们所能见到的视图数据
- 数据独立:视图可以帮助用户屏蔽真实表结构变化带来的影响(就是给视图select字段起别名)
mysql之存储过程
存储过程定义
存储过程是数据库中的一个重要对象,其可以封装sql语句集,可以用来完成一些较为复杂的业务逻辑并且可以入参出参类似于java中方法的书写。(创建时会先编译后保存,用户后续调用不需要再次编译)
存储过程的特性
- 有输入输出参数,可以声明变量,有if/else/case/while等控制语句,通过编写存储过程可以实现更复杂的逻辑功能
- 函数的普通特性:模块化、封装、代码复用
- 速度快,只有首次执行需要经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤
关于存储过程的创建及删除和查看语句
创建存储过程:
删除存储过程:drop procedure 存储过程名称;
查看存储过程信息:show create procedure 存储过程名称;
注意:存储过程名称不带()
dept表
创建简单存储过程
#定义结束符$表示执行到$结束(当然,结束符可以任意)
DELIMITER $
#创建存储过程
CREATE PROCEDURE hello_produce()
BEGIN
#返回的结果为select后面的变量(当然可以为多个,多个用逗号隔开)
SELECT dname,loc FROM dept;
END $
DELIMITER ;
#调用存储过程
CALL hello_produce();
变量的声明和赋值
关于变量
- 存储过程的变量是有作用域的,作用域在begin和end之间
- 需要在多个begin和end块之间传值则可以在一层块内使用局部变量
- 传参变量是全局的,可以在多个块内起作用
局部变量
DELIMITER $
CREATE PROCEDURE var01()
BEGIN
#声明varchar类型的变量为li
DECLARE li VARCHAR(32) DEFAULT "lili";
#为声明的变量赋值
SET li="lila";
#查询该变量
SELECT li;
END $
DELIMITER ;
#调用存储过程
CALL var01();
用户变量
(用户自定义,当前会话【连接】有效,类比java成员变量)
局部变量需要声明方可使用,全局变量不需要声明即可使用
DELIMITER $
CREATE PROCEDURE var02()
BEGIN
#全局变量直接赋值
SET @nickname="cjc";
END $
DELIMITER ;
CALL var02();
SELECT @nickname;
into赋值
DELIMITER $
CREATE PROCEDURE var03()
BEGIN
#将查询到的值赋给用户变量@deprnum(这样的select得不到返回数据)
SELECT deptno INTO @deptnum FROM dept WHERE deptno=2;
END $
DELIMITER ;
CALL var03();
#查询用户变量@deprnum
SELECT @deptnum;
入参出参
语法:in(入参)/out(出参)/inout(可作为出/入参) 参数名 参数类型
入参
DELIMITER $
CREATE PROCEDURE param01(IN nickname VARCHAR(32))
BEGIN
#用用户变量接受入参
SET @nkname=nickname;
END $
DELIMITER ;
CALL param01("hello");
#查询用户变量@nkname
SELECT @nkname;
出参
DELIMITER $
CREATE PROCEDURE input(IN loc VARCHAR(23),INOUT deptno INT)
BEGIN
SELECT dept.`deptno` INTO @deptno FROM dept WHERE dept.`loc`=loc;
END $
DELIMITER ;
CALL input("一区",@deptno);
SELECT @deptno;
流程控制
if判断
DELIMITER $
CREATE PROCEDURE iftest(IN deptno INT)
BEGIN
IF (deptno=1) THEN SELECT "1";
ELSEIF (deptno=2) THEN SELECT "2";
ELSE SELECT "3";
END IF;
END $
DELIMITER ;
CALL iftest(3);
case分支
#1
DELIMITER $
CREATE PROCEDURE casetest(IN deptno INT)
BEGIN
CASE deptno
WHEN 1 THEN SELECT "1";
WHEN 2 THEN SELECT "2";
ELSE SELECT "3";
END CASE;
END $
DELIMITER ;
CALL casetest(2);#2
DELIMITER $
CREATE PROCEDURE casetest(IN deptno INT)
BEGIN
CASE
WHEN deptno=1 THEN SELECT "1";
WHEN deptno=2 THEN SELECT "2";
ELSE SELECT "3";
END CASE;
END $
DELIMITER ;
CALL casetest(2);
循环干预
退出与继续循环(与java的比较)
- leave label —— break
- iterate label —— continue
loop循环
loop是死循环,需要手动退出循环,我们可以使用leave来退出循环
DELIMITER $
CREATE PROCEDURE looptest()
BEGIN
DECLARE age VARCHAR(32) DEFAULT 1;
num_loop:LOOP
SELECT age;
IF age>=10
THEN LEAVE num_loop;
END IF;
SET age=age+1;
END LOOP num_loop;
END $
DELIMITER ;
CALL looptest();
repeat循环
DELIMITER //
CREATE PROCEDURE repeat01()
BEGIN
DECLARE a INT DEFAULT 1;
repeat_01:REPEAT
SELECT a;
SET a=a+1;
UNTIL a>=10
END REPEAT repeat_01;
END //
DELIMITER ;
CALL repeat01();
while循环
DELIMITER //
CREATE PROCEDURE while01()
BEGIN
DECLARE b INT DEFAULT 1;
while01:WHILE b<=10
DO SELECT b;
SET b=b+1;
END WHILE while01;
END //
DELIMITER ;
CALL while01();
游标
用游标得到某一个结果集,逐行处理数据。
DELIMITER //
CREATE PROCEDURE fetch01(IN l VARCHAR(32))
BEGIN
DECLARE a INT;
DECLARE b VARCHAR(32);
#声明游标cursor_name用来承接结果集
DECLARE cursor_name CURSOR FOR
SELECT deptno,dname FROM dept WHERE loc=l;
OPEN cursor_name;
#取出结果集(有2个属性deptno,dname)分别用a,b承接
#每次fetch只能取出一行数据
FETCH cursor_name INTO a,b;
SELECT a,b;
FETCH cursor_name INTO a,b;
SELECT a,b;
CLOSE cursor_name;
END //
DELIMITER ;
CALL fetch01("二区");
handler句柄
注意:在语法中变量声明,游标声明,handler声明是有先后顺序的,否则创建存储过程出错
DELIMITER //
CREATE PROCEDURE fetch01(IN l VARCHAR(32))
BEGIN
DECLARE a INT;
DECLARE b VARCHAR(32);
#声明flag默认为true
DECLARE flag BOOLEAN DEFAULT TRUE;
DECLARE cursor_name CURSOR FOR
SELECT deptno,dname FROM dept WHERE loc=l;
#hander句柄——当出现1329异常时会执行后面语句,声明句柄应在游标语法之后
#这里面的continue是执行后面语句后继续往下走的意思,如果执行完语句退出,则continue换为exit
DECLARE CONTINUE HANDLER FOR 1329 SET flag=FALSE;
OPEN cursor_name;
loop01:LOOP
FETCH cursor_name INTO a,b;
IF flag THEN SELECT a,b;
ELSE LEAVE loop01;
END IF;
END LOOP loop01;
CLOSE cursor_name;
END //
DELIMITER ;
CALL fetch01("二区");
mysql视图及存储过程相关推荐
- MySQL视图触发器存储过程内外链接数据锁
MySQL视图触发器存储过程内外链接数据锁 视图 什么是视图 是一个虚拟表,其内容由查询定义.同真实的一样,视图包含一系列带有名称的列和行数据 视图有什么用 视图的作用就是缓存数据,可以这么理解,我把 ...
- mysql存储过程结构体_八、mysql视图、存储过程、函数以及时间调度器
1.create or replace view emp_view as select * fromt4 ;给t4表创建一个名为emp_view的视图2.drop viewemp_view 删除视图= ...
- mysql 视图触发器,MySql视图触发器存储过程详解
一个临时表被反复使用的时候,对这个临时表起一个别名,方便以后使用,就可以创建一个视图,别名就是视图的名称.视图只是一个虚拟的表,其中的数据是动态的从物理表中读出来的,所以物理表的变更回改变视图. 创建 ...
- mysql 视图调用存储过程_MySQL视图、存储过程
在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 什么是视图(视图) 虚拟表 内容类似于真实表,有字段和记录 该视图不以数据库中存储的数据的形式存在 行和列的数据来自 ...
- 7.1 MySQL视图和存储过程
第一章(1)创建视图 小结 就是创建虚拟表,自动化一些重复性的查询模块,简化各种复杂操作(包括复杂的子查询和连接等) 注意视图虽然可以像一张表一样进行各种操作,但并没有真正储存数据,数据仍然储存在原始 ...
- mysql 视图 事务 存储过程 触发器 __ 邓治安
视图 View 逻辑上的虚拟表 #创建视图 CREATE VIEW s_t(编号,姓名,性别,出生日期) AS SELECT * FROM student WITH CHECK OPTION#查询视图 ...
- mysql 视图 事务 存储过程 触发器——龙腾
视图 View 逻辑上的虚拟表 #创建视图 CREATE VIEW s_t(编号,姓名,性别,出生日期) AS SELECT * FROM student WITH CHECK OPTION#查询视图 ...
- mysql 视图调用存储过程,是否可以在视图中调用存储过程?
A similar question about sql-server has been asked here. I'm wondering if its possible in MySql. edi ...
- MySQL关于事务控制、视图、存储过程和函数
TCL语言:事务控制语言 MySQL不同的存储引擎对事务的支持不同,MySQL默认的存储引擎InnoDB支持事务. 事务的ACID属性: 原子性:事务是不可分割的工作单位,要么都发生,要么都不发生. ...
最新文章
- flask中使用Flask-SQLALCHEMY-------一个简单的例子
- python 微服务 etcd_架构之微服务(etcd)
- Redis缓存击穿和缓存雪崩、缓存穿透以及对应的解决方案
- 华为的冬天(来自网路)---任正非
- 前端学习(3350):数组方法的运用和数值join
- Qt creator5.7 OpenCV249之形态学处理(含源码下载)
- 报告称相比南方 数字化平台对北方小微商家助力作用更大
- NASM汇编语言与计算机系统05-以大写16进制在屏幕显示内存中的值(shr/shl/jb)
- ArcGIS 查看运行结果
- flask html 得到文本框 input的内容_Python的Web框架Flask + Vue 生成漂亮的词云
- 关于预编译和宏定义部分说明
- 免费开源网站系统有哪些
- 计算机图形学:DDA(数值微分)画线法
- python中的random模块_如何运用PYTHON里的random模块
- UL 2271-2018 标准轻型电动车用锂电池 最新发行中文、英文版,ANSI/CAN/ULC/UL 2271-2018
- 《生命》第五集:Birds (鸟类)
- mysql数据库击穿_缓存穿透、击穿、雪崩区别和解决方案
- web学习笔记-html-html新增
- 申请https证书的过程
- 分享 | CADD之分子动力学的简介(上篇)
热门文章
- [转载]微软雅黑体使用于WORD中,行距过大的解决办法!
- 通信行业名词术语解释
- 关于重写toString方法
- 成功安装ubuntu16.04+cuda9.0+cuDNN7.0.5+caffe+digits(附错误汇总)
- 【安装】CentOS7 安装NodeJS详细教程
- “声音”背后的原理(3):音频信号处理的基础概念和流程小结
- python 创建excel,操作excel,保存excel,修改excel,删除sheet页
- 服务器开发和服务器应用开发_将无服务器应用程序视为“集合”并进行开发
- “免费”容器存储及备份恢复方案
- 空间向量与三维坐标轴XYZ三个夹角余弦的平方和等于1