第九章:第25节 MySQL基础篇——MySQL编程

更新于:2017-08-06 15:19:19

MySQL也是一门编程语言,它也可以编写程序、定义函数……


感兴趣的朋友可以往下看,东西很多的,楠神直接摘抄别人写的。本节内容后期我们也都用不到,对我们来说最有用的就是MySQL的几个内置函数(这几个内置函数可以去《MySQL核心知识纲要》查看)。


基本语法形式

语句块模式:


2013_03_26_01.jpg

mysql编程中,begin....end;基本代替了原来编程语句中的{...}语法。

但又有所区别:

一个bigin...end;块,可以给定一个“标识符”,并且可以使用leave语句来“退出”该语句块。

基本流程控制语句:

if语句:

1.png

case语句:(类似php中的switch)

2013_03_26_01.jpg

while循环语句:

2013_03_26_01.jpg


mysql中的变量

变量它有一定的使用场景限制(其实包括前面的流程控制语句也这样):

在通常的执行各种createinsertdeleteupdateselect等语句的“环境”中,并不使用常规变量,也不能使用流程控制语句。

其实,这些语句只能在编程环境中用——通常的增删改查,可以称为命令环境。

编程环境:存储函数中,存储过程中,触发器中

普通变量的声明语法:

declare 变量名 变量类型 [default 初始值]

变量的赋值语法:


set 变量名 = 变量值

mysql还有一种变量形式,可以称为“会话变量”

会话变量的形式为:  @变量名;

会话变量无需单独声明,而是直接赋值就可以,类似php

会话变量的赋值:  set  变量名 = 值;

会话变量可以在普通命令行环境中或编程环境中使用。


语法1:set 变量名 = 表达式;#此语法中的变量必须先使用declare声明

1.png


语法2:set @变量名 = 表达式; #此方式可以无需declare语法声明,而是直接赋值,类似php定义变量并赋值。

1.png

语法3:select @变量名 := 表达式;#此语句会给该变量赋值,同时还会作为一个select语句输出“结果集”。

1.png

语法4:select 表达式 into @变量名;#此语句虽然看起来是select语句,但其实并不输出“结果集”,而只是给变量赋值。

1.png

1.png

当然,也可以进行运算:

1.png


稍微总结一下:

有两种环境;

常规mysql命令环境,可以执行:增删改查。。。

编程环境:其实就是在特定的语句语法内部:存储过程内,存储函数内,触发器内。

两种变量:

普通变量:不带@符,直接写名字,必须先声明,后使用(赋值之类),只能用于编程环境

会话变量:带@符,无需声明,直接使用(先赋值),可以用于2种环境。

流程控制语句: 只能用于编程环境

存储函数

定义形式:

2013_03_26_01.jpg

调用形式:

跟系统函数的调用形式一样,直接使用名字,并带括号,以及根据需要带实参。

比如:

select  3, now(), f1(); //f1为自定义的存储函数。

select  3, now(), f2(3, abc,  @v1); //3个实参,其中@v1是一个前面赋值了的变量。

 

举例:

先得改变语句结束符:

1.png

1.png

1.png

1.png

删除:drop function [if exists] 存储函数名

存储过程

存储过程就是一个没有返回值数据值的“函数”。

虽然存储过程不返回单个数据值,但可以“返回”结果集——这里的返回起始就是select语句的正常结果表现。

 

定义形式:

1.png


其中,

inoutinout用于修饰一个形参的“数据流向”:

in:只作为外部输入数据,调用环境传入存储过程内部,默认值。

out:只作为输出数据,即存储过程传出到调用环境。

inout:具有双重。

存储过程调用形式:

call  存储过程名(实参1,实参2.....);

 

举例:

1.png

1.png

1.png

注:

实际,在php中,其实是这样:

$sql = call   pro1(8, 'dd') ”;

mysql_query( $sql );

1.png

删除:drop procedure [if exists] 存储过程名

触发器

什么叫触发器:

就是mysql中的一种“一触即发”的机器(机制)。

其实只是预先定义好的一段代码。该段代码无需人工调用,而是会在‘预计’好的某个情形下自动执行。

通常就这几个情形:

对某个数据表的增(或删或改)之前(或之后)。 //每个表可见只有6种情形。

 

触发器内部也跟存储过程或存储函数一样,属于“编程环境”。

 

定义形式:

create  trigger  触发器名字  before(或after)  insert(或updatedelete)  on  表名 for  each  row

begin

要执行的代码,语句块,编程环境,但这里也不能使用select语句。

end

1.png

在触发器内部,其中有两个关键字具有特定含义和数据获取作用:

new:代表新插入的一条数据,在insert事件的时候有效。

old:代表旧的一条数据,在updatedelete的时候有效。

 

3个编程总结:

共同点:

可以使用普通变量;

可以使用流程控制结构;

他们其实都是“一段代码”而已,存储在数据库中。

存储函数:

需要返回一个数据值;

不能有select语句;

调用时直接当作一个“数据”来使用,即可以用于select或别的各种数据操作语句中。

存储过程:

不能返回数据

可以有select语句;

形参可以设定为数据的进出方向:inoutinout

调用是使用call语句。

触发器:

不能返回数据;

也不能有select语句;

也没有参数,也不能调用,而是在触发的情况下自动调用(执行)。