存储过程

类型 含义
IN 作为输入,调用时需要传入值
OUT 作为输出,该参数作为返回值
INOUT 既可以输入参数,也可以输出参数
语法:创建create procedure 存储过程名称(in 参数名称1 参数数据类型,out 参数名称2 参数数据类型,inout 参数名称3 参数数据类型)begin————SQL语句end;调用call 存储过程名称(参数1,@参数名称2)       # in和outset @参数名称2 = X;call 存储过程名称(@参数名称2);      #inoutselect @参数名称2;查看show create procedure 存储过程名称;删除drop procedure if exists 存储过程名称;

用户变量

​ 定义:用户自定义的变量,即用户变量,用户变量不用提前声明,在使用的时候直接用@变量名使用即可。作用域为当前连接

 创建用户变量  set @变量名 = 值select 字段名 into @变量名 from 表名;    @把字段的值赋给用户变量使用用户变量select @变量名;

局部变量

定义:局部变量是根据需要定义的在局部生效的变量,访问之前,需要declare声明。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的begin…end块

声明:   declare 变量名 变量类型 [default x]; #default为默认值,此时默认值为x
赋值:set 变量名 = 值;select 字段名 into 变量名 from 表名....;eg:create procedure p()begindeclare stu_count int default 0;select count(*) into stu_count from student;select stu_count;end;call p();        #把count(*)的值赋给了stu_count

if else

语法:if 条件1 then代码1elseif 条件2 then      #可选代码2else              #可选代码3end if;如果 符合条件1 则进入代码1,否则如果符合条件2则进入代码2,否则进入代码3eg:create procedure p(in sc char(10),in sc2 char(10))begin declare result varchar(10);declare sum int;select grade into sum from score where sno = sc and cno = sc2; if sum >= 85 thenset result = '优秀';elseif sum>=60 thenset result = '及格';elseset result = '不及格';end if;select result;end;call p('2015001','c02');

case

语法1:case 表达式when when_value1 then statement_list1when when_value2 then statement_list3....else statement_list
语法2:case when 表达式1 then 代码1when 表达式2 then 代码2.....else代码3end case;
eg:create PROCEDURE p2(in month int)begindeclare result varchar(10);casewhen month>=1 and month<=3 thenset result = '第一季度';when month>=4 and month<=6 thenset result = '第二季度';when month>=7 and month<=9 thenset result = '第三季度';when month>=10 and month<=12 thenset result = '第四季度';elseset result = '非法参数';end case;select concat('您输入的月份为:',month,'所属的季度为:',result);end;call p2(1);

循环

while

满足条件后,再次执行循环体中的sql语句

# 先判断条件,如果条件为true,则执行逻辑,否则,不执行
while 条件 dosql逻辑代码
end while;eg:#计算从1累加到n的值,n为传入的参数create procedure p3(in n int)begindeclare total int DEFAULT 0;while n>0 doset total = total+n;set n = n-1;end while;select total;end;call p3(3);

repeat

# 先判断条件,当满足条件时退出循环
#先执行一次逻辑,然后判定逻辑是否满足,如果满足则退出,否则继续
repeatsql逻辑代码until 条件
end repeat;eg:create procedure p4(in n int)begindeclare total int DEFAULT 0;repeatset total = total+n;set n = n-1;until n<0end repeat;select total;end;call p4(3);

loop

loop实现简单的循环,如果不在sql逻辑中增加退出循环的条件,可以用其来实现简单的死循环,loop可以配合以下两个语句使用

  1. leave :配合循环使用,退出循环
  2. iterate :必须用在循环中,作用和 C++的continue相同
语法:标记名:loopSQL逻辑代码end loop 标记名;leave lable;   #退出指定标记的循环体iterate label;  #直接进入下一次循环eg:create procedure p5(in n int)begindeclare total int DEFAULT 0;sum:loopif n<=0 thenleave sum;end if;set total = total+n;set n = n-1;end loop sum;select total;end;call p5(3);#如果加到奇数的话iteratecreate PROCEDURE p6(in n int)begindeclare total int DEFAULT 0;sum:loopif n<=0 thenleave sum;end if;if n%2=1 thenset n = n-1;ITERATE sum;end if;set total = total+n;set n = n-1;end loop sum;select total;end;call p6(3);

游标

游标是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。

