【10】mysql编程

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;

#创建一个存储函数,带3int参数。调用此存储函数,可以求出它们中的最大值。
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 触发器名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值