MySQL进阶篇之视图/存储过程/触发器

今天我们主要来快速学习视图,存储过程,触发器四个方面的内容,一起加油学习吧,还有半年就有秋招了,要加快速度了,迫在眉睫,冲吧,兄弟们。

目录

1、视图

 2、存储过程

 3、存储函数

 4、触发器

5、小结


1、视图

视图是虚拟的表,并不保存数据,只保存相应的SQL逻辑,不保存查询结果。

MySQL进阶篇之视图/存储过程/触发器_第1张图片

下面看一下视图的几种基本操作,分别为创建视图,查询视图,修改视图,删除视图。

MySQL进阶篇之视图/存储过程/触发器_第2张图片

视图检查选项:cascaded,在创建视图的时候可以对视图添加检测选项,当对视图执行插入等操作,会进行检查,不满足要求的禁止插入视图,防止视图失效。通过cascaded选项,可以进行检查。

MySQL进阶篇之视图/存储过程/触发器_第3张图片

视图的更新:要保证视图中的行与基本表中的行是一一对应关系,否则是不允许更新的。也不允许插入。如果使用了聚合函数,分组,去重等关键字。

MySQL进阶篇之视图/存储过程/触发器_第4张图片

下面看一下视图的主要作用,首先就是使用简单,可以把经常使用的复杂操作定义为视图,用户不必为后面的每次操作都指定条件;还有就是安全,数据库授权是到特定的表,而通过视图可以授权到相应的行和列。数据独立,可以根据基础的变化进行修改。

MySQL进阶篇之视图/存储过程/触发器_第5张图片

 2、存储过程

存储过程:存在数据库中SQL语句的集合,减少数据在数据库和服务器之间的传输,提高处理性能,就是对SQL语句的封装和重用。
MySQL进阶篇之视图/存储过程/触发器_第6张图片 

存储过程特点:实现了SQL的封装和复用,可以传参和返回数据,减少数据传输,提升性能。

MySQL进阶篇之视图/存储过程/触发器_第7张图片

下面看一下存储过程的创建和调用,存储过程的创建和调用如下:

MySQL进阶篇之视图/存储过程/触发器_第8张图片下面看一下存储过程的查看和删除,查看存储过程有两种方式,第一种是查看数据的所有存储过程,查询某个存储过程的定义,如下:MySQL进阶篇之视图/存储过程/触发器_第9张图片

 注意:在创建存储过程的SQL时,需要通过delimeter指定SQL语句的结束符。

我们在看一下数据库存储过程中涉及的变量,比如系统变量,MySQL服务器提供的,分为全局变量和会话变量。可以查看系统变量,也可以设置系统变量。

MySQL进阶篇之视图/存储过程/触发器_第10张图片

用户自定义变量,不需要声明,直接用@变量名使用就可以,可以用set方式设置变量,可以select方式查询和设置变量,可以将查询结果赋值给变量。

MySQL进阶篇之视图/存储过程/触发器_第11张图片

局部变量的作用范围在begin和end之间,下面创建一个存储过程,定义一个局部变量,将查询的结果赋值给stu_count变量名,最后查询该变量,通过call调用存储过程。

MySQL进阶篇之视图/存储过程/触发器_第12张图片

MySQL进阶篇之视图/存储过程/触发器_第13张图片

下面看一个if条件判断,语法规则就是if 满足就then,END IF结束if

MySQL进阶篇之视图/存储过程/触发器_第14张图片

之前存储过程都是没有传参,可以通过参数进行传参,和其它的编程语言的函数很像。in指定输入参数,out指定输出参数,inout指定既可以是输入又可以是输出的参数。

MySQL进阶篇之视图/存储过程/触发器_第15张图片

下面的传入的是score,返回的数据是result,直接定义就可以,用call调用即可。MySQL进阶篇之视图/存储过程/触发器_第16张图片

 下面的score既作为输出,又作为输出,如下所示,用inout定义。

