SQL基础--存储过程

在机器语言中,有一个概念叫“过程”procedure,和“函数”function

过程:封装了若干条语句,调用时,这些封装体执行,过程是没有返回值的函数
函数:函数是一个有返回值的过程
存储过程是可以编程的,意味着可以使用变量,表达式,控制结构来完成复杂的功能
我们把若干条sql封装起来,起个名字—过程
把此过程存储在数据库中—存储过程

  • 存储过程的创建语法
create procedure procedureName()
begin
    --- sql 语句;
end$
  • 查看已有的存储过程
SHOW PROCEDURE STATUS
  • 调用存储过程
CALL PROCEDURE ()

常用控制语句及示例

  • 存储过程中用declare来声明变量
    格式 declare 变量名 变量类型 (default 默认值)
delimiter $
create procedure pr1()
begin
    declare age int default 18;
    declare height int default 180;
    select concat('age:', age, ', ', 'height:', height);
end$

call pr1()

输出 :age:18, height:180

  • 运算,控制
    存储过程中,变量可以在sql语句中合法的运算,如+ - * /
    注意的是,运算的结果,如何赋值给变量
    变量名 :# expression
delimiter $
create procedure pr2()
begin
    declare age int default 18;
    set age := age + 20;
    select concat('20年后age: ', age);
end$

call pr2()

输出 :20年后age: 38

  • if/else控制结构
    if condition then
    statement
    else
    end
delimiter $
create procedure pr3()
begin
    declare age int default 18;
    if age >= 18 then
        select '已成年';
    else
        select '未成年';
    end if;
end$

call pr3()

输出 : 已成年

  • 给存储过程传参
    存储过程的括号里可以声明参数,语法是[in/out/inout] 参数名 参数类型
delimiter $
create procedure pr4(width int,  hight int)
begin
    select concat('你的面积是:', width * hight) as area;

    if width > hight then
        select '你挺胖';
    elseif width < hight then
        select '你挺瘦';
    else
        select '你还挺方的';
    end if;
end$ 

call pr4(1, 2)

输出 :
结果1 : 你的面积是:4
结果2 : 你还挺方的

控制结构
顺序,选择,循环

  • while

    求n-m的和

delimiter $
create procedure pr5(n int, m int)
begin
    declare total int default 0;
    while n <= m do
    set total := total + n;
    set n := n + 1;
    end while;
		select total;
end$

call pr5(1, 4)

输出 :10

  • case
delimiter $
create procedure pr6()
begin
    declare pos int default 0;
    set pos := floor(4*rand());
    case pos
        when 1 then select 'hello';
        when 2 then select 'hi';
        when 3 then select 'good by';
        else select 'I dont know';
    end case;
end$

call pr6()

输出 : hi

  • repeat
delimiter $
create procedure pr7(i int, max int)
begin
    declare total int default 0;
    repeat
    set total := total + i;
    set i := i+1;
    until i > max end repeat;
    
    select total;
end$

call pr7(2, 5)

输出 : 14

  • 参数类型[in/out/inout]
    in 参数是输入类型,可以接收到我们的参数
    out 参数是输出类型
    可变参数 inout

    老板赚了50000给员工开工资钱数及其剩余

delimiter $
create procedure pr8(in employeNum int, in salary int, out expend int, inout residue int)
begin
    set expend := employeNum * salary;
		set residue := residue - expend;
end$

set @residue := '50000';
call pr8(5, 6000, @expend, @residue);
select @expend;
select @residue;

输出 : @expend :30000, @residue : 20000

用户变量 : @var_name

@expend 类似的变量是一个用户变量,可以先在客户端中定义并且保存值然后在以后引用它;这样可以将值从一个语句传递到另一个语句。用户变量与连接有关。也就是说,一个客户端定义的变量不能被其它客户端看到或使用。当客户端退出时,该客户端连接的所有变量将自动释放。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值