数据科学探路者:MySQL知识整理9—索引​zhuanlan.zhihu.com

一、什么是存储过程?

简单的说,存储过程是一条或者多条SQL语句的集合,可视为批文件,但是其作用不限于批处理。

我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。

二、创建存储过程和函数

存储程序可分为存储过程和函数,语句分别为:create procedure 和 create function,使用call语句来调用存储过程,只能用输出变量返回值。函数可以从语句外调用(即通过引用函数名),也能返回标量值。存储过程也能调用其他存储过程。

1.创建存储过程

基本语法格式:create procedure sp_name ( [proc_parameter]) [characteristics...]routine_body

  • create procedure:创建存储函数关键字;sp_name:存储过程名称;
  • proc_parameter:指定存储过程的参数列表,列表形式如下:[IN| OUT| INOUT]param_name type
  • IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
  • OUT 输出参数:该值可在存储过程内部被改变,并可返回
  • INOUT 输入输出参数:调用时指定,并且可被改变和返回
  • param_name:表示参数名称;type:表示参数类型
  • [characteristics...]指定存储过程的特性;
  • routine_body是SQL代码的内容,可以用BEGIN...END来表示SQL代码的开始与结束

简单的存储过程示例:

delimiter

  • (1)这里需要注意的是DELIMITER //和DELIMITER ;两句,DELIMITER是分割符的意思,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。
  • (2)存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。
  • (3)过程体的开始与结束使用BEGIN与END进行标识。

2.创建存储函数

基本语法格式:create function func_name([func_parameter]) returns type

[characteristic...] routine_body

create function:创建存储函数的关键字;func_name:存储函数的名称;

func_parameter:存储过程的参数列表;形式如下:[IN| OUT| INOUT]param_name type

returns type表示函数返回数据的类型;characteristic指定存储函数的特性,取值与创建存储过程时相同

create function namebyzip()
returns char(50)
return (select s_name from suppliers where s_call='48075');

3.变量的使用

变量可以在子程序中声明并使用,这些变量的作用范围是在begin...and之间。

定义变量的语法格式:

declare var_name [,varname]...date _type [default value];

var_name:局部变量名称;default value:给变量提供一个默认值,可以是常数也可以是表达式,没有default,初始值为NULL

declare myparemeter int default 100;

为变量赋值的语法格式:

set var_name = expr [, var_name = expr]... ;

declare var1,var2,var3 int;
set var1=10 , var2=20;
set var3=var1+var2;

还可以通过select...into为一个或多个变量赋值,语法如下:

select col_name[,...] into var_name [,...] table_expr;

这个select语法把选定的列直接存储到对于位置的变量。

col_name:字段名称;var_name:定义变量名称;

table_expr:查询条件表达式,包括表名称和where子句。

DECLARE fruitname char(50);
DECLARE fruitprice decimal(8,2);
select f_name,f_price into fruitname,fruitprice
from fruits where fid='a1';

4.光标的使用

查询语句可能返回多条记录,如果数据累非常大,需要再存储过程和函数中使用光标来逐条读取查询结果集中的记录。光标必须在声明处理程序之前被声明,并且变量和条件在光标之前。

(1)声明光标

语法格式如下:declare cursor_name cursor for select_statement

cursor_name:光标名;select_statement:select语句的内容,返回一个用于创建光标的结果集。

declare 

(2)打开光标

语法格式如下:open cursor_name(光标名称)

open cursor_fruit;

(3)使用光标

语法格式如下:fetch cursor_name into var_name [,var_name]...{参数名称}

var_name:参数表示光标中的select语句查询出来的信息存入该参数中,必须在声明光标之前定义好。

fetch cursor_fruit into fruit_name,fruit_price;

(4)关闭光标

/*close cursor_name */
close cursor_fruit;

5.流程控制的使用

存储过程和函数中可以使用流程控制来控制语句的执行。

MySQL中可以使用IF语句、CASE语句、LOOP语句、LEAVE语句、ITERATE语句、REPEAT语句和WHILE语句来进行流程控制。每个流程中可能包含一个单独语句,或者是使用BEGIN...END构造的复合语句,构造可以被嵌套。

(1)if语句

IF语句用来进行条件判断。根据是否满足条件,将执行不同的语句。其语法的基本形式如下:

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

其中,search_condition参数表示条件判断语句;statement_list表示不同条件的执行语句。

