Mysql 流程控制

认识

从我目前所接触的编程语言,C, R, VB, Python, Javascript...,来看, 无非就是变量, 表达式, 流程控制(顺序, 分支, 循环), 封装了一些更高级的数据结构而已, 区别在于应用场景和语言特性, 其实逻辑都是相同的, 唯手熟尔.

选择结构 if-else; case

-- if-esle 语法
IF search_condition THEN
statement_list;
[ELSEIF search_condition THEN
statement_list; ....]
ELSE
statement_list;
END IF;
-- CASE 语法
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list]...
[ELSE statement_list]
END CASE; OR:
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
-- 随机推送一句表白
drop procedure if exists sayLove;
delimiter //
create procedure sayLove()
begin
declare num int default 0;
-- 生成一个1-5间的随机数
set num := round(rand()*5);
-- 判断
case num
when 1 then select "人生若只如初见";
when 2 then select "春风十里不如你";
when 3 then select "爱你就像爱生命";
else
select "今晚的月色真美";
end case;
end //
delimiter ; call sayLove(); -- out
mysql> call sayLove();
+----------------+
| 今晚的月色真美 |
+----------------+
| 今晚的月色真美 |
+----------------+
1 row in set (0.09 sec) Query OK, 0 rows affected (0.00 sec) mysql> call sayLove();
+----------------+
| 爱你就像爱生命 |
+----------------+
| 爱你就像爱生命 |
+----------------+
1 row in set (0.14 sec) Query OK, 0 rows affected (0.00 sec) mysql> call sayLove();
+----------------+
| 春风十里不如你 |
+----------------+
| 春风十里不如你 |
+----------------+
1 row in set (0.11 sec)

CASE 能实现的, IF-ELSE也完全能, 只是提供了更多的选择而已.

-- 用 if-esle实现
drop procedure if exists sayLove;
delimiter //
create procedure sayLove()
begin
declare num int default 0;
-- 生成一个1-5间的随机数
set num := round(rand()*5);
-- 判断
if num=1 then select "人生若只如初见";
elseif num=2 then select "春风十里不如你";
elseif num-3 then select "爱你就像爱生命";
else
select "今晚的月色真美";
end if;
end //
delimiter ; call sayLove();

MySql 循环

  • WHILE ... DO ... END WHILE 叫什么"当"型循环, 满足条件才进入循环体
  • LOOP ... LEAVE...END LOOP "直到型循环"
  • REPEAT ... UNTIL ... END REPEAT

while ...do ...循环

while search_condition do
statement_list;
end while;

repeat ...until ...循环

repeat
statement_list;
until search_condition;
end repeat;

loop ...leave 循环

[begin_label:] loop
statement_list;
leave [begin_label];
end loop [end_label];

循环-案例 1+2+...n

-- while 实现 求1+2+3+..n和
-- 自己容易混的点: 忘在结尾; end; 变量忘了 set;
-- 传入参数: in 传入值; out: 传入变量去接收返回的值; inout 传入又输出
drop procedure if exists sumN_while;
delimiter //
create procedure sumN_while(in n int)
begin
declare total int default 0;
declare i int default 0;
-- while ...do ....
while i <= n do
set total := total + i;
set i := i + 1;
-- 打印一下结果
end while;
select concat("1+2+..", n, "的和是:", total) as '输出啦';
end //
delimiter ; call sumN_while(100); -- out
call sumN_while(100);
Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) +----------------------+
| 输出啦 |
+----------------------+
| 1+2+..100的和是:5050 |
+----------------------+
1 row in set (0.10 sec)

同样同 repeat ... until ..实现, 顺便练习下 out 类型参数

