数据库篇(3)—数据库函数、存储过程和触发器

                                  数据库函数、存储过程和触发器

-----------------------------------------------------------------------------------------------------------------------------------------------

1、函数

(1)系统函数和自定义函数

<1>系统函数:系统自带的函数,可以实现查询语句中的某些要求,比如select avg(Age) from students;,这里avg()就是系统函数

<2>自定义函数:保存在mysql.proc中

创建自定义函数

CREATE FUNCTION function_name(

PARAMETER_NAME type,[PARAMETER_NAME type]...)

RETURNS {STRING|INTERGER|REAL}

runtime_body

注意:参数PARAMETER_NAME type可以有多个,也可以没有参数;必须有且只有一个返回值,返回的是{字符串|整数|实数}

(2)相关SQL语句

查看函数列表:

SHOW FUNCTION STATUS;

查看函数定义

SHOW CREATE FUNCTION function_name

删除UDF:

DROP FUNCTION function_name

调用自定义函数语法:

SELECT function_name(parameter_value,...)

(3)自定义函数示例

image.png

(4)为变量赋值

<1>SET parameter_name= value[,parameter_name= value...]

<2>SELECT INTO parameter_name,比如说

DECLARE x int;

SELECT COUNT(id) FROM tdb_nameINTO x;

RETURN x;

注意:函数调用只能在SQL语句中被select调用,不能单独使用

2、存储过程

存储过程保存在mysql.proc中

(1)创建语句

    CREATE PROCEDURE sp_name([ proc_parameter[,proc_parameter ...]])

    routime_body

    其中:proc_parameter: [IN|OUT|INOUT] parameter_nametype

    其中IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出;param_name表示参数名称;type表示参数的类型

(2)相关SQL语句

查看存储过程列表

SHOW PROCEDURE STATUS

查看存储过程定义

SHOW CREATE PROCEDURE sp_name

调用存储过程:

CALL sp_name([ proc_parameter[,proc_parameter...]])

CALL sp_name

说明:当无参时,可以省略"()",当有参数时,不可省略"()”

存储过程修改:

ALTER语句修改存储过程只能修改存储过程的注释等无关紧要的东西,不能修改存储过程体,所以要修改存储过程,方法就是删除重建

删除存储过程:

DROP PROCEDURE sp_name

(3)存储过程示例

无参数存储过程

image.png

有参数存储过程

image.png

有参数存储过程包含IN和OUY

image.png

(4)存储过程优势:

<1>存储过程把经常使用的SQL语句或业务逻辑封装起来,预编译保存在数据库中,当需要时从数据库中直接调用,省去了编译的过程

<2>提高了运行速度

<3>同时降低网络数据传输量

(5)存储过程与自定义函数的区别:

<1>存储过程实现的过程要复杂一些,而函数的针对性较强

<2>存储过程可以有多个返回值,而自定义函数只有一个返回值

<3>存储过程一般独立的来执行,而函数往往是作为其他SQL语句的一部分来使用

注意:用call调用存储过程

(6)流程控制:

存储过程和函数中可以使用流程控制来控制语句的执行

IF:用来进行条件判断。根据是否满足条件,执行不同语句

CASE:用来进行条件判断,可实现比IF语句更复杂的条件判断

LOOP:重复执行特定的语句,实现一个简单的循环

LEAVE:用于跳出循环控制

ITERATE:跳出本次循环,然后直接进入下一次循环

REPEAT:有条件控制的循环语句。当满足特定条件时,就会跳出循环语句

WHILE:有条件控制的循环语句

附:1+2+...+100=?中间代码

SET @i= 0;

SET @sum = 0;

REPEAT SET @sum = @sum+@i; SET @i= @i+ 1;

UNTIL @i> n END REPEAT;

需要注意的是,无论函数还是自定义过程中,定义完参数之后,在编写参数功能之前,中间有一个BEGIN表明开始,结尾也都有一个END

3、触发器

触发器的执行不是由程序调用或者手动启动的,而是由事件来触发、激活从而实现执行

(1)创建语句

CREATE

[DEFINER = { user | CURRENT_USER }]

TRIGGER trigger_name

trigger_time trigger_event

ON tbl_name FOR EACH ROW

trigger_body

说明:

    trigger_name:触发器的名称

    trigger_time:{ BEFORE | AFTER },表示在事件之前或之后触发

    trigger_event::{ INSERT |UPDATE | DELETE },触发的具体事件

    tbl_name:该触发器作用在表名

(2)触发器示例

image.png

(3)相关SQL语句

<1>查看触发器

SHOW TRIGGERS

查询系统表information_schema.triggers的方式指定查询条件,查看指定的触发器信息。

进入数据库后:

mysql> USE information_schema;

Database changed

mysql> SELECT * FROM triggers WHERE trigger_name='trigger_student_count_insert';

<2>删除触发器

DROP TRIGGER trigger_name;

猜你喜欢

转载自blog.51cto.com/13873498/2298101