下面是一个IF语句的示例。代码如下:

if var is nullthen select 'var is null';else select 'var is not null';
end if;

(2)CASE语句

CASE语句也用来进行条件判断,其可以实现比IF语句更复杂的条件判断。CASE语句的基本形式如下:

CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE

其中,case_value参数表示条件判断的变量;when_value参数表示变量的取值;

statement_list参数表示不同when_value值的执行语句。

CASE语句还有另一种形式。该形式的语法如下:

CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE

其中,search_condition参数表示条件判断语句;statement_list参数表示不同条件的执行语句。下面是一个CASE语句的示例。代码如下:

/*第一种格式*/
case va1when 1 then select 'va1 is 1';when 2 then select 'va1 is 2';eles select 'va1 is not 1 or 2';
end case;
/*第二种格式*/
case when va1 is null then select 'va1 is null';when va1 < 0 then select 'va1 is less than 0';when va1 > 0 then select 'va1 is greater than 0';eles select 'va1 is 0';
end case;

(3)LOOP语句

LOOP语句可以使某些特定的语句重复执行,实现一个简单循环。但是LOOP语句本身没有停止循环的语句,必须是遇到LEAVE语句等才能停止循环。 LOOP语句的语法的基本形式如下:

[begin_label:] LOOP  statement_list  END LOOP [end_label]

begin_label参数和end_label参数分别表示循环开始和结束的标志,这两个标志必须相同,而且都可以省略;statement_list参数表示需要循环执行的语句。

下面是一个LOOP语句的示例。代码如下:

declare id int default 0;
add_loop:loop
set id=id+1;if id>=10 then leave add_loop;end if;
end loop add_loop;

(4)leave语句

LEAVE语句主要用于跳出循环控制。其语法形式如下:LEAVE label ;其中,label参数表示循环的标志.下面是一个LEAVE语句的示例。代码如下:

add_num: LOOP
SET @count=@count+1;
IF @count=100 THEN
LEAVE add_num ;
END LOOP add_num ; 

(5)ITERATE语句

ITERATE语句也是用来跳出循环的语句。但是,ITERATE语句是跳出本次循环,然后直接进入下一次循环。ITERATE语句只可以出现在LOOP、REPEAT、WHILE语句内。

ITERATE语句的基本语法形式如下:ITERATE label ;下面是一个ITERATE语句的示例。代码如下:

add_num: LOOP
SET @count=@count+1;
IF @count=100 THEN
LEAVE add_num ;
ELSE IF MOD(@count,3)=0 THEN
ITERATE add_num;
SELECT * FROM employee ;
END LOOP add_num ;

该示例循环执行count加1的操作,count值为100时结束循环。如果count的值能够整除3,则跳出本次循环,不再执行下面的SELECT语句。

说明:LEAVE语句和ITERATE语句都用来跳出循环语句,但两者的功能是不一样的。LEAVE语句是跳出整个循环,然后执行循环后面的程序。而ITERATE语句是跳出本次循环,然后进入下一次循环。

(6)REPEAT语句

REPEAT语句是有条件控制的循环语句。当满足特定条件时,就会跳出循环语句。REPEAT语句的基本语法形式如下:

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

其中,statement_list参数表示循环的执行语句;search_condition参数表示结束循环的条件,满足该条件时循环结束。下面是一个REPEAT语句的示例。代码如下:

declare id int default 0;
repeat
set id=id+1;
until id>=10
end repeat ;

(7)WHILE语句

WHILE语句也是有条件控制的循环语句。但WHILE语句和REPEAT语句是不一样的。WHILE语句是当满足条件时,执行循环内的语句。WHILE语句的基本语法形式如下:

[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]

其中,search_condition参数表示循环执行的条件,满足该条件时循环执行;statement_list参数表示循环的执行语句。下面是一个WHILE语句的示例,代码如下:

declare id int default 0;
while id < 10 do
set id=id+1;
end while;