-- repeat 实现 1+2+..n的和
drop procedure if exists sumN_repeat;
delimiter //
-- 设置传入out型参数变量, 用来接收输出值
create procedure sumN_repeat(out total int)
begin
xxxx
end //
delimiter ;
drop procedure if exists sumN_repeat;
delimiter //
-- 设置再传入out型参数变量, 用来接收输出值
create procedure sumN_repeat(in n int)
begin
declare i int default 0;
declare total int default 0; -- repeat ... until ...
repeat
set total := total + i;
set i := i + 1;
-- 退出条件 until..True时才退出哦, 注意跟while的区别
until i > n
end repeat;
-- 在内部打印出结果
select total;
end //
delimiter ; -- out
call sumN_repeat(100);
Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) +-------+
| total |
+-------+
| 5050 |
+-------+
1 row in set (0.09 sec)

用out类型参数.

-- repeat 实现 1+2+..n的和
drop procedure if exists sumN_repeat;
delimiter //
-- 设置再传入out型参数变量, 用来接收输出值
create procedure sumN_repeat(in n int, out total int)
begin
declare i int default 0; set total := 0; -- 顺序: 先decalre 再是set, 不能乱,兄弟
-- repeat ... until ...
repeat
set total := total + i;
set i := i + 1;
-- 退出条件 until..注意是条件为True时退出哦
until i > n
end repeat;
end //
delimiter ; -- set @ret := 0;
-- call sumN_repeat(100, @ret);
-- select @ret; -- out
mysql> set @ret := 0; -- 这个全局变量 @ret 用来接收过程的 total值哦
Query OK, 0 rows affected (0.00 sec) mysql> call sumN_repeat(10000, @ret);
Query OK, 0 rows affected (0.04 sec) mysql> select @ret;
+----------+
| @ret |
+----------+
| 50005000 |
+----------+
1 row in set (0.08 sec)

再用 loop....leave 来整一波

-- loop ...leave ... 来实现 求 1+2+..n 的和
drop procedure if exists sumN_loop;
delimiter //
create procedure sumN_loop(in n int, out total int)
begin
declare i int default 0;
set total := 0;
-- loop, 先取一个标签名, 再写退出条件, if-then...
myLoop: loop
if i > n then
leave myLoop;
end if;
set total := total + i;
set i := i + 1;
end loop;
end //
delimiter ; -- out
mysql> set @ret := 0;
Query OK, 0 rows affected (0.00 sec) mysql> call sumN_loop(100, @ret);
Query OK, 0 rows affected (0.00 sec) mysql> select @ret;
+------+
| @ret |
+------+
| 5050 |
+------+
1 row in set (0.11 sec)

小结MySql控制流

补充: 存储过程的参数声明

  • in 类型: 要求在调用的时候, 接收从外界传入一个值.
  • out 类型: 要求在调用时, 传入一个变量去接收procedure的"返回值"
  • inout 类型: 输入输出型

补充: MySql变量定义

  • 在存储过程内, 用: declare 变量名 类型 [default 值]; 类似"局部变量"
  • 在外边运行, 用: @变量 := 值; 类似"全局变量", 注意MySql的标准赋值符号是 " := ", 而 "=" 只有在update 和set时表示赋值, 其余场景都是 "等号".
  • 选择结构(if, case):

    • if - elseif- esle -end if;
    • case value when value1 then ; when value2 ...then .. else .. . end case;
  • 循环结构(while, repeat, loop)

    • while .... do .... end while;
    • repeat ... until .... end repeat;
    • myLoop: loop ..... if ... then leave myLoop; end if ; ..... end loop;

