2019独角兽企业重金招聘Python工程师标准>>>

复合语句

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

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

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

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

BEGIN [NOT ATOMIC][statement_list]
END

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

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

复合语句例子

MariaDB [world]> DELIMITER ||
MariaDB [world]> BEGIN NOT ATOMIC-> SELECT * FROM user;-> SELECT * FROM department;-> END-> ||

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

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

定义本地变量

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

DECLARE var_name [, var_name] type [DEFAULT value]type就是MariaDB中支持的那些数据类型。

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

MariaDB [world]> BEGIN NOT ATOMIC->     DECLARE tmpdid INT DEFAULT 0;->     SELECT deptid INTO tmpdid FROM user WHERE name='test1';->     SELECT tmpdid;->     END|
+--------+
| tmpdid |
+--------+
|      1 |
+--------+
1 row in set (0.00 sec)

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

IF语句

语法如下:

IF search_condition THEN statement_list[ELSEIF search_condition THEN statement_list] ...[ELSE statement_list]
END IF

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

BEGIN NOT ATOMICDECLARE tmpdid INT DEFAULT 0;SELECT deptid INTO tmpdid FROM user WHERE name='test1';IF (tmpdid = 1) THEN SELECT 'The User test1 is the member of salse';ELSESELECT * FROM department WHERE id = tmpdid;END IF;END|

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

BEGIN NOT ATOMICIF EXISTS(SELECT * FROM user WHERE name = 'lucy') THENSELECT 'Find the user lucy';ELSESELECT 'Not Find';END IF;END|
+--------------------+
| Find the user lucy |
+--------------------+
| Find the user lucy |
+--------------------+
1 row in set (0.00 sec)

CASE 语句

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

//对某一个值进行筛选
CASE case_valueWHEN when_value THEN statement_list[WHEN when_value THEN statement_list] ...[ELSE statement_list]
END CASE//多分支的IF-ELSE
CASEWHEN search_condition THEN statement_list[WHEN search_condition THEN statement_list] ...[ELSE statement_list]
END CASE

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

附官方例子一枚:

DELIMITER |
CREATE PROCEDURE p()
BEGINDECLARE v INT DEFAULT 1;CASE vWHEN 2 THEN SELECT v;WHEN 3 THEN SELECT 0;ELSE BEGIN END;END CASE;
END;
|

LOOP语句

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

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

BEGIN NOT ATOMICDECLARE tempNum INT DEFAULT 0;test:LOOPSET tempNum=tempNum+1;IF tempNum=100 THENLEAVE test;END IF;END LOOP test;SELECT tempNum;
END;|

所以LOOP的语法如下:

[begin_label:] LOOPstatement_list
END LOOP [end_label]

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

LEAVE label

WHILE语句

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

[begin_label:] WHILE search_condition DOstatement_list
END WHILE [end_label]

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

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

REPEAT..LOOP循环

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

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

[begin_label:] REPEATstatement_list
UNTIL search_condition
END REPEAT [end_label]

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

MariaDB [world]> BEGIN NOT ATOMIC->     DECLARE i INT DEFAULT 1;->     DECLARE userNames VARCHAR(200) DEFAULT '';->     DECLARE tmpName VARCHAR(10) DEFAULT '';->     DECLARE userNums INT DEFAULT 0;->     SELECT COUNT(id) INTO userNums FROM user;->     REPEAT ->         SELECT name INTO tmpName FROM user WHERE id = i;->         SET userNames = CONCAT(userNames,',',tmpName);->         SET i = i +1;->     UNTIL NOT i< =userNums ->     END REPEAT;->     SELECT userNames;->     END|
+--------------------------------------------------------------------------------------------+
| userNames                                                                                  |
+--------------------------------------------------------------------------------------------+
| ,test,test1,lucy,mars,mark,test6,test7,test7,test8,test8,test9,test10,test11,test12,test13 |
+--------------------------------------------------------------------------------------------+

转载于:https://my.oschina.net/u/3585265/blog/3054823

