1.语句块包含符
通常我们在代码中这样写:
if(条件判断)
{
//your code
}
“{..}”包含的就是语句块。而在mysql中这样写:
#标识符可省略,但必须首尾一致
[begin_label] begin
[statement_list]//这里业务逻辑代码
[end_label]end;
2. 流程控制
2.1 if
2.2 case
2.3 loop
2.4 while
2.5 repeat
2.6 leave
leave语句:语法:leave 标识符; 其作用是用来退出begin…end结构或其他具有标识符的结构。
3.变量
变量声明:declare 变量名 变量类型 [default 初始值];
declare score float default 99;
注意:其只能在begin…end这种复合语句结构中。
变量赋值:
语法1:set 变量名 = 表达式; #此语法中的变量必须先使用declare声明
语法2:set @变量名 = 表达式; #此方式可以无需declare语法声明,而是直接赋值
语法3:select @变量名 := 表达式;#此语句会给该变量赋值,同时还会作为一个select语句输出“结果集”。
语法4:select 表达式 into @变量名;#此语句虽然看起来是select语句,但其实并不输出“结果集”,而只是给变量赋值。
注意:上述语法中变量形式的区别:“@变量名”形式可以在非程序语句中使用,而使用declare声明的变量只能在程序语句中(比如begin ...end范围),且必须先声明(declare语法)才能赋值。
#declare声明的变量只能使用在begin...end语句块中
declare score float;
set score = 88;
set @a =5;
SELECT @a;
#赋值并且作为一个select结果集输出
SELECT @b := 1001;
#只给变量赋值
SELECT name INTO @myname from tab1 WHERE name = 'tom';
SELECT @myname;
语法2
语法3
语法4
4.函数
也叫存储函数,跟js或java 、php的函数类似。
注意事项:
1, 在函数内容,可以有各种变量和流程控制的使用;
2, 在函数内部,也可以有各种增删改语句;
3, 在函数内部,不可以有select或其他“返回结果集”的查询类语句;
CREATE TABLE t_fun3 (a INT, b INT, c INT) CHARSET = utf8;
#创建一个存储函数,带3个int参数。调用此存储函数,可以求出它们中的最大值。
CREATE FUNCTION fun3 ( a INT, b INT, c INT)
RETURNS INT
BEGIN
IF (a > b AND a > c) THEN
BEGIN
SET @a = a;
END;
ELSEIF (b > a AND b > c) THEN
BEGIN
SET @a = b;
END;
ELSE
BEGIN
SET @a = c;
END;
END IF;
RETURN @a;
END;
#调用存储函数求三个参数中的最大值
SELECT fun3(66,22,77);
删除函数:
drop function 函数名;
5.存储过程
存储过程,其本质还是函数——但其规定:不能有返回值;
说明:
1,in:用于设定该变量是用来“接收实参数据”的,即“传入”;默认不写,就是in
2,out:用于设定该变量是用来“存储存储过程中的数据”的,即“传出”,即函数中必须对他赋值;
3,inout:是in和out的结合,具有双向作用;
4,对于,out和inout设定,对应的实参,就“必须”是一个变量,因为该变量是用于“接收传出数据”;
CREATE TABLE t_pro3 (a INT, b INT, c INT) CHARSET = utf8;
#创建一个存储过程,带3个int参数。调用此存储过程,可以求出它们中的最大值
CREATE PROCEDURE pro3 (INOUT a INT, b INT, c INT)
BEGIN
IF (a > b AND a > c) THEN
BEGIN
SET a = a;
END;
ELSEIF (b > a AND b > c) THEN
BEGIN
SET a = b;
END;
ELSE
BEGIN
SET a = c;
END;
END IF;
END;
set @a = 56;
#调用存储过程
call pro3(@a,88,36);
SELECT @a;
create table t_pro(
id int,
slary float,
name varchar(10)
)CHARSET = utf8;
#1,创建一个存储过程,带3个参数,调用该存储过程,可以将此3个参数作为数据写入的某个表中。
create procedure pro1 (id int ,slary float ,name VARCHAR(10))
BEGIN
INSERT INTO t_pro(id,slary,name) VALUES (id,slary,name);
#存储过程,可以增删改查,select会以结果集返回
SELECT * from t_pro;
END;
CALL pro1(1,5000,'张三');
CALL pro1(2,6000,'李四');
删除存储过程:
drop procedure 存储过程名;
6.触发器
触发器,也是一段预先定义好的编程代码(跟存储过程和存储函数一样),但它不能调用,而是在某个表发生某个事件(增,删,改)的时候,会自动“触发”而调用起来。
定义形式:
create trigger 触发器名 触发时机 触发事件 on 表名 for each row as
begin
#your code
end;
说明:
1,触发时机,只有2个: before(在….之前), after(在….之后);
2,触发事件,只有3个:insert, update, delete
3,即其含义是:在某个表上进行insert(或update,或delete)之前(或之后),会去执行其中写好的代码(语句);即每个表只有6个情形会可能调用该触发器;
4,通常,触发器用于在对某个表进行增删改操作的时候,需要同时去做另外一件事情的情形;
5,在触发器的内部,有2个关键字代表某种特定的含义,可以用于获取有关数据:
new:它代表当前正要执行的insert或update的时候的“新行”数据;通过它,可以获取这一新行数据的任意一个字段的值,形式为:
set @v1 = new.id; //获得该新插入或update行的id字段的值(前提是有该id)
set @v2 = new.age; //同上;old:它代表当前正要执行的delete的时候的“旧行”数据,通过它,可以获取这一旧行数据的任意一个字段的值,形式为:
set @v1 = old.id; //获得该新插入或delete行的id字段的值(前提是有该id)
set @v2 = old.age; //同上;
CREATE table tri_one(
name VARCHAR(10),
age TINYINT
)CHARSET=utf8;
CREATE table tri_two(
name VARCHAR(10),
age TINYINT
)CHARSET=utf8;
#创建一个触发器,使某个表在插入数据的时候,同时可以在另一个相同结构的表中插入相同数据。
CREATE TRIGGER syn_add BEFORE INSERT on tri_one for each row
BEGIN
set @v1 = new.name;
set @v2 = new.age;
INSERT INTO tri_two (name,age) VALUES (@v1,@v2);
END;
#创建一个触发器,使某个表在删除数据的时候,同时可以在另一个相同结构的表中删除对应数据。
CREATE TRIGGER syn_delete AFTER DELETE on tri_one for each row
BEGIN
set @v1 = old.name;
set @v2 = old.age;
DELETE from tri_two WHERE name = @v1 AND age = @v2;
END;
删除触发器
drop trigger 触发器名