Mysql 控制结构初识的更多相关文章

  1. {MySQL数据库初识}一 数据库概述 二 MySQL介绍 三 MySQL的下载安装、简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 初识sql语句

    MySQL数据库初识 MySQL数据库 本节目录 一 数据库概述 二 MySQL介绍 三 MySQL的下载安装.简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 ...

  2. Mysql 游标初识

    MySql 游标初识 认识 游标(cursor), 按字面意思可理解为, 游动的标识, 或者叫做"光标", 这样更容易理解. 就好比现有一张表存储了n行记录, 然后我想每次取出一行 ...

  3. Mysql:初识MySQL

    转载自:https://www.cnblogs.com/hellokuangshen/archive/2019/01/09/10246029.html Mysql:初识MySQL 只会写代码的是码农: ...

  4. Mysql(一):初识数据库

    一 数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅只能存在于某一台机器上. 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件 ...

  5. MySQL之初识数据库

    一 数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅只能存在于某一台机器上. 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件 ...

  6. 【MySQL】初识数据库及简单操作

    一.数据库概述 1.1 什么是数据(Data) 描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字.图片,图像.声音.语言等,数据由多种表现形式,它们都可以经过数字化后存入计算机. ...

  7. python之路--MySQL数据库初识

    一 . MySQL安装 # 下载MySQL地址 https://dev.mysql.com/downloads # 要选稳定的,不要选最新的,稳定的就是半年以上没有出现过bug 现在5.6.43为绝大 ...

  8. 3 MySQL数据库--初识sql语句

    1.初识sql语句 服务端软件 mysqld SQL语句:后面的分号mysql -uroot -p123 操作文件夹(库) 增 create database db1 charset utf8; 查 ...

  9. MySQL数据库初识

    认识数据库 1 什么是数据(Data) 描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字.图片,图像.声音.语言等,数据由多种表现形式,它们都可以经过数字化后存入计算机 在计算机中 ...

随机推荐

  1. browserslist详解

    https://www.jianshu.com/p/d45a31c50711 https://juejin.im/post/5b8cff326fb9a019fd1474d6 https://githu ...

  2. WebForm 打开默认页

    原文:https://www.cnblogs.com/lionden/p/3728716.html <configuration> <system.webServer> < ...

  3. SWA2G422&485JK2G基础篇: 硬件使用说明

    开发板板载介绍(当前使用的测试板,以后期最终版为准) 一,实物图 硬件说明 一,开发板主控芯片说明: 1. 单片机: STM32F103RET6 2. GPRS模块: Air202 二,开发板外设说明 ...

  4. ASP.NET Core 简介

    .NET Core 是 .NET Framework 的新一代版本,是微软开发的第一个具有跨平台 ( Windows.Mac OSX .Linux ) 能力的应用程序开发框 ASP.NET Core ...

  5. spark基础知识四

    围绕spark的其他特性和应用.主要包括以下几个方面 spark自定义分区 spark中的共享变量 spark程序的序列化问题 spark中的application/job/stage/task之间的 ...

  6. 把ubuntu自带的高gcc版本降到低版本(如gcc 3.4)的方法

    转载自: 博客1.博客2 .博客3 步骤 第一步: 下载所需gcc安装包(.deb格式) 手动:老版本gcc下载地址:http://old-releases.ubuntu.com/ubuntu/poo ...

  7. 模型区分度衡量指标-KS值

    1.KS值--学习器将正例和反例分开的能力,确定最好的“截断点” KS曲线和ROC曲线都用到了TPR,FPR.KS曲线是把TPR和FPR都作为纵坐标,而样本数作为横坐标.但是AUC只评价了模型的整体训 ...

  8. 给定一个数组,求如果排序后,相邻两个元素的最大差值,要求时间复杂度为O(N)

    第一种方法: 计数排序后,然后找出两两之间的最大差值 计数排序的时间复杂度是O(N) public class CountSort { public static void main(String[] ...

  9. selenium又一小坑 无法用XPATH直接获取属性值 需要使用.get_attribute(“href”)

    在使用selenium进行抓取url的时候,试图使用find_elements_by_xpath来获取. 因此想当然的直接使用XPATH的语法进行获取属性 事例缩略后xml结构如下 <div c ...

  10. GO中标识符,标识符,变量,常量,iota

    参考:https://www.cnblogs.com/nickchen121/p/11517455.html 一.标识符与关键字 1.标识符 在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变 ...