目录

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);

视图的作用

  1. 简单:视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使用户不必为以后的操作每次指定全部条件
  2. 安全:数据库可以授权,但不能授权到数据库的行和列上,通过视图用户只能查询和修改他们所能见到的视图数据
  3. 数据独立:视图可以帮助用户屏蔽真实表结构变化带来的影响(就是给视图select字段起别名)

mysql之存储过程

存储过程定义

存储过程是数据库中的一个重要对象,其可以封装sql语句集,可以用来完成一些较为复杂的业务逻辑并且可以入参出参类似于java中方法的书写。(创建时会先编译后保存,用户后续调用不需要再次编译)

存储过程的特性

  1. 有输入输出参数,可以声明变量,有if/else/case/while等控制语句,通过编写存储过程可以实现更复杂的逻辑功能
  2. 函数的普通特性:模块化、封装、代码复用
  3. 速度快,只有首次执行需要经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤

关于存储过程的创建及删除和查看语句

创建存储过程:

删除存储过程:drop procedure 存储过程名称;

查看存储过程信息:show create procedure 存储过程名称;

注意:存储过程名称不带()

dept表

创建简单存储过程

#定义结束符$表示执行到$结束(当然,结束符可以任意)
DELIMITER $
#创建存储过程
CREATE PROCEDURE hello_produce()
BEGIN
#返回的结果为select后面的变量(当然可以为多个,多个用逗号隔开)
SELECT dname,loc FROM dept;
END $
DELIMITER ;
#调用存储过程
CALL hello_produce();

变量的声明和赋值

关于变量

  1. 存储过程的变量是有作用域的,作用域在begin和end之间
  2. 需要在多个begin和end块之间传值则可以在一层块内使用局部变量
  3. 传参变量是全局的,可以在多个块内起作用

局部变量

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视图及存储过程相关推荐

  1. MySQL视图触发器存储过程内外链接数据锁

    MySQL视图触发器存储过程内外链接数据锁 视图 什么是视图 是一个虚拟表,其内容由查询定义.同真实的一样,视图包含一系列带有名称的列和行数据 视图有什么用 视图的作用就是缓存数据,可以这么理解,我把 ...

  2. mysql存储过程结构体_八、mysql视图、存储过程、函数以及时间调度器

    1.create or replace view emp_view as select * fromt4 ;给t4表创建一个名为emp_view的视图2.drop viewemp_view 删除视图= ...

  3. mysql 视图触发器,MySql视图触发器存储过程详解

    一个临时表被反复使用的时候,对这个临时表起一个别名,方便以后使用,就可以创建一个视图,别名就是视图的名称.视图只是一个虚拟的表,其中的数据是动态的从物理表中读出来的,所以物理表的变更回改变视图. 创建 ...

  4. mysql 视图调用存储过程_MySQL视图、存储过程

    在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 什么是视图(视图) 虚拟表 内容类似于真实表,有字段和记录 该视图不以数据库中存储的数据的形式存在 行和列的数据来自 ...

  5. 7.1 MySQL视图和存储过程

    第一章(1)创建视图 小结 就是创建虚拟表,自动化一些重复性的查询模块,简化各种复杂操作(包括复杂的子查询和连接等) 注意视图虽然可以像一张表一样进行各种操作,但并没有真正储存数据,数据仍然储存在原始 ...

  6. mysql 视图 事务 存储过程 触发器 __ 邓治安

    视图 View 逻辑上的虚拟表 #创建视图 CREATE VIEW s_t(编号,姓名,性别,出生日期) AS SELECT * FROM student WITH CHECK OPTION#查询视图 ...

  7. mysql 视图 事务 存储过程 触发器——龙腾

    视图 View 逻辑上的虚拟表 #创建视图 CREATE VIEW s_t(编号,姓名,性别,出生日期) AS SELECT * FROM student WITH CHECK OPTION#查询视图 ...

  8. mysql 视图调用存储过程,是否可以在视图中调用存储过程?

    A similar question about sql-server has been asked here. I'm wondering if its possible in MySql. edi ...

  9. MySQL关于事务控制、视图、存储过程和函数

    TCL语言:事务控制语言 MySQL不同的存储引擎对事务的支持不同,MySQL默认的存储引擎InnoDB支持事务. 事务的ACID属性: 原子性:事务是不可分割的工作单位,要么都发生,要么都不发生. ...

最新文章

  1. flask中使用Flask-SQLALCHEMY-------一个简单的例子
  2. python 微服务 etcd_架构之微服务(etcd)
  3. Redis缓存击穿和缓存雪崩、缓存穿透以及对应的解决方案
  4. 华为的冬天(来自网路)---任正非
  5. 前端学习(3350):数组方法的运用和数值join
  6. Qt creator5.7 OpenCV249之形态学处理(含源码下载)
  7. 报告称相比南方 数字化平台对北方小微商家助力作用更大
  8. NASM汇编语言与计算机系统05-以大写16进制在屏幕显示内存中的值(shr/shl/jb)
  9. ArcGIS 查看运行结果
  10. flask html 得到文本框 input的内容_Python的Web框架Flask + Vue 生成漂亮的词云
  11. 关于预编译和宏定义部分说明
  12. 免费开源网站系统有哪些
  13. 计算机图形学:DDA(数值微分)画线法
  14. python中的random模块_如何运用PYTHON里的random模块
  15. UL 2271-2018 标准轻型电动车用锂电池 最新发行中文、英文版,ANSI/CAN/ULC/UL 2271-2018
  16. 《生命》第五集:Birds (鸟类)
  17. mysql数据库击穿_缓存穿透、击穿、雪崩区别和解决方案
  18. web学习笔记-html-html新增
  19. 申请https证书的过程
  20. 分享 | CADD之分子动力学的简介(上篇)

热门文章

  1. [转载]微软雅黑体使用于WORD中,行距过大的解决办法!
  2. 通信行业名词术语解释
  3. 关于重写toString方法
  4. 成功安装ubuntu16.04+cuda9.0+cuDNN7.0.5+caffe+digits(附错误汇总)
  5. 【安装】CentOS7 安装NodeJS详细教程
  6. “声音”背后的原理(3):音频信号处理的基础概念和流程小结
  7. python 创建excel,操作excel,保存excel,修改excel,删除sheet页
  8. 服务器开发和服务器应用开发_将无服务器应用程序视为“集合”并进行开发
  9. “免费”容器存储及备份恢复方案
  10. 空间向量与三维坐标轴XYZ三个夹角余弦的平方和等于1