1.标签语句

  1. [begin_label:] BEGIN
  2. [statement_list]
  3. END [end_label]
  4. [begin_label:] LOOP
  5. statement_list
  6. END LOOP [end_label]
  7. [begin_label:] REPEAT
  8. statement_list
  9. UNTIL search_condition
  10. END REPEAT [end_label]
  11. [begin_label:] WHILE search_condition DO
  12. statement_list
  13. END WHILE [end_label]
  • 标签label可以加在begin...end语句以及loop,repeat和while语句上
  • 语句中通过iterate和leave来控制流程,iterate表示返回指定标签位置,leave表示跳出标签

实例:

  1. mysql> delimiter //
  2. mysql> create procedure doiterate(in p1 int,out p2 int)
  3. -> begin
  4. -> label1:loop
  5. -> set p1 = p1 + 1;
  6. -> if p1 < 10 then iterate label1;end if;
  7. -> leave label1;
  8. -> end loop label1;
  9. -> set p2=p1;
  10. -> end//
  11. Query OK, 0 rows affected (0.00 sec)
  12. mysql> delimiter ;
  13. mysql> call doiterate(1,@a);
  14. Query OK, 0 rows affected (0.00 sec)
  15. mysql> select @a;
  16. +------+
  17. | @a |
  18. +------+
  19. | 10 |
  20. +------+
  21. 1 row in set (0.00 sec)
  22. mysql> call doiterate(5,@a);
  23. Query OK, 0 rows affected (0.00 sec)
  24. mysql> select @a;
  25. +------+
  26. | @a |
  27. +------+
  28. | 10 |
  29. +------+
  30. 1 row in set (0.00 sec)

2.Declare语句

语法:

  1. DECLARE var_name [, var_name] ... type [DEFAULT value]
  • Declare语句通常声明本地变量、游标、条件或者handler
  • Declare语句只允许出现在begin...end语句中而且必须出现在第一行
  • Declare的顺序也有要求,通常是先声明本地变量,再是游标,然后是条件和handler
  • 使用default指定变量的默认值,如果没有指定默认值则为NULL
  • 声明的变量和被引用的数据表中的字段要区分开

存储过程中的变量

  • 本地变量可以通过declare语句声明
  • 声明后的变量可以通过select...into var_list进行赋值,或者通过set语句赋值,或者通过定义游标并使用fetch...into var_list赋值
  1. mysql> delimiter //
  2. mysql> create procedure sp1(v_sid int)
  3. -> begin
  4. -> declare xname varchar(64) default 'bob';
  5. -> declare xgender int;
  6. -> select sname,gender into xname,xgender from students where sid=v_sid;
  7. -> select xname,xgender;
  8. -> end//
  9. Query OK, 0 rows affected (0.01 sec)
  10. mysql> delimiter ;
  11. mysql>
  12. mysql> call sp1(1);
  13. +--------+---------+
  14. | xname | xgender |
  15. +--------+---------+
  16. | Andrew | 1 |
  17. +--------+---------+
  18. 1 row in set (0.00 sec)
  19. Query OK, 0 rows affected (0.00 sec)

3.流程控制语句

(1)case语句

在存储过程或函数中表明复杂的条件选择语句。

语法:

  1. CASE case_value
  2. WHEN when_value THEN statement_list
  3. [WHEN when_value THEN statement_list] ...
  4. [ELSE statement_list]
  5. END CASE
  6. Or:
  7. CASE
  8. WHEN search_condition THEN statement_list
  9. [WHEN search_condition THEN statement_list] ...
  10. [ELSE statement_list]
  11. END CASE

说明:

  • case_value与when_value依次做相等对比,如果相等则执行对应的后面的SQL语句,否则接着对比;
  • 当search_condition满足true/1的结果时,则执行对应的SQL语句,否则执行else对应的SQL语句;

