MySOL视图、储存过程、储存函数、触发器

 视图 

介绍

        视图(view)是一个虚拟表,非真实存在,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用视图名称即可获取结果集,并可以将其当作表来使用。

        数据库中只存放了视图的定义,而并没有存放视图中的数据。这些数据存放在原来的表中。

        使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。

        可以简化代码,可以把重复使用的查询封装成视图重复使用,同时可以使复杂的查询易于理解和使用。

        更加安全,如果一张表中有很多数据,很多信息不希望让所有人看到,此时可以使用视图视,如:社会保险基金表, 可以用视图只显示姓名、地址,而不显示社会保险号和工资数等,可以对不同的用户,设定不同的视图。

创建视图

格式

MySOL视图、储存过程、储存函数、触发器_第1张图片

参数说明

  1.  algorithm:可选项,表示视图选择的算法。
  2.  vie_name:表示要创建的视图名称。
  3.  column_ list:可选项,指定视图中各个属性的名词,默认情况下与SELECT语句中的查询的属性相同。
  4. select_ statement:表示一个完整的查询语句,将查询记录导入视图中。
  5.  [with [cascaded | local] check option]:可选项,表示更新视图时要保证在该视图的权限范围之内。

        可以用show full tables查看表与视图,会显示类型。直接用show tables时表与视图也都会显示但是不会显示类型。

修改视图

        修改视图是指修改数据库中已存在的表的定义。当基本表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致。MySQL中通过CREATE OR REPLACE VIEW语句和ALTER VIEW语句来修改视图。

格式:

更新视图

        某些视图是可更新的。也就是说,可以在UPDATE、DELETE或INSERT等语句中使用它们, 以更新基表的内容。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。如果视图包含下述结构中的任何一种,那么它就是不可更新的:

  1. 聚合函数(SUM(), MIN(), MAX(), COUNT()等)
  2. DISTINCT
  3. GROUP BY
  4. HAVING
  5. UNION或UNION ALL
  6. 位于选择列表中的子查询
  7. JOIN
  8. FROM子句中的不可更新视图
  9. WHERE子句中的子查询,引用FROM子句中的表。
  10. 仅引用文字值(在该情况下,没有要更新的基本表)

        视图中虽然可以更新数据,但是有很多的限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,就可能会造成数据更新失败。

删除视图

重命名视图

        删除视图时,只能删除视图的定义,不会删除数据。

 

储存过程

概述

介绍

  •  MySQL 5.0版本开始支持存储过程。
  • 简单的说,存储过程就是一组SQL语句集, 功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;
  • 存储过就是数据库SQL语言层面的代码封装与重用。

特性

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

格式

MySOL视图、储存过程、储存函数、触发器_第2张图片

 在调用时用 call 储存名 ();

变量定义

局部变量

格式

        用户自定义,在begin/end块中有效

赋值

        MySQL中可以用SET为变量赋值,还可以使用SELECT ... INTO语句为变量赋值。

案例

MySOL视图、储存过程、储存函数、触发器_第3张图片

MySOL视图、储存过程、储存函数、触发器_第4张图片

用户变量

格式

        用户自定义,当前会话(连接)有效。类比java的成员变量

案例

MySOL视图、储存过程、储存函数、触发器_第5张图片

系统变量

  • 系统变量又分为全局变量与会话变量
  • 全局变量在MYSQL启动的时候由服务器自动将它们初始化为默认值,这些默认值可以通过更改my.ini这个文件来更改。
  • 会话变量在每次建立一个新的连接的时候,由MYSQL来 初始化。MYSQL会 将当前所有全局变量的值复制一份。来做为会话变量。
  • 如果在建立会话以后,没有手动更改过会话变量与全局变量的值,那所有这些变量的值都是一样的。
  • 全局变量与会话变量的区别就在于,对全局变量的修改会影响到整个服务器,但是对会话变量的修改,只会影响到当前的会话(也就是当前的数据库连接)。
  • 有些系统变量的值是可以利用语句来动态进行更改的,但是有些系统变量的值却是只读的,对于那些可以更改的系统变量,我们可以利用set语句进行更改。

全局变量 

        由系统提供,在整个数据库有效。 

格式

操作

MySOL视图、储存过程、储存函数、触发器_第6张图片

会话变量

        由系统提供,当前会话(连接)有效

格式

操作

MySOL视图、储存过程、储存函数、触发器_第7张图片

参数传递

in

        in 表示传入的参数,可以传入数值或者变量,即使传入变量,并不会更改变量的值可以内部更改,仅仅作用在函数范围内。

