mysql存储过程

视图

创建视图
create or replace view 视图名 as sql语句
查看视图
show tables;
show create view 视图名;
删除视图
drop view if exists 视图名;

存储过程

创建存储过程
delimiter $   --  修改结束符
create procedure 名称(args)
begin
   sql语句;
end $
delimiter ;
调用存储过程
call 名称();
查看存储过程
show procedure status;
删除存储过程
drop procedure if exists 名称; 

存储过程语法

变量声明[默认值]
declare 变量名 变量类型 [default value]   
  • 例1
declare num int default 10
赋值
set 变量名 = 值   (可以四则运算)    set num = num + 10
select count(*) into num from 表名   (into :将count(*) 赋值给 num)
判断if
delimiter $
create procedure if_test()
begin
    declare s int default 100;
    declare res varchar(40);
    if s >= 90 then
        set res = '优秀';
    elseif s >= 80 and s < 90
        set res = '不错';
    else 
        set res = '一般';
    end if;
    set concat('你考的',res);  --  拼接输出
end$
delimiter ;
传递参数 in:输入参数 out:输出参数 inout:既可以是输入参数也可以是输出参数
create procedure procedure_name([in/out/inout] 参数名 参数类型)
begin

end
  • 例1
delimiter $
create procedure if_test(in s int)
begin
    declare res varchar(40);
    if s >= 90 then
        set res = '优秀';
    elseif s >= 80 and s < 90
        set res = '不错';
    else 
        set res = '一般';
    end if;
    set concat('你考的',res);  --  拼接输出
end$
delimiter ;

call if_test(100);
  • 例2
delimiter $
create procedure if_test(in s int, out res varchar(50))
begin
    if s >= 90 then
        set res = '优秀';
    elseif s >= 80 and s < 90
        set res = '不错';
    else 
        set res = '一般';
    end if;
    set concat('你考的',res);  --  拼接输出
end$
delimiter ;

call if_test(100, @res);   --  @变量名 声明会话变量
select @res;  --  查询会话变量
case命令 end case
case [case_value]
    when [when_value]/表达式 then sql语句
    when [when_value]/表达式 then sql语句
    else sql语句
end case;
  • 例1 当colume 与condition 条件相等时结果为result
case colume 
    when condition then 1
    when 2 then 2
    else 3
end case;
  • 例2
declare num int;
declare res int;
case 
    when num > 0 then
        res = 1;
    when num < 0 then
        res = -1;
    else 
        res = 0;
end case;
  • 例3一般用法
select 
case 字段名
    when 1 then 1
    when 2 then 2
    else 3 
    end  
from 表名;
while 用法
while num <= n
    sql语句;
end while;
  • 例1
declare total int default 0;
declare num int default 1;
while num <= 10 
 set total = total + num;
 set mun = num + 1;
end while;
repeat 循环语句,满足条件退出循环
repeat 
    sql语句;
    until 条件
end repeat;
  • 例1
declare total int default 0;
declare num int default 100;
repeat 
set total = total + num;
set mun = num - 1;
until num = 0
end while;
[loop别名]loop 循环 end loop leave[loop别名]: 退出循环
loop
    sql语句;
end loop;
  • 例1:
declare total int default 0;
declare num int default 100;
loop_name: loop
    set total = total + num;
    set mun = num - 1;
    if mun < 0 then
        leave loop_name;
    end if;
end loop;
curesor游标,光标:用来存储查询结果集的存储类型
声明游标
declare curesor_name curesor for sql语句;
open 开启游标
open curesor_name;
fetch 指针遍历赋值 游标
fetch curesor_name into 自定义变量名;
close 关闭游标
close curesor_name;
  • 例1
delimiter $
create procedure curesor_test()
begin
    declare c_id int;
    declare c_name varchar(50);
    declare has_data int default 1;
    declare curesor_name curesor for select id, name from user;
    declare exit handler for not fount set has_data = 0;   --  声明退出条件,写在定义游标之后
    open curesor_name;
    loop_name:loop
        if has_data = 0 then
            leave loop_name;
        end if;
        fetch curesor_name into c_id, c_name;
        select concat('c_id:', id, 'name:', c_name);
    end loop;
    close curesor_name;
end $
delimiter ;

存储函数

创建
create function fun(username varchar(50))
returns int
begin
    declare num int;
    select count(*) into num from t_user where username = username;
    return num;
end;

select fun('11111');

触发器:在增删改之前或之后执行(insert触发器(new);update触发器(old,new);delete触发器(old))

创建触发器
create trigger trigger_name
before/after/ insert/update/delete
on 表名
[for each row] -- 行级触发器
begin
    sql语句;
end;
  • 例1:对t_user添加新增后日志:t_user表新增会自动执行 new.id 指t_user表中的id
delimiter $
create trigger insert_test
after insert
on t_user
for each row
begin
    insert into t_userlog(id, option_id, option_des) values (null, new.id, concat('插入后', new.id,'内容', new.username) );

end $
delimiter ;
  • 例2:对t_user添加更新前日志:更新t_user表会自动执行 old.id 指t_user表中的id
delimiter $
create trigger insert_test
after insert
on t_user
for each row
begin
    insert into t_userlog(id, option_id, option_des) values (null, old.id, concat('修改前', old.id,'内容', old.username) );
end $
delimiter ;
查看触发器
show triggers \G;
删除触发器
drop trigger trigger_name
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355