Mariadb学习总结(十二):复合语句和流程控制相关推荐

  1. Linux | Shell 学习笔记(二)Shell 流程控制 if、case、for、while| read读取输入 | 函数的使用 | cut、sed、awk、sort命令 +Demo

    文章目录 参考资料 运行环境 一.流程控制 1.1 if 判断 1.2 case 语句 1.3 for 循环 1.4 while 循环 二. read 读取控制台输入 三.函数 3.1 系统函数 ba ...

  2. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  3. Mysql学习总结十二:系统变量、用户变量、定义条件和处理程序

    Mysql学习总结十二:系统变量.用户变量.定义条件和处理程序 1.变量 1.1 系统变量 1.1.1 系统变量的分类 1.1.2 查看系统变量 1.2 用户变量 1.2.1 用户变量的分类 1.2. ...

  4. C++语言学习(十二)——C++语言常见函数调用约定

    C++语言学习(十二)--C++语言常见函数调用约定 一.C++语言函数调用约定简介 C /C++开发中,程序编译没有问题,但链接的时候报告函数不存在,或程序编译和链接都没有错误,但只要调用库中的函数 ...

  5. Tensorflow深度学习之十二:基础图像处理之二

    Tensorflow深度学习之十二:基础图像处理之二 from:https://blog.csdn.net/davincil/article/details/76598474   首先放出原始图像: ...

  6. 吴恩达《机器学习》学习笔记十二——机器学习系统

    吴恩达<机器学习>学习笔记十二--机器学习系统 一.设计机器学习系统的思想 1.快速实现+绘制学习曲线--寻找重点优化的方向 2.误差分析 3.数值估计 二.偏斜类问题(类别不均衡) 三. ...

  7. 前几帧预测 深度学习_使用深度学习从十二导联心电图预测心律失常

    上集讲到 使用深度学习 从单导联预测房颤 这一集 将继续讨论该问题 单导联心电图 对心律失常的预测作用 非常有限 因为 单导联的信号很有限 临床上需要结合 多导联心电图 判断 心律失常的类型 这一集的 ...

  8. 花书+吴恩达深度学习(十二)卷积神经网络 CNN 之全连接层

    目录 0. 前言 1. 全连接层(fully connected layer) 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(十)卷积神经网络 CNN ...

  9. jQuery学习(十二)—jQuery中对象的查找方法总结

    jQuery学习(十二)-jQuery中对象的查找方法总结 一.find方法 作用:在元素1中查找元素2,类似于选择器中的后代选择器 格式:元素1.find(元素2),元素2为CSS选择器或者jQue ...

  10. JavaScript学习(十二)—removeAttribute方法、hasAttribute方法、createAttribute方法以及setAttributeNode方法

    JavaScript学习(十二)-removeAttribute方法.hasAttribute方法.createAttribute方法以及setAttributeNode方法 (一).removeAt ...

最新文章

  1. 概率图论PGM的D-Separation(D分离)
  2. python的_thread模块来实现多线程(python核心编程例子)
  3. Orange‘s 一个操作系统的实现--Bochs遇到的问题
  4. linux怎么永久保存,Linux系统中,让alias命令永久保存的方法!
  5. 一行Java代码获取当前操作系统并进行不同操作
  6. 两台linux之间实现共享文件夹挂载实例,linux之间实现共享文件夹挂载实力
  7. Nhibernate教程2(3)
  8. mxm智能教育机器人无法智能对话_零代码使用腾讯TBP打造智能对话机器人
  9. 大佬!莫言获颁第13个荣誉博士学位
  10. flink连接kafka整合hbase,scala
  11. 为什么数字中台是企业应用新基建?
  12. Python基础学习笔记(十三)异常
  13. 浅析Vue源码(二)—— initMixin(上)
  14. C++中读写文件demo
  15. Gallery3d 学习笔记(6)
  16. 恒指赵鑫:来说说止损
  17. 使用SpringBoot的优势
  18. 【2019-07-23】]python3 把日语翻译为中文 调用百度翻译API接口及API申请使用教程
  19. Live800:全渠道智能客服系统,助力企业打造全渠道客户中心
  20. 项目研究的目的、必要性和可行性

热门文章

  1. One-Error多标签分类_深度学习:如何在多标签分类问题中考虑标签间的相关性?
  2. C++之继承探究(七):虚析构函数
  3. java 配置文件加载_java加载配置文件信息
  4. java string 栈_Java堆和栈的区别(String类)
  5. android编辑框显示,android – 如何在屏幕上显示文本编辑框?
  6. java怎么配置tomcat_Eclipse中配置Tomcat
  7. mysql cluster安装配置_mysqlcluster安装与配置_MySQL
  8. endnote无法同步原因_endnote不能同步(endnote retrieving references)的解决方法
  9. java标识语_Java 基本语法,标识符,修饰符,关键字
  10. 通过连接池无法连接mysql_连接池无法链接数据库