声明游标:declare 游标名 cursor for 查询语句;
打开游标:                #使用游标之前需要先打开游标open 游标名;
获取游标记录:fetch 游标名 into 变量;
关闭游标:close 游标名; eg:根据传入的参数age,查询students表中,所有学生出生日期小于age的用户姓名和专业,并将用户的姓名和专业插入到一个新表中思路:A:声明游标,B:创建表,C:开启游标,D:获取游标中的记录,E:插入数据到新表,F:关闭游标create PROCEDURE p7(in uage date           #传入出生日期)begindeclare usname varchar(100);       #保存符合条件的学生信息的两个局部变量declare upro varchar(100);declare u_cursor cursor for        #声明游标,select sname,smajor from students where sbirthday<uage; #找出 出生日期大于uage的#如果存在则删除,这样的话就保证表中只显示比uage大的学生信息drop table if exists tb_user;                                                                                             create table if not exists tb_user(     #创建表id int primary key auto_increment,  #id设置自增主键uname varchar(100),sdapt varchar(100));open u_cursor;              #打开游标while true do              #进入while循环fetch u_cursor into usname,upro;  # 把游标中的记录存入两个局部变量insert into tb_user values(null,usname,upro);  #插入新表end while;close u_cursor;      #关闭游标end;call p7('1999-03-1');

存储函数

存储函数是有返回值的存储过程,存储函数的参数只能是in类型的。

语法:create function 存储函数名(参数列表)returns type [characteristic...]beginSQL语句return ...;end;characteristic说明:deterministic:相同的输入参数总是产生相同的结果no sql        :不包含sql语句reads sql data: 包含读取数据的语句,但不包含写入数据的语句eg:   create function fun1(n int)returns int deterministicbegindeclare total int default 0;while n>0 doset total = total+n;set n = n-1;end while;return total;end;select fun1(10);

注意:存储函数必须要有返回值

MySQL 存储过程,语法+示例,超详细!!相关推荐

  1. mysql的存储过程正负数的变化_《转》mysql存储过程语法及范例

    <转>mysql存储过程语法及实例 存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法------- ...

  2. MySQL修改数据(超详细)

    MySQL修改数据(超详细) 更新/修改数据 只改想改的数据: update 表名 set 字段名=值 where 条件子句; 如: update c1 set name="库里30&quo ...

  3. MySql存储过程异常处理示例

    MySql存储过程异常处理示例 参考文章: (1)MySql存储过程异常处理示例 (2)https://www.cnblogs.com/lucienbao/archive/2012/06/07/mys ...

  4. MySQL存储过程语法

    MySQL存储过程语法 1.语法结构 2.变量及赋值 2.1.局部变量 2.2.用户变量 2.3.全局变量: 3.出参和入参 4.流程控制 4.1.判断 4.1.1.IF 4.1.2.CASE 4.2 ...

  5. MySQL查询数据(超详细)

    MySQL查询数据(超详细) 一.简单查询语句 select * from 表名 条件查询语句; 二.多表查询 多张表有同名字段出现在select语句中,同名字段必须带上 "表名 . 字段名 ...

  6. mysql存储过程语法及实例

    存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程 c ...

  7. mysql存储过程语法 if_mysql存储过程语法 if

    MySql存储过程 MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程, ...

  8. MySQL高级查询语句——超详细,一篇就够了

    MySQL高级查询语句 一.MySQL进阶查询 1.1.按关键字排序--order by 1.2.对结果进行分组--group by 1.2.1.单个分组 1.2.2.分组结合order by使用 1 ...

  9. Mysql存储过程语法讲解,以及如何用Java调用!

    存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的-种数据库对象. 存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过 ...

  10. MySQL数据库入门教程超详细

    点击查看MySQL优化文章 一.写在前面 黑窗口启动mysql服务: net start mysql 登录:mysql -u root -p 备份数据库: mysqldump -uroot -p123 ...

最新文章

  1. Docker Dockerfile
  2. Linux下stat + 文件名后, Access,Modify,Change的含义
  3. 为什么大家都推荐我学Linux
  4. numpy 学习笔记
  5. 重新分区_完全不需要装软件!教你轻松调整硬盘分区
  6. Ubuntu用命令行发邮件mutt,报警发短信通知
  7. JZOJ 5167. 【NOIP2017模拟6.26】下蛋爷
  8. Spring AbstractAutowireCapableBeanFactory
  9. python数据科学指南是什么_《Python数据科学指南》——导读
  10. 语雀携手Teambition,玩转项目协作与知识管理
  11. ZBlog插件简洁轻巧的编辑器 iceEditor修复版
  12. 浏览器构造页面的原理
  13. JAVA设计模式之【职责链模式】
  14. 【ubuntu】出现device not managed连接不上网络
  15. 微信小程序 多标签选择和添加标签
  16. Unity chan下载
  17. 社区角色(Kubernetes社区Maintainer是什么角色?)
  18. html5代码验证电话号码,这个我觉得挺重要的!
  19. 【web前端教程笔记】
  20. 学习博客:【JavaScript】jQuery

热门文章

  1. freeMark中遍历list集合
  2. isalpha函数,判断字符是否是字母
  3. 【CMS】什么是CMS?Camera Monitor System
  4. cad 二次开发 插入图片_CAD如何加载二次开发程序?
  5. 均值方差分析与风险资产组合
  6. 原来珠宝门店管理系统这么妙,你可能还不知道!
  7. 动网论坛的广告注册,广告回复 问题
  8. 【LKH算法体验】Python调用LKH算法求TSP问题
  9. Android悬浮窗播放视频
  10. Android入门,简单画图板的实现,自定义组件的实现