Mariadb复合语句和流程控制怎么实现(mariadb,开发技术)

时间:2024-05-04 19:07:15 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

复合语句

在MariaDB 10.1.1+版本中,我们可以在存储过程以外来使用复合语句了,顾名思义,复合语句就是将多条语句作为一个整体来执行,可以在其中使用一些逻辑判断,循环等功能,大大提高了SQL语言的可编程性。

Mariadb复合语句和流程控制怎么实现

在存储过程以外使用复合语句需要遵守以下约定:

  • 仅可使用BEGIN, IF, CASE, LOOP, WHILE, REPEAT语句
  • BEGIN必须使用BEGIN NOT ATOMIC,这样不会规避autocommit
  • 不能以标签开头

当要使用复合语句时,可以使用如下的格式来使用:

BEGIN[NOTATOMIC][statement_list]END

因为SQL语句要使用;来作为结束的标识符,但是,多条SQL语句,到底哪个才是结束符了?所以我们可以将复合语句的结束符修改为其他字符,使用如下命令即可:|可以替换为任意数量的任意字符。

delimiter|//该命令在当前会话有效,会影响后续所有SQL语句的结束符

复合语句例子

MariaDB[world]>DELIMITER||MariaDB[world]>BEGINNOTATOMIC->SELECT*FROMuser;->SELECT*FROMdepartment;->END->||

会顺序显示两张表的内容,但是,有什么呢?

嘿,都说了,增加了可编程性,还没判断、循环呢。

定义本地变量

本地变量仅在当前BEGIN..END内生效**,定义一个本地变量的语法如下:

DECLAREvar_name[,var_name]type[DEFAULTvalue]type就是MariaDB中支持的那些数据类型。

比如如下例子:查询test1用户的组ID并放入到tmpdid变量中去

MariaDB[world]>BEGINNOTATOMIC->DECLAREtmpdidINTDEFAULT0;->SELECTdeptidINTOtmpdidFROMuserWHEREname='test1';->SELECTtmpdid;->END|+--------+|tmpdid|+--------+|1|+--------+1rowinset(0.00sec)

所以说,BEGIN…END是可以嵌套使用的,如在IF语句中使用BEGIN…END来创建一个新的定义域,当然BEGIN…END也是开启事务的标志

IF语句

语法如下:

IFsearch_conditionTHENstatement_list[ELSEIFsearch_conditionTHENstatement_list]...[ELSEstatement_list]ENDIF

这个就跟编程语言中的一样了,不再絮叨,来试试吧。

BEGINNOTATOMICDECLAREtmpdidINTDEFAULT0;SELECTdeptidINTOtmpdidFROMuserWHEREname='test1';IF(tmpdid=1)THENSELECT'TheUsertest1isthememberofsalse';ELSESELECT*FROMdepartmentWHEREid=tmpdid;ENDIF;END|

所以search_condition只要是可以表达TRUE或FALSE的表达式都行,比如:

BEGINNOTATOMICIFEXISTS(SELECT*FROMuserWHEREname='lucy')THENSELECT'Findtheuserlucy';ELSESELECT'NotFind';ENDIF;END|+--------------------+|Findtheuserlucy|+--------------------+|Findtheuserlucy|+--------------------+1rowinset(0.00sec)
CASE 语句

CASE有两种用法,一种是像编程语言中的SWITCH一样,进行数据的挑选,另一种则是实现了多分支的IF-ELSE语句,语法如下:

//对某一个值进行筛选CASEcase_valueWHENwhen_valueTHENstatement_list[WHENwhen_valueTHENstatement_list]...[ELSEstatement_list]ENDCASE//多分支的IF-ELSECASEWHENsearch_conditionTHENstatement_list[WHENsearch_conditionTHENstatement_list]...[ELSEstatement_list]ENDCASE

…想不出来例子,放弃,哪天想到了再来补吧。

附官方例子一枚:

DELIMITER|CREATEPROCEDUREp()BEGINDECLAREvINTDEFAULT1;CASEvWHEN2THENSELECTv;WHEN3THENSELECT0;ELSEBEGINEND;ENDCASE;END;|
LOOP语句

LOOP之前没有用过,好像很多编程语言里都没有LOOP这个关键字了,用来实现简单的循环,需要配合LEAVE语句跳出循环。

设置一变量,将其加到100并退出:为啥要加到100?鬼知道,哈哈哈。

BEGINNOTATOMICDECLAREtempNumINTDEFAULT0;test:LOOPSETtempNum=tempNum+1;IFtempNum=100THENLEAVEtest;ENDIF;ENDLOOPtest;SELECTtempNum;END;|

所以LOOP的语法如下:

[begin_label:]LOOPstatement_listENDLOOP[end_label]

通常,需要设置一个begin_label,用于标识该循环,以方便使用LEAVE跳出该循环,而end_label可以省略,但是如果想要给end_label的话,必须与begin_label的名称相同,而LEAVE的语法就很简单了:

LEAVElabel
WHILE语句

WHILE就与编程语言中的一样了,语法如下:

[begin_label:]WHILEsearch_conditionDOstatement_listENDWHILE[end_label]

当search_condition表达式不为TRUE时则不再执行循环。

查找某一用户的ID值为多少,为什么要写个循环呢?不知道呀,用WHERE不更好吗?

REPEAT..LOOP循环

REPEAT循环看起来非常像do…while循环,好吧,其实就是一回事。

第一次循环体不判断任何条件执行一次,然后再判断条件,如果条件还满足则继续执行,直到条件不满足为之,语法如下:

[begin_label:]REPEATstatement_listUNTILsearch_conditionENDREPEAT[end_label]

拼接所有用户名为一个字符串:

MariaDB[world]>BEGINNOTATOMIC->DECLAREiINTDEFAULT1;->DECLAREuserNamesVARCHAR(200)DEFAULT'';->DECLAREtmpNameVARCHAR(10)DEFAULT'';->DECLAREuserNumsINTDEFAULT0;->SELECTCOUNT(id)INTOuserNumsFROMuser;->REPEAT->SELECTnameINTOtmpNameFROMuserWHEREid=i;->SETuserNames=CONCAT(userNames,',',tmpName);->SETi=i+1;->UNTILNOTiENDREPEAT;->SELECTuserNames;->END|+--------------------------------------------------------------------------------------------+|userNames|+--------------------------------------------------------------------------------------------+|,test,test1,lucy,mars,mark,test6,test7,test7,test8,test8,test9,test10,test11,test12,test13|+--------------------------------------------------------------------------------------------+
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:Mariadb复合语句和流程控制怎么实现的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:如何通过NFS共享存储部署KVM双节点高可用群集下一篇:

14 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18