实例:

  1. mysql> delimiter //
  2. mysql> create procedure exp_case(v_sid int)
  3. -> begin
  4. -> declare v int default 1;
  5. -> select gender into v from students where sid=v_sid;
  6. -> case v
  7. -> when 0 then update students set gender=1 where sid=v_sid;
  8. -> when 1 then update students set gender=0 where sid=v_sid;
  9. -> else
  10. -> update students set gender=-1 where sid=v_sid;
  11. -> end case;
  12. -> end//
  13. Query OK, 0 rows affected (0.00 sec)
  14. mysql> delimiter ;
  15. mysql>
  16. mysql> select * from students where sid=1;
  17. +-----+--------+--------+---------+
  18. | sid | sname | gender | dept_id |
  19. +-----+--------+--------+---------+
  20. | 1 | Andrew | 1 | 1 |
  21. +-----+--------+--------+---------+
  22. 1 row in set (0.00 sec)
  23. mysql> call exp_case(1);
  24. Query OK, 1 row affected (0.03 sec)
  25. mysql> select * from students where sid=1;
  26. +-----+--------+--------+---------+
  27. | sid | sname | gender | dept_id |
  28. +-----+--------+--------+---------+
  29. | 1 | Andrew | 0 | 1 |
  30. +-----+--------+--------+---------+
  31. 1 row in set (0.00 sec)
  32. 另一种写法:
  33. mysql> delimiter //
  34. mysql> create procedure exp_case2(v_sid int)
  35. -> begin
  36. -> declare v int default 1;
  37. -> select gender into v from students where sid=v_sid;
  38. -> case
  39. -> when v=0 then update students set gender=1 where sid=v_sid;
  40. -> when v=1 then update students set gender=0 where sid=v_sid;
  41. -> else
  42. -> update students set gender=-1 where sid=v_sid;
  43. -> end case;
  44. -> end//
  45. Query OK, 0 rows affected (0.00 sec)
  46. mysql> delimiter ;
  47. mysql> call exp_case2(1);
  48. Query OK, 1 row affected (0.03 sec)
  49. mysql> select * from students where sid=1;
  50. +-----+--------+--------+---------+
  51. | sid | sname | gender | dept_id |
  52. +-----+--------+--------+---------+
  53. | 1 | Andrew | 1 | 1 |
  54. +-----+--------+--------+---------+
  55. 1 row in set (0.00 sec)

(2)IF语句

在存储过程或函数中表明基础的条件选择语句

语法:

  1. IF search_condition THEN statement_list
  2. [ELSEIF search_condition THEN statement_list] ...
  3. [ELSE statement_list]
  4. END IF
  • 如果search_condition满足true/1的条件,则执行对应的SQL语句,否则再判断elseif中的search_condition,都不满足则执行else中的SQL语句;
  • statement_list中可以包含一个或多个SQL语句

实例:

  1. mysql> delimiter //
  2. mysql> create function SimpleCompare(n int,m int)
  3. -> returns varchar(20)
  4. -> begin
  5. -> declare s varchar(20);
  6. -> if n > m then set s = '>';
  7. -> elseif n = m then set s = '=';
  8. -> else set s = '<';
  9. -> end if;
  10. -> set s = concat(n,'',s,'',m);
  11. -> return s;
  12. -> end//
  13. Query OK, 0 rows affected (0.00 sec)
  14. mysql> delimiter ;
  15. mysql>
  16. mysql> select SimpleCompare(5,6);
  17. +--------------------+
  18. | SimpleCompare(5,6) |
  19. +--------------------+
  20. | 5<6 |
  21. +--------------------+
  22. 1 row in set (0.00 sec)
  23. mysql> select SimpleCompare(15,34);
  24. +----------------------+
  25. | SimpleCompare(15,34) |
  26. +----------------------+
  27. | 15<34 |
  28. +----------------------+
  29. 1 row in set (0.00 sec)
  30. mysql> select SimpleCompare(78,78);
  31. +----------------------+
  32. | SimpleCompare(78,78) |
  33. +----------------------+
  34. | 78=78 |
  35. +----------------------+
  36. 1 row in set (0.00 sec)

IF嵌套:

  1. mysql> delimiter //
  2. mysql> create function verboseCompare(n int,m int)
  3. -> returns varchar(50)
  4. -> begin
  5. -> declare s varchar(50);
  6. -> if n = m then set s = 'equals';
  7. -> else
  8. -> if n > m then set s = 'greater';
  9. -> else set s = 'less';
  10. -> end if;
  11. -> set s = concat('is',s,'than');
  12. -> end if;
  13. -> set s = concat(n,'',s,'',m,'.');
  14. -> return s;
  15. -> end//
  16. Query OK, 0 rows affected (0.00 sec)
  17. mysql> delimiter ;
  18. mysql> select verboseCompare(4,5);
  19. +---------------------+
  20. | verboseCompare(4,5) |
  21. +---------------------+
  22. | 4islessthan5. |
  23. +---------------------+
  24. 1 row in set (0.00 sec)

(3)iterate语句

仅出现在loop,repeat,while循环语句中,表示重新开始此循环。

语法:

  1. ITERATE label

(4)leave语句

表明指定标签的流程控制语句块,通常用在begin...end,以及loop,repeat,while循环汇总;

  1. LEAVE label

