当前位置: 首页 > article >正文

什么是数据库中的流程控制

目录

流程控制的基本概念

一、顺序结构:

1、begin...end 嵌套

二、局部变量的定义和使用

1、局部变量的定义

2、变量的赋值

3、数据库变量

1、局部变量

2、局部变量的赋值和使用

3、用户变量

4、会话变量和全局变量

三、选择结构:

if 分支选择结构

case多分支结构

while循环结构

loop循环结构:

repeat循环

跳转语句


流程控制的基本概念


数据库中的流程控制也就相当于C语言中的控制语句,其中又分为顺序结构选择结构循环结构三种。


C语言中的控制结构:
顺序结构:(....)
选择结构:if()...else.....、switch()....case....
循环结构:for()、while()、do....while()
#在数据库中、流程控制通常与存储过程和函数配合使用

一、顺序结构:


mysql woekbench中sql语句的执行顺序:从上往下,从左至右顺序执行SQL语句。
顺序结构中复合语句的关键字:begin....end;


-- begin.....end 相当于C语言中的大括号(....).
C语言中的{}可以嵌套,如{{}}。
同理,begin end 也是可以嵌套的。
每一个begin end相当于一个复合语句(语句块)

1、begin...end 嵌套

例如:
Begin 
    declare x int;#定义了一个Int类型的变量x
    set x = 10; #给变量x设置值为10
    begin
        declare y int; #定义了一个Int类型的变量y
        set y =x; 将x的值赋给y
        select x;select y;
    end
    select x;
end

复合语句(语句块):begin....end
    -- 相当于c/c++中的{....}

begin 
    select "abc";
    select 123;
    -- insert
    begin
        -- select
        -- delete
    end;
end//
delimiter;
-- sql 语句中的流程控制语句只能在存储过程、函数等数据库对象中使用,全局下无法使用

二、局部变量的定义和使用


1、局部变量的定义


声明定义关键字:declare
设置初始值关键字:default
基本格式:declare 变量名 数据类型[default 初始值]
例如:declare a int default 0;
#定义了一个变量a ,初始化赋值为0


2、变量的赋值


set 变量名 = 变量值;
局部变量的生命周期:当前复合语句,局部范围有效
局部变量的作用域:其定义的复合语句中,只能在begin....end中使用。


3、数据库变量


1、局部变量


 

-- 局部变量的定义和初始化
-- 定义局部变量的基本格式
declare 变量名 数据类型[default 初始值];

2、局部变量的赋值和使用


 

-- 变量的赋值:
set 变量名 = 变量值;
--局部变量就是局部范围内有效的变量,不能在全局下定义和使用
--局部变量只能在复合语句begin...end中使用
delimiter //
begin
declare n int default 10;
set n=100;
declare m varchar(20);
set m ="abcdefg";
declare x date default now();
end//
delimiter ;

3、用户变量

-- 用户变量的生命周期;当前连接
-- 用户变量的作用域:当前连接有效,默认为Null值。
-- 用户变量的定义和使用:
set@变量名 = 变量值;
例如:
set @x =10;
set @y =20;
set @sum =@x+@y;
select @x;
select @sum;

-- 用户变量
    -- 基本格式:@变量名
    -- 变量的赋值:set @变量名 = 变量值;
    -- 用户变量的作用域和生命周期为当前连接,是当前连接有效的变量,相当于C/C++中的全局变量
    -- 用户变量不需要定义,也不需要给定数据类型,默认值为null
    -- 用户变量是一种弱类型的变量,万用类型,给它赋值什么类型它就存储什么类型
    -- 当前连接:使用用户名和密码登陆数据库服务,称为一次连接
    -- 重新连接或重新登陆会建立一个新的连接,新链接不共享用户变量
set @a = 100;
select @a;
select @b;
set @a = "abc";
select @a;
set @a = 123.456;
select @a;


4、会话变量和全局变量

会话变量:

系统自带的,是用来保存数据库当前会话的默认数据,当前连接有效,
重新连接会恢复默认值,一般格式;@@会话变量名

查看会话变量:

show session variables;

-- 会话变量session
    -- 基本格式:@@会话变量名
    -- 会话变量无法人为定义
    -- 会话变量是数据库系统自带的,用于保存数据库当前连接的默认设置选项,重新连接后还原
    
-- 查看当前连接的会话变量
show session variables;

全局变量:


系统自带的,是用来保存数据库当前服务的默认数据,当前服务有效,重启服务后恢复默认值,一般格式:@@全局变量名


 

查看全局变量:
show global variables;

-- 全局变量global
-- 基本格式:@@全局变量名
-- 全局变量无法人为定义
-- 全局变量是数据库系统自带的,用于保存数据库当前服务的默认设置选项,重启服务后还原

 查看当前服务的全局变量
show session variables;

三、选择结构:


if 分支选择结构

1、if语句的基本格式:
if<判断条件> then <语句> end if;
(注意结束If需要用end if)

2、if else 语句的基本格式
if<判断条件> then <语句1> else <语句2;> end if;

3、if else嵌套的基本格式:
if<判断条件> then<语句;>else if<判断条件2> then<语句2;>
[elseif...then...;] [else语句n;]end if;


 

-- if 分支
例如:求两个数中的最大值
delimiter//
create procedure maxs(in x float,in y float)
begin
    if x>y then select x;
    elseif x<y then select y ;
    else select"相等";
    end if;
end//
delimiter ;
call maxs(11,22);
call maxs(123,99);
call maxs(10,10);

case多分支结构

基本格式:
case 条件值
    when 值1 then 语句1;
    when 值2 then 语句2;
    ....
    when 值n then 语句n;
    else 语句n+1;#相当于default
