MySQL进阶篇之视图/存储过程/触发器
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL进阶篇之视图/存储过程/触发器相关的知识,希望对你有一定的参考价值。
今天我们主要来快速学习视图,存储过程,触发器四个方面的内容,一起加油学习吧,还有半年就有秋招了,要加快速度了,迫在眉睫,冲吧,兄弟们。
目录
1、视图
视图是虚拟的表,并不保存数据,只保存相应的SQL逻辑,不保存查询结果。
下面看一下视图的几种基本操作,分别为创建视图,查询视图,修改视图,删除视图。
视图检查选项:cascaded,在创建视图的时候可以对视图添加检测选项,当对视图执行插入等操作,会进行检查,不满足要求的禁止插入视图,防止视图失效。通过cascaded选项,可以进行检查。
视图的更新:要保证视图中的行与基本表中的行是一一对应关系,否则是不允许更新的。也不允许插入。如果使用了聚合函数,分组,去重等关键字。
下面看一下视图的主要作用,首先就是使用简单,可以把经常使用的复杂操作定义为视图,用户不必为后面的每次操作都指定条件;还有就是安全,数据库授权是到特定的表,而通过视图可以授权到相应的行和列。数据独立,可以根据基础的变化进行修改。
2、存储过程
存储过程:存在数据库中SQL语句的集合,减少数据在数据库和服务器之间的传输,提高处理性能,就是对SQL语句的封装和重用。
存储过程特点:实现了SQL的封装和复用,可以传参和返回数据,减少数据传输,提升性能。
下面看一下存储过程的创建和调用,存储过程的创建和调用如下:
下面看一下存储过程的查看和删除,查看存储过程有两种方式,第一种是查看数据的所有存储过程,查询某个存储过程的定义,如下:
注意:在创建存储过程的SQL时,需要通过delimeter指定SQL语句的结束符。
我们在看一下数据库存储过程中涉及的变量,比如系统变量,mysql服务器提供的,分为全局变量和会话变量。可以查看系统变量,也可以设置系统变量。
用户自定义变量,不需要声明,直接用@变量名使用就可以,可以用set方式设置变量,可以select方式查询和设置变量,可以将查询结果赋值给变量。
局部变量的作用范围在begin和end之间,下面创建一个存储过程,定义一个局部变量,将查询的结果赋值给stu_count变量名,最后查询该变量,通过call调用存储过程。
下面看一个if条件判断,语法规则就是if 满足就then,END IF结束if
之前存储过程都是没有传参,可以通过参数进行传参,和其它的编程语言的函数很像。in指定输入参数,out指定输出参数,inout指定既可以是输入又可以是输出的参数。
下面的传入的是score,返回的数据是result,直接定义就可以,用call调用即可。
下面的score既作为输出,又作为输出,如下所示,用inout定义。
下面再看存储过程中的case语法,case语法有两种基本的语法结构。本质上都是when的条件满足就执行then,最后用END CASE结束。
下面用第2种语法结构去判断传入的月份属于哪一个季度,具体如下:
再看存储过程的循环语句,while语句,这个也是很基础的,和其它编程语言差不多。
下面是用while实现从1累加到n的实现过程,具体如下:
再看第二种循环repeat,满足条件退出循环,和while刚好相反,如下:从n一直加到1,循环累加。当n小于等于退出循环。
我们再看一下Loop循环,使用leave退出循环,iterate用来跳过当前循环,直接进入下一次循环。
我们使用loop循环进行从1到n的累加,具体如下,需要使用leave退出循环,如下:
游标cursor:
游标也是一个面试可能问到的内容,游标是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。
一般需要先声明游标存储的结果集,然后打开游标,并循环获取游标中的记录,并执行相应的插入等操作,最后关闭游标,不过需要判断当游标中满足条件的记录都被取出后,需要结束循环。
可以使用条件处理程序Handler定义相应的处理步骤,比如:游标中数据取完了后退出循环。
3、存储函数
存储函数就是有返回值的存储过程,是必须有返回。其实存储函数完全可以背存储 过程替代,所以用的很少。
4、触发器
触发器是和表有关的数据库对象,是指在执行相应的数据操纵之前或之后,触发并执行触发器中的SQL语句集合,比如执行:日志操作,数据校验等,这样可以在数据库端保证数据的完整性。
使用old和new来引用触发器中发生变化的内容,与其它数据库类似。
行级触发器,影响多少行触发多少次,语句级触发器,不管影响多少行,只出发一次。现在的触发器仅支持行级触发器。
触发器语法:创建触发器,可以指定在执行何种操作之前或者之后触发,针对那张表的触发,可以查看和删除触发器。
先看一个需求,要求使用触发器将tb_user表变更的日志记录到user_logs表中。
我们看一下insert触发器,创建一个在tb_user表中插入数据之后,执行触发器,触发内容为向日志表user_logs中插入相应的字段进行记录。
c
我们看一下update触发器,在更新之后进行触发,并向日志表中记录插入更新之前的数据和更新之后的数据,old获取更新之前的数据,new获取更新之后的数据。触发器都是行级触发器,影响多少行,触发器就触发多少次。
我们再看一下delete触发器,在delete之后进行触发,记录删除前的数据,并插入到日志表中。
5、小结
视图->存储过程->存储函数->触发器。
以上是关于MySQL进阶篇之视图/存储过程/触发器的主要内容,如果未能解决你的问题,请参考以下文章