实例:

  1. mysql> delimiter //
  2. mysql> create procedure doiterate2(in p1 int,out p2 int)
  3. -> begin
  4. -> label1:loop
  5. -> set p1=p1+1;
  6. -> if p1 < 10 then iterate label1;end if;
  7. -> leave label1;
  8. -> end loop label1;
  9. -> set p2=p1;
  10. -> end//
  11. Query OK, 0 rows affected (0.00 sec)
  12. mysql> delimiter ;

(5)loop语句

在存储过程或函数中表达循环执行的一种方式;

语法:

  1. [begin_label:] LOOP
  2. statement_list
  3. END LOOP [end_label]

实例:

  1. mysql> delimiter //
  2. mysql> create procedure doiterate3(p1 int)
  3. -> begin
  4. -> label1:loop
  5. -> set p1=p1+1;
  6. -> if p1<10 then iterate label1;end if;
  7. -> leave label1;
  8. -> end loop label1;
  9. -> set @x=p1;
  10. -> end//
  11. Query OK, 0 rows affected (0.00 sec)
  12. mysql> delimiter ;

(6)repeat语句

在存储过程或函数中表达循环执行的一种方式;

语法:

  1. [begin_label:] REPEAT
  2. statement_list
  3. UNTIL search_condition
  4. END REPEAT [end_label]

实例:

  1. mysql> delimiter //
  2. mysql> create procedure doiterate4(p1 int)
  3. -> begin
  4. -> set @x=0;
  5. -> repeat
  6. -> set @x=@x+1;
  7. -> until @x>p1 end repeat;
  8. -> end//
  9. Query OK, 0 rows affected (0.00 sec)
  10. mysql> delimiter ;
  11. mysql> call doiterate4(1000);
  12. Query OK, 0 rows affected (0.02 sec)
  13. mysql> select @x;
  14. +------+
  15. | @x |
  16. +------+
  17. | 1001 |
  18. +------+
  19. 1 row in set (0.00 sec)

(7)while语句

在存储过程或函数中表达循环执行的一种方式;

语法:

  1. [begin_label:] WHILE search_condition DO
  2. statement_list
  3. END WHILE [end_label]
  • 当search_condition返回true时,循环执行SQL语句,直到search_condition为false;

实例:

  1. mysql> delimiter //
  2. mysql> create procedure dowhile()
  3. -> begin
  4. -> declare v1 int default 5;
  5. -> while v1>0 do
  6. -> update students set gender=-1 where sid=v1;
  7. -> set v1=v1-1;
  8. -> end while;
  9. -> end//
  10. Query OK, 0 rows affected (0.00 sec)
  11. mysql> delimiter ;
  12. mysql> call dowhile();
  13. Query OK, 1 row affected (0.63 sec)
  14. mysql> select * from students;
  15. +-----+--------+--------+---------+
  16. | sid | sname | gender | dept_id |
  17. +-----+--------+--------+---------+
  18. | 1 | Andrew | -1 | 1 |
  19. | 2 | Andy | -1 | 1 |
  20. | 3 | Bob | -1 | 1 |
  21. | 4 | Ruth | -1 | 2 |
  22. | 5 | Mike | -1 | 2 |
  23. | 6 | John | 0 | 3 |
  24. | 7 | Cindy | 1 | 3 |
  25. | 8 | Susan | 1 | 3 |
  26. +-----+--------+--------+---------+
  27. 8 rows in set (0.00 sec)

(8)return语句

在函数中,用来终结函数的执行并将指定值返回给调用者;

语法:

  1. RETURN expr
  • 在函数中必须有至少一个return语句,当有多个return语句时则表明函数有多种退出方式;

实例:

  1. mysql> delimiter //
  2. mysql> create function doreturn()
  3. -> returns int
  4. -> begin
  5. -> select gender into @a from students where sid = 1;
  6. -> if @a=1 then return 1;
  7. -> elseif @a=0 then return 0;
  8. -> else return 999;
  9. -> end if;
  10. -> end//
  11. Query OK, 0 rows affected (0.00 sec)
  12. mysql> delimiter ;
  13. mysql> select doreturn();
  14. +------------+
  15. | doreturn() |
  16. +------------+
  17. | 999 |
  18. +------------+
  19. 1 row in set (0.00 sec)
  20. mysql> select * from students where sid = 1;
  21. +-----+--------+--------+---------+
  22. | sid | sname | gender | dept_id |
  23. +-----+--------+--------+---------+
  24. | 1 | Andrew | -1 | 1 |
  25. +-----+--------+--------+---------+
  26. 1 row in set (0.00 sec)

