zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

5. MySQL编程基础

2023-06-13 09:12:28 时间

⽤户⾃定义变量

⽤户⾃定义变量分为⽤户会话变量(以@开头)以及局部变量(不以@开头)。

⽤户会话变量

MySQL客户机1定义了会话变量,会话期间,该会话变量⼀直有效;MySQL客户机2不能访问ySQL客户 机1定义的会话变量;MySQL客户机1关闭或者MySQL客户机1与服务器断开连接后,MySQL客户机1定 义的所有会话变量将⾃动释放,以便节省MySQL服务器的内存空间。 定义变量

set @user_variable1=expression1 select @user_variable1:=expression1 select expression1 into @user_variable1 查看变量

select @user_variable1 赋值

set @student_count = (select count(*) from student); select @student_count := (select count(*) from student); select @student_count:= count(*) from student; select count(*) into @student_count from student; 使⽤变量

select * from student where student_no=@student_no;

局部变量

定义变量

declare variable type; 局部变量与⽤户会话变量的区别

  • ⽤户会话变量名以“@”开头,⽽局部变量名前⾯没有“@”符号。
  • 局部变量使⽤declare命令定义(存储过程参数、函数参数除外),定义时必须指定局部变量的数 据类型。局部变量定义后,才可以使⽤set命令或者select语句为其赋值。⽤户会话变量使⽤set命 令或者select语句定义并进⾏赋值,定义⽤户会话变量时⽆需指定数据类型(⽤户会话变量是弱类 型)。
  • ⽤户会话变量的作⽤范围与⽣存周期⼤于局部变量。局部变量如果作为存储过程或者函数的参数使⽤,则在整个存储过程或函数内中有效;如果定义在存储程序的 begin-end语句块中,则仅在当前的begin-end语句块内有效。⽤户会话变量在本次会话期间⼀直有效,直⾄关闭服务器连接。
  • 如果局部变量嵌⼊到SQL语句中,由于局部变量名前没有“@”符号,这就要求局部变量名不能与表字段名同名,否则将出现⽆法预期的结果。

运算符与表达式

算术运算符

+(加)、−(减)、*(乘)、/(除)、%(求余)div(求商)

⽐较运算符

=、>、<、>=、 <=、 <>、 is null、between…and…、 in like、regexp

逻辑运算符

not(!) 、and(&&)、 or(||)、 xor

begin-end语句块

相当于java语⾔中的{、} begin-end语句块中,end后以“;”结束。

在每⼀个begin-end语句块中声明的局部变量,仅在当前的begin-end语句块内有效。 允许在⼀个begin-end语句块内使⽤leave语句跳出该语句块(leave语句的使⽤⽅法稍后讲解)。

重置命令结束标记

delimiter $$

例:

delimiter $$ select * from student where student_name = 'A'$$ delimiter ; select * from student where student_name = 'A'; ⾃定义函数

创建⾃定义函数的语法格式

create function函数名(参数1,参数2,…)returns返回值的数据类型    begin     [函数选项]     函数体;     return语句; end;

  • ⾃定义函数是数据库的对象,因此,创建⾃定义函数时,需要指定该⾃定义函数⾪属于哪个数据 库。
  • 同⼀个数据库内,⾃定义函数名不能与已有的函数名(包括系统函数名)重名。建议在⾃定义函数名中统⼀添加前缀“fn”或者后缀“fn”。
  • 函数的参数⽆需使⽤declare命令定义,但它仍然是局部变量,且必须提供参数的数据类型。⾃定 义函数如果没有参数,则使⽤空参数“()”即可。
  • 函数必须指定返回值数据类型,且须与return语句中的返回值的数据类型相近(⻓度可以不同)。

函数选项:

contains sql:表示函数体中不包含读或写数据的语句(例如set命令等)。 no sql:表示函数体 中不包含SQL语句。 reads sql data:表示函数体中包含select查询语句,但不包含更新语句。 modifies sql data:表示函数体包含更新语句。 如果上述选项没有明确指定,默认是contains sql。 例如下⾯的函数实现的功能是为查询结果集添加⾏号:

delimiter $$ create function row_no_fn() returns int no sql begin set @row_no = @row_no + 1; return @row_no; end; $$ delimiter ;

使⽤该函数:

set @row_no=0; select row_no_fn()⾏号,name from student;

下⾯的例⼦实现根据学⽣的学号id查询学⽣的name

delimiter $$ create function get_name_fn(new_id int) returns char(20) reads sql data begin declare student_name char(20); select name into student_name from student where id=new_id; return student_name1; end; $$ delimiter ;

使⽤:

select get_name_fn('2012001');

函数的维护

查看函数

show function status; show function status like XXX;

删除函数

drop function 函数名;

条件控制语句

If(条件表达式1) then 语句块1; [elseif条件表达式2 then语句块2] ... [else语句块n] end if; case 表达式 when value1 then语句块1; when value2 then语句块2; when value3 then语句块3; else语句块n; end case;

循环语句

[循环标签:]while 条件表达式 do 循环体; end while [循环标签]; leave语句(跳出当前循环,相当于java语⾔中的break):

leave 循环标签;

iterate语句(跳出当前循环,继⽽进⾏下次循环。相当于java语⾔中的continue):

iterate 循环标 repeat语句

当条件表达式的值为false时,反复执⾏循环,直到条件表达式的值为true

[循环标签:]repeat 循环体; until条件表达式 end repeat [循环标签];

系统函数

mysql提供了所有常⻅函数,⽐如三⻆函数、字符串处理函数、⽇期处理函数、类型转换函数 等,需要时请⾃⾏查询