MySQL中函数和存储过程的用法与区别 函数 存储过程 存储过程和函数的区别:

存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。

Mysql中函数有两种:

  • 系统函数
  • 自定义函数

在mysql中,函数必须有返回值: 所以凡是有结果的内容都是由select去访问

函数调用: select 函数名(参数列表);

一、系统函数

在mysql中所有的字符串操作单位基本都是字符

substring: 子字符串截取

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

char_length: 字符长度

length: 字节长度

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

instr: 在什么里面

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

lpad: 左填充: 将字符串填充到指定长度(字符数)

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

insert: 字符串替换

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

strcmp: 比较字符串

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

时间日期函数: now(), unix_timestamp()

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

二、自定义函数

用户自己定义函数

函数要素: 关键字(function), 函数名, 参数列表(形参和实参), 返回值, 函数体

1. 定义函数

定义语法

create Function 函数名([形参列表]) returns 返回值的数据类型
begin
-- 函数体
-- return 返回值
end

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

2. 查看函数

函数不能像表一样查看: 但是可以查看函数创建语句: show create function 函数名;

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

函数有另外一种方式查看所有函数: show function status like ‘pattern’;

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

3. 删除函数

drop function 函数名;

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

4. 调用函数

与调用系统函数一样

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

虚拟表: dual,为了保证select的语法结构性而存在的一个虚拟表
select 1+ 1 from dual;

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

Mysql的布尔类型: mysql没有bool类型,但是有bool关键字(通过0和1来实现)

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

5. 函数参数

函数的参数: 在mysql中,对函数参数的要求可以理解为强类型语言: 必须在定义函数参数(形参)指定其数据类型, 可以有多个形参

create function test(int_1 float ,int_2 int...)

要求在调用函数的时候,必须传入对应的实际参数: 个数与类型都必须完全一致
Mysql函数中函数的参数,不存在引用传递(都是值传递), 也没有默认值(每个形参都必须传入实参)

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

调用函数

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

6. 函数返回值

函数内部(函数体) 的具体返回数据,必须与结构上指定的类型相同(returns)

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

7. 函数体

函数体没有什么特殊说明: 就是外部执行功能某一些代码进行封装.

局部变量: 在局部作用域定义的变量(结构内部)
Declare 变量名 数据类型 [其他属性]; -- 一个结构内部若要声明局部变量: 必须是在所有代码的最前面.

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

全局变量可以全局访问, 局部变量只能是函数内部访问.

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

作用域: 全局作用域是在任何地方可以直接访问, 局部只能在内部访问

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

三、代码结构

代码结构:

  • 顺序结构
  • 分支结构
  • 循环结构

1. 分支结构

if分支: 根据条件进行判断

if语法

if 条件判断 then -- then表示如果满足条件
-- 满足条件所有执行的事情
else
-- 可以再使用if进行条件判断: 有多少个if,一定有多少个end if;
-- 不满足条件所有做的事情
end if;

函数: 比较三个数的大小

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

注意: 如果使用比较判断的话: 没有”==”,只有”=”

2. 循环结构

为了代码的重复执行.

while循环

while 条件判断 do
    -- 循环体
    -- 循环条件变更
end while;

需求: 求1到10之间的和

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

循环控制: mysql中没有continue和break, 取而代之的是iterate和leave

循环名字:while 条件 do
  Iterate/leave 循环名字;
end while;

求1到指定数之间的和,但是凡是5的倍数都不要

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

存储过程

存储过程: procedure也叫做过程,是一种没有返回值的函数

函数是为了解决数据操作, 返回结果的话; 存储过程就是为了解决数据操作, 但是没有结果.

一、使用过程

定义语法

create procedure 过程名([参数列表])
begin
  -- 过程体: 与函数体完全一样(局部变量,全局变量,if分支,while循环)
end

存储过程没有返回值, 如果想显示数据,在内部使用select

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

使用过程: 过程没有返回值: select不能使用

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

过程调用: 有一个专门的关键字: call

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

二、维护过程

查看过程: 查看所有过程:show procedure status;

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

查看过程的创建语句: show create procedure 过程名;

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

存储过程不能修改: 只能删除
drop procedure 过程名;

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

三、过程参数

存储过程的参数不单有数据类型,而且还有自己的类型

  • in: 传进去, 外部(实参)将数据传递给存储过程内部使用(内部可以使用): 但是对外部变量没有影响(值传递)
  • out: 传出去, 外部只需要对内部提供一个变量名, 内部会自动事先清空变量 = null, 然后内部对变量进行操作, 最后反应到外部的变量身上.(会内部事先清空变量引用传递)
  • inout: 传进去又可以传出去(典型引用传值)

语法: create procedure 过程名(过程参数类型 参数名 数据类型,....)

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

out类型和inout类型都是类似引用传值: 意味着实参不能使用值常量,必须使用变量

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

正常调用: 三个都传入变量

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

全局变量没有访问限制: 过程内部可以访问全局变量

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

MySQL中函数和存储过程的用法与区别
函数
存储过程
存储过程和函数的区别:

存储过程和函数的区别:

  • 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。存储过程,功能强大,可以执行包括修改表等一系列数据库操作;用户定义函数不能用于执行一组修改全局数据库状态的操作。
  • 对于存储过程来说可以返回参数,如记录集,而函数只能返回值或者表对象。函数只能返回一个变量;而存储过程可以返回多个。存储过程的参数可以有IN,OUT,INOUT三种类型,而函数只能有IN类~~存储过程声明时不需要返回类型,而函数声明时需要描述返回类型,且函数体中必须包含一个有效的RETURN语句。
  • 存储过程,可以使用非确定函数,不允许在用户定义函数主体中内置非确定函数。
  • 存储过程一般是作为一个独立的部分来执行( EXECUTE 语句执行),而函数可以作为查询语句的一个部分来调用(SELECT调用),由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。 SQL语句中不可用存储过程,而可以使用函数。