end case;
相当于C语言中的switch case 语句。
-- case 多分支结构
-- 例如:给成绩(0到100)评定等级(优秀,良好,及格,不及格)
delimiter//
create procedure scores(in score float)
begin
    case score div 10
        when 9 then select"优秀" as "成绩等级";
        when 8 then select"优秀" as "成绩等级";
        when 7 then select"良好" as "成绩等级";
        else select"不及格" as "成绩等级";
end//
delimiter ;
call scores(100);
call scores(98);
select 95/10; -- 整数除整数,如果不能整除结果为小数
select 95 div 10; -- div为整除符号
select floor(95/10) -- floor 为取整函数
-- sql语言中的流程控制语句都要以对应的end 语句结束

while循环结构


在c语言中有三种循环结构:for 、where和do where。
那么在sql语言中也有相应的语句。

 

while....do 循环结构
while循环基本格式:
    while条件表达式
    do 循环体语句;
    end while;
#数据库中的while循环和C语言中的while一样
1、while...do 循环
-- 例如:循环求整数1到100的和
delimiter//
create procedure SUM1(out sums float) -- out :传出类型参数
begin 
    declare sum int default 0;
    declare i int default 1;
    while i<=100
    do
        set sum = sum+i;
        set i = i+1;
    end while;
    -- select sum;
    set sums =sum;
end//
delimiter;

call SUM1(@sum);-- 使用用户变量来接收传出类型参数的值

loop循环结构:


1、loop循环结构:
    loop 循环体语句;
    end loop ;
    #注意:这里的loop循环是一个无限循环,其没有结束条件,所以需要手动添加结束条件。
2、给loop循环添加结束条件
    循环别名:loop 循环体语句;
    if 条件表达式 then leave 循环别名; end if;
    end loop;
#这里给循环取别名,通过if语句判断结束条件,leave离开跳出循环(相当于C语言中的break).

-- loop 循环
例如:求整数1到n的和(n通过参数传递)
delimiter//
create procedure SUM2(in n int ,out sums float) -- Out:传出类型参数
begin
        declare sum int default 0;
        declare i int default 1;
        S:loop -- S:给loop循环取一个别名为S
            set sum = sum +i;
            set i =i +1;
            if i>n then leave S; -- 条件为真则离开循环(leave 相当于C/C ++中的break)
            end if;
        end loop;
        set sums = sum;
end//
delimite ;


repeat循环结构基本格式:
repeat 循环体语句;
until 条件表达式
end repeat ;

#注意:repeat循环相当于C语言中的do while 循环,都是先执行一次循环体再进行条件判断,但是不同的###是,do while循环是条件不满足时才结束循环,而repeat是条件满足时才结束循环,并且until子句后不能有分号;

repeat循环


 

-- 例如:求整数n到m的和
delimiter//
create procedure SUM3(inout n int ,out int m int ) -- inOut:即可传入又可传出类型参数
begin
        declare sum int default 0;
        declare i int default ;
        repeat
            set sum = sum +i;
            set i =i +1;
            until i>m end repeat; -- 直到满足条件时才会结束循环
            set n = sum;
end//
delimiter ;

跳转语句


1、leave
跳出并结束整个循环,相当于C语言中的break.
2、iterate
跳出并结束当前本次循环,进入下次循环,相当于C语言中的continue.
#注意:iterate 只能在循环中使用
#以上所说的流程控制是相对于存储过程而言的,流程控制大多是用于配合存储过程的,因为自定义
#函数在数据库中使用比较少,大多数都是使用存储过程的。

-- 跳转语句
-- leave :跳出并结束整个循环,相当于C/C++ 中的break
-- iterate: 跳出本次循环,继续执行下次循环,相当于C/C++ 中的continue


http://www.kler.cn/news/17904.html

相关文章:

  • gpt.4.0-gpt 国内版
  • 华为网工实验(VRRP多网关负载分担,OSPF基础操作)
  • Spring更简单的存取Bean
  • php 设置meta标签中的keywords | description | content-type | copyright的方法函数
  • 字符设备驱动
  • [架构之路-187]-《软考-系统分析师》-5-数据库系统 - 操作型数据库OLTP与分析型数据库OLAP比较
  • Pytorch, tensor存储机制
  • 多元统计分析-聚类分析的原理与应用
  • 大数据技术之SparkSQL——数据的读取和保存
  • springboot+jsp商务安全邮箱(源码+文档)
  • Python代码学习之给图片添加文字或图片水印
  • UPF learing3:TRANS-11
  • python:可以求解Ax=b的库
  • E. Sergey and Subway(思维 + dp)
  • 入门力扣自学笔记264 C++ (题目编号:2432)
  • 网页和原生程序的交互方案
  • 17组漫画卡通字体推荐给设计师
  • 深入理解Python中的生成器和迭代器
  • ipad有必要用手写笔吗?电容笔和Apple pencil区别
  • 智安网络|网络安全威胁越来越多,教你如何全方面应对
  • PMP|敏捷高分口诀,迅速码住!
  • 单例模式的介绍
  • Yolov1 源码讲解 loss.py
  • 【C++】 类练习---封装链表、人物移动
  • gitlab使用docker简单快速部署
  • 数字座舱带动液晶仪表升级,哪些企业「领跑」前装量产份额
  • 20. 资源的调度——Node 亲和性(Node Affinity)
  • 亚马逊选品有什么技巧?品选对了可以带来什么好处?
  • 【图像分割】视觉大模型SEEM(Segment Everything Everywhere All at Once)原理解读
  • 登顶Nature 正刊!百度生物计算用AI首次实现mRNA领域重大进展