MySQL编程
基本语法形式
语句块模式
在mysql编程中,begin…end结构相当于原来编程语句中的{…}语法,但又有所区别,一个begin…end;块,可以给定一个标识符,并且可以使用leave语句来“退出”该语句块
xxx_label:标识符,可以省略,但如果在结构中需要退出,那就需要它,前后必须同名
[begin_label:] BEGIN
[statement_list]
END [end_label]
流程控制语句
- statement_list语句块可以用begin…end结构
if语句
if 条件语句 then
begin
statement_list
end;
elseif search_condition then
begin
statement_list
end;
else
begin
statement_list
end;
end if;
case语句
case case_value
when when_value then statement_list
...
else statement_list
end case
case
when search_condition then statement_list
...
else statement_list
end case
loop语句
while语句
[begin_label:] while search_condition do
statement_list
end while [end_label]
变量
变量声明
变量的声明只能在begin…end结构中
declare 变量名 变量类型 [default 初始值]
变量赋值
以下语法中变量形式的区别:
- “@变量名(会话变量)”形式可以在非程序语句中(如:命令环境)使用
- 不带“@”的变量名只能在程序语句中(比如begin…end范围)且需要先声明才能赋值
-
set 变量名 = 表达式; #变量需要先声明
-
set @变量名 = 表达式; 变量不需要声明,可直接赋值
-
select @变量名 := 表达式; 此语句会给该变量赋值,同时还会作为一个select语句输出“结果集”
-
select 表达式 into @变量名 此语句虽然看起来是select语句,但其实并不输出“结果集”,而只是给变量赋值
存储过程
什么是存储过程
相当于没有返回值的方法:只处理“事情”(包括增删改查等),不返回单个数据值(但可以得到select的查询结果)
存储过程的定义
create procedure 存储过程名([in|out|inout]形参1 类型1, in|out|inout]形参2 类型2, ...)
begin
# 函数代码
# 可以有增删改查,流程控制
# 其中查询语句(select)会作为存储过程调用的结果,跟执行select语句一样,返回结果集
end
其中
in、out、inout用于修饰一个形参的"数据流向":
in:只作为外部输入数据,调用环境传入存储过程内部,默认值
out:只作为输出数据,即存储过程传出到调用环境,调用的时候必须是一个变量
inout:具有双重意义
调用与删除
调用
call 存储过程名(实参1, 实参2, ...)
删除
drop procedure [if exists] 存储过程名
存储函数
- 注:delimiter $ # 将mysql中的结束标志;修改为$
什么是存储函数
相当于有返回值的方法:必须在完成一定的"操作"后返回单个数据值(一个具体数据或变量数据)
存储函数中不能有select语句–因为select语句会返回结果集,但存储函数只能返回"单个数据值"
存储函数的定义
create function 函数名(形参1 类型1, 形参2 类型2, ...)
return 返回类型
begin
# 函数代码
return xx值
end;
调用与删除
跟系统函数的调用形式一样,可用于select语句中,比如:
select now() as timenow,fun(1) as f;
删除
drop function [if exists] 存储函数名
触发器
什么是触发器
触发器就是在数据库中预先设定好的用于在某个表上发生某个事件(增/ 删 /改)的时候来完成某些任务的一种代码机制
现实中类似的离职就是银行金库的红外线扫描入侵报警器
触发器的创建
create trigger 触发器名 before(或after) insert(或update或delete) on 表名 for each row
begin
# 要执行的代码
# 不能使用select语句
end;
在触发器内部,其中有两个关键字具有特定含义和数据获取作用
new:代表新插入的一条数据,在insert事件的时候有效
old:代表旧的一条数据,在update或delete事件的时候有效
触发器的删除
drop trigger [if exists] 触发器名
mysql编程总结
-
两种环境 常规mysql命令环境:可以执行增删改查语句 编程环境:在特定的语句语法内部,即存储过程内、存储函数内、触发器内
-
两种变量 普通变量:不带@符号,直接写变量名,必须先声明后使用,只能用于编程环境 会话变量:带@符号,无需声明,直接使用,两种环境均可用
-
流程控制语句 只能用于编程环境
-
存储过程、存储函数、触发器共同点 可以使用普通变量 可以使用流程控制结构 本质都是一段存在数据库的代码
-
存储函数 需要返回一个数据值 不能有select语句 调用时直接作为一个“数据”来使用,即可以用于select或别的各种数据操作语句中
-
存储过程 不能反悔数据 可以有select语句 形参可以设定数据的进出方法:in、out、inout 调用是使用call语句
-
触发器 不能返回数据 不能有select语句 没有参数,也不能调用,而是在触发的情况下自动调用执行