MySQL-5.7 高阶语法及流程控制的更多相关文章

  1. Cmd Markdown 高阶语法手册

    『Cmd 技术渲染的沙箱页面,点击此处编写自己的文档』 Cmd Markdown 高阶语法手册 1. 内容目录 在段落中填写 [TOC] 以显示全文内容的目录结构. [TOC] 2. 标签分类 在编辑 ...

  2. Java高阶语法---transient

    背景:听说transient Java高阶语法是挺进BAT必经之路. transient: Java中transient 关键字的作用,简单的说就是让某些被修饰的成员属性变量不被序列化. 这又扯到了序 ...

  3. Java高阶语法---static

    背景:听说static Java高阶语法是挺进BAT必经之路. static: 静态static,很多时候会令我望文生义,但是get到了static最重要的一点,其他的理解都还ok. static最重 ...

  4. Java高阶语法---Volatile

    背景:听说Volatile Java高阶语法亦是挺进BAT的必经之路. Volatile: volatile同步机制又涉及Java内存模型中的可见性.原子性和有序性,恶补基础一波. 可见性: 可见性简 ...

  5. Java高阶语法---final

    背景:听说final Java高阶语法是挺进BAT必经之路. final: final关键字顾名思义就是最终不可改变的. 1.含义:final可以声明成员变量.方法.类和本地变量:一旦将引用声明为fi ...

  6. Markdown 高阶语法

    记录一些 Markdown 的高阶语法,想起来什么,再更新 分割线 两条分割线 *** *** 插入表格 Column Column Column Row Content Content | Colu ...

  7. Java基础语法(4)-流程控制

    title: Java基础语法(4)-流程控制 blog: CSDN data: Java学习路线及视频 1.程序流程控制 流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定 ...

  8. 【Java基础】基本语法-程序流程控制

    基本语法-程序流程控制 程序流程控制 流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块. 其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即: 顺 ...

  9. Java基础语法与流程控制

    Java基础语法与流程控制 跟着狂神学Java的第二天O(∩_∩)O~,养成一个总结的习惯 志同道合的小伙伴可以一起学习狂神的视频 本节地址:https://www.kuangstudy.com/co ...

随机推荐

  1. Torch-RNN运行过程中的坑 [1](读取Lua非空table,size为0)

    0.踩坑背景 执行Torch-RNN的时候,在LanguageModel.lua中的encode_string函数中,对start_text的各个character进行id映射编码,实现功能类似“北京 ...

  2. Wise 打包细节

    细节 说明 添加卸载快捷方式 缺省的安装程序快捷方式中没有卸载项:只能通过控制面板删除,或者主程序目录下的UnWise.exe来卸载.实际上,该文件就可以作为卸载程序. 可以复制一个快捷方式,将程序名 ...

  3. (转)java并发对象锁、类锁、私有锁

    转自:http://ifeve.com/java-locks/ 建议参考:http://www.zhihu.com/question/28113814 Java类锁和对象锁实践 感谢[jiehao]同 ...

  4. AWS系列-根设备类型

    1.AWS根设备类型分为两类 实例存储(本地存储) EBS存储(网络存储) 2.实例存储 系统和磁盘在同一主机上 3.EBS存储 Elastic Block Storage EBS可能与云主机不在一台 ...

  5. SurvivalShooter学习笔记(二.玩家移动旋转)

    该案例中:(PC端操作) 1.玩家移动输入控制通过虚拟轴Axis,旋转输入控制通过鼠标位置: 2.玩家始终面朝鼠标停留点,鼠标停留点通过摄像机朝地面的射线获取: 3.玩家待机移动状态切换通过Anima ...

  6. java集合 stream 相关用法(1)

    java8新增一种流式数据,让操作集合数据更简单方便. 定义基本对象: public class Peo { private String name; private String id; publi ...

  7. Kotlin——中级篇(二): 属性与字段详解

    在前面的章节中,详细的为大家讲解到了Kotlin中对类的类的定义.使用.初始化.初始化.类继承等内容,但是在一个类中,几乎上是不可能不出现属性与字段(field)的,这一篇文章就为大家奉上Kotlin ...

  8. 妈妈再也不用担心我使用git了

    妈妈再也不用担心我使用git了 Dec 29, 2014 git git由于其灵活,速度快,离线工作等特点而倍受青睐,下面一步步来总结下git的基本命令和常用操作. 安装msysgit 下载地址:ms ...

  9. 51NOD 1013(3的幂的和)

    题目链接:传送门 题目大意:求(3^0+3^1+3^2+3^3+...+3^n)%1e9的值 题目思路:乘法逆元裸题 #include <iostream> #include <cs ...

  10. 2534: Uva10829L-gap字符串

    2534: Uva10829L-gap字符串 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 66[Submit][Statu ...