MySOL视图、储存过程、储存函数、触发器_第8张图片

out

        out表示从存储过程内部传值给调用者

MySOL视图、储存过程、储存函数、触发器_第9张图片

inout

        inout表示从外部传入的参数经过修改后可以返回的变量,既可以使用传入变量的值也可以修改变量的值( 即使函数执行完)

MySOL视图、储存过程、储存函数、触发器_第10张图片

流程控制

判断

if

        IF语句包含多个条件判断,根据结果为TRUE、FALSE执行语句,与编程语言中的if、else if、else语法类似,其语法格式如下:

MySOL视图、储存过程、储存函数、触发器_第11张图片

case

        CASE是另一个条件判断的语句,类似于编程语言中的switch语法

MySOL视图、储存过程、储存函数、触发器_第12张图片

循环

        循环有while、repeat、loop三种。循环是一段在程序中只出现一次,但可能会连续运行多次的代码。循环中的代码会运行特定的次数,或者是运行到特定条件成立时结束循环。

        循环控制:leave 类似于break,跳出;iterate类似于continue,继续,结束本次循环,继续下一次。

while

repeat

loop

MySOL视图、储存过程、储存函数、触发器_第13张图片

        标签可省略

 其它操作

游标

        游标(cursor)是用来存储查询结果集的数据类型,在存储过程和函数中可以使用光标对结果集进行循环的处理。光标的使用包括光标的声明、OPEN、FETCH 和CLOSE。

MySOL视图、储存过程、储存函数、触发器_第14张图片

异常处理

 异常处理-HANDLER句柄

        MySq|存储过程也提供了对异常处理的功能:通过定义HANDLER来完成异常声明的实现.

        官方文档: https://dev.mysql.com/doc/refman/5.7/en/declare-handler.html

格式

MySOL视图、储存过程、储存函数、触发器_第15张图片

         handler_action 是异常发生后要怎么做,condition_value是触发的条件,statement是要额外执行的代码

特别注意:

        在语法中,变量声明、游标声明、handler声明是必须按照先后顺序书写的,否则创建存储过程出错。

 储存函数

 创建函数需要设置创建函数权限

        set global log_ bin_trust_function_ creators = TRUE; 

格式 

         在MySQL中,创建存储函数使用create function关键字,其基本形式如下:

MySOL视图、储存过程、储存函数、触发器_第16张图片

参数说明:

  1. func_name:存储函数的名称。
  2. param_name type:可选项,指定存储函数的参数。type参数用于指定存储函数的参数类型,该类型可以是MySQL数据库中所有支持的类型。
  3. RETURNS type:指定返回值的类型。
  4. characteristic:可选项,指定存储函数的特性。
  5. routine_ body:SQL代码内容。

 在调用时用 select func_name();

触发器

概述

 简介

  • 触发器,就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段,但是触发器无需调用,当对数据库表中的数据执行DML操作时自动触发这个SQL片段的执行,无需手动条用。
  • 在MySQL中,只有执行insert,delete,update操作时才能触发触发器的执行
  • 触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。
  • 使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。

特性

  1. 触发条件:I(insert)、D(delete)、U(update)
  2. 触发时间:在增删改前或者后
  3. 触发频率:针对每一行执行
  4. 触发器定义在表上,附着在表上

格式

1.创建只有一个执行语句的触发器

2.创建有多个执行语句的触发器

        触发事件有insert、delete、update三种

NEW与OLD

格式 

MySQL中定义了NEW和OLD,用来表示触发器的所在表中,触发了触发器的那--行数据,来引用触发器中发生变化的记录内容。

触发器类型 触发器类型NEW和OLD的使用
INSERT型触发器 NEW表示将要或者已经新增的数据
UPDATE型触发器 OLD表示修改之前的数据,NEW表示将要或已经修改后的数据
DELETE型触发器 OLD表示将要或者已经删除的数据

使用方法

        NEW.columnName  (columnName为相应数据表某一-列名)

其它操作

查看

删除

注意事项

  1. MYSQL中触发器中不能对本表进行insert,update,delete操作,以免递归循环触发。
  2. 尽量少使用触发器,假设触发器触发每次执行1s,insert table 500条数据,那么就需要触发500次触发器,光是触发器执行的时间就花费了500s,而insert 500条数据一共是1s,那么这个insert的效率就非常低了。
  3. 触发器是针对每一行的;对增删改非常频繁的表上切记不要使用触发器,因为它会非常消耗资源。

你可能感兴趣的:(MySQLNotes,mysql)