mysql case默认_MySQL知识整理10.1—存储过程和函数相关推荐

  1. mysql case默认_MySQL -- 配置文件my.cnf 的详细说明

    [client] port = 3306 socket = /tmp/mysql.sock [mysqld] ###############################基础设置########## ...

  2. mysql case默认_MySQL数据库架构和同步复制流程

    在分布式系统里面,往往制约整个系统发展的瓶颈点就是数据库,所以数据库的架构和高可用以及数据库的切分都是我们值得花大力气去学习的. 首先我们来说说数据库的架构. 1.mysql主从架构,如图: 这种架构 ...

  3. mysql 触发器 二进制_Mysql 二进制日志格式 对存储过程,函数,触发器,事件的记录方式的影响...

    触发器(TRIGGER): ROW 主上有,从上没有,复制正常,数据正常. 主上有,从上也有,复制正常,数据正常. STATEMENT/MIXED 主上有,从上没有,复制正常,数据不正常,触发器里面的 ...

  4. MySQL 学习笔记-第三篇-索引、存储过程和函数、视图、触发器

    目录 1 索引 1.1 索引简介 1.2 创建索引 1.3 删除索引 1.4 MySQL 8.0 的新特性 1 -支持降序索引 1.5 MySQL 8.0 的新特性 2 -统计直方图 2 存储过程和函 ...

  5. MySQL导出数据库、数据库表结构、存储过程及函数【用】

    一.导出数据库 我的mysql安装目录是D:\Program Files\MySQL\MySQL Server 5.5\bin\,导出文件预计放在D:\sql\ 在mysql的安装目录执行命令: my ...

  6. mysql子查询查询子字段_MySQL知识整理7.4—子查询

    数据科学探路者:MySQL知识整理7.3-连接查询​zhuanlan.zhihu.com 四.子查询 什么是子查询? 当一个查询是另一个查询的条件时,称之为子查询.子查询可以使用几个简单命令构造功能强 ...

  7. mysql 系统默认_mysql之系统默认数据库

    相关内容: 系统默认数据库information_schema,performance_schema,mysql,test  的意义 首发时间:2018-02-23 17:10 安装mysql完成后, ...

  8. mysql case 连接_mysql case when的用法是什么

    mysql case when的用法是:1.用作简单搜索,语法为[CASE [col_name] WHEN [value1]]:2.用作搜索函数,语法为[CASE WHEN [expr] THEN [ ...

  9. mysql查询触发器_mysql查看所有触发器以及存储过程等操作集合【转】

    1. mysql查询所有表: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名' AND  TAB ...

最新文章

  1. java编程游戏飞机旋转问题_用JAVA写的一个飞机游戏
  2. iOS架构篇-3 网络接口封装
  3. 用Javascript模拟微信飞机大战游戏
  4. 解决Windows10下无法对docker容器进行端口访问(端口映射的问题)
  5. ML之DS:仅需一行代码实现对某字段下的所有数值实现同一机制的改变或转换(比如全部转为str类型/全部取平方值)
  6. 信息系统项目管理师-信息安全管理考点笔记
  7. 热血致敬!曾影响几代科学巨匠的传奇经典,至今仍无人能超越!
  8. 【CodeForces - 697D】Puzzles(树形dp,期望dp)
  9. 新手配置 Jetty + Eclipse (Hot code debugging)
  10. S3C6410处理器介绍
  11. ubuntu16.04安装NIVIDIA显卡驱动,cuda8.0,cuDNN6.0以及基于Anaconda安装Tensorflow-GPU
  12. Tomcat 7 证书配置中遇到的一个问题
  13. redis watchdog_干货:Redis分布式锁的原理以及如何续期
  14. 计算机视觉图像去噪原理,AI笔记: 计算机视觉之图像滤波去噪: 原理、方法和效果比较...
  15. Ubuntu 使用微信开发者工具
  16. PS三种切图方式,干货满满,不看绝对后悔
  17. 一款高颜值的词云包让我拍案叫绝
  18. mysql时区作用_一文解决MySQL时区相关问题
  19. 干货 实例 | 数字化时代的传统行业转型升级
  20. 【Hadoop】HDFS文件写入与文件读取过程

热门文章

  1. nagios 安装步骤-1
  2. linux设备驱动开发专业论坛www.linuxdriver.cn诚征斑竹
  3. linux常用指令(持续更新)
  4. php怎样连接上数据库服务器,php怎样连接数据库
  5. java 检测表情符号_一个能在字符串中识别出 Emoji 的简单工具 (支持JavaScript和Java)...
  6. 大数据学习系列----大数据项目的思考
  7. 男人要懂得赞美女人,女人要懂得鼓励男人
  8. 被骗好多年:原来这才是大数据
  9. 译:重置/还原Windows IIs设置为默认设置
  10. C#中采用SHA1或MD5加密字符串的函数