MySQL进阶篇之视图/存储过程/触发器_第17张图片

下面再看存储过程中的case语法,case语法有两种基本的语法结构。本质上都是when的条件满足就执行then,最后用END CASE结束。

MySQL进阶篇之视图/存储过程/触发器_第18张图片

下面用第2种语法结构去判断传入的月份属于哪一个季度,具体如下:

MySQL进阶篇之视图/存储过程/触发器_第19张图片

再看存储过程的循环语句,while语句,这个也是很基础的,和其它编程语言差不多。

MySQL进阶篇之视图/存储过程/触发器_第20张图片

下面是用while实现从1累加到n的实现过程,具体如下:

MySQL进阶篇之视图/存储过程/触发器_第21张图片

再看第二种循环repeat,满足条件退出循环,和while刚好相反,如下:从n一直加到1,循环累加。当n小于等于退出循环。

MySQL进阶篇之视图/存储过程/触发器_第22张图片

 我们再看一下Loop循环,使用leave退出循环,iterate用来跳过当前循环,直接进入下一次循环。

MySQL进阶篇之视图/存储过程/触发器_第23张图片

我们使用loop循环进行从1到n的累加,具体如下,需要使用leave退出循环,如下:

MySQL进阶篇之视图/存储过程/触发器_第24张图片

 游标cursor:

游标也是一个面试可能问到的内容,游标是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。

一般需要先声明游标存储的结果集,然后打开游标,并循环获取游标中的记录,并执行相应的插入等操作,最后关闭游标,不过需要判断当游标中满足条件的记录都被取出后,需要结束循环。

MySQL进阶篇之视图/存储过程/触发器_第25张图片

 可以使用条件处理程序Handler定义相应的处理步骤,比如:游标中数据取完了后退出循环。

MySQL进阶篇之视图/存储过程/触发器_第26张图片

 3、存储函数

存储函数就是有返回值的存储过程,是必须有返回。其实存储函数完全可以背存储 过程替代,所以用的很少。

MySQL进阶篇之视图/存储过程/触发器_第27张图片

 4、触发器

触发器是和表有关的数据库对象,是指在执行相应的数据操纵之前或之后,触发并执行触发器中的SQL语句集合,比如执行:日志操作,数据校验等,这样可以在数据库端保证数据的完整性。

使用old和new来引用触发器中发生变化的内容,与其它数据库类似。

行级触发器,影响多少行触发多少次,语句级触发器,不管影响多少行,只出发一次。现在的触发器仅支持行级触发器。

MySQL进阶篇之视图/存储过程/触发器_第28张图片触发器语法:创建触发器,可以指定在执行何种操作之前或者之后触发,针对那张表的触发,可以查看和删除触发器。

MySQL进阶篇之视图/存储过程/触发器_第29张图片

 先看一个需求,要求使用触发器将tb_user表变更的日志记录到user_logs表中。

MySQL进阶篇之视图/存储过程/触发器_第30张图片

我们看一下insert触发器,创建一个在tb_user表中插入数据之后,执行触发器,触发内容为向日志表user_logs中插入相应的字段进行记录。

cMySQL进阶篇之视图/存储过程/触发器_第31张图片

我们看一下update触发器,在更新之后进行触发,并向日志表中记录插入更新之前的数据和更新之后的数据,old获取更新之前的数据,new获取更新之后的数据。触发器都是行级触发器,影响多少行,触发器就触发多少次。

MySQL进阶篇之视图/存储过程/触发器_第32张图片

 我们再看一下delete触发器,在delete之后进行触发,记录删除前的数据,并插入到日志表中。

MySQL进阶篇之视图/存储过程/触发器_第33张图片

 

5、小结

视图->存储过程->存储函数->触发器。

MySQL进阶篇之视图/存储过程/触发器_第34张图片

你可能感兴趣的:(MySQL数据库,数据库)