zoukankan      html  css  js  c++  java
  • MySQL中函数和存储过程的用法与区别

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

    函数

    Mysql中函数有两种:

    • 系统函数
    • 自定义函数

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

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

    一、系统函数

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

    substring: 子字符串截取

    char_length: 字符长度

    length: 字节长度

    instr: 在什么里面

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

    insert: 字符串替换

    strcmp: 比较字符串

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

    二、自定义函数

    用户自己定义函数

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

    1. 定义函数

    定义语法

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

    2. 查看函数

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

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

    3. 删除函数

    drop function 函数名;

    4. 调用函数

    与调用系统函数一样

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

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

    5. 函数参数

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

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

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

    调用函数

    6. 函数返回值

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

    7. 函数体

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

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

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

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

    三、代码结构

    代码结构:

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

    1. 分支结构

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

    if语法

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

    函数: 比较三个数的大小

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

    2. 循环结构

    为了代码的重复执行.

    while循环

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

    需求: 求1到10之间的和

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

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

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

    存储过程

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

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

    一、使用过程

    定义语法

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

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

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

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

    二、维护过程

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

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

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

    三、过程参数

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

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

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

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

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

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

    存储过程和函数的区别:

    • 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。存储过程,功能强大,可以执行包括修改表等一系列数据库操作;用户定义函数不能用于执行一组修改全局数据库状态的操作。
    • 对于存储过程来说可以返回参数,如记录集,而函数只能返回值或者表对象。函数只能返回一个变量;而存储过程可以返回多个。存储过程的参数可以有IN,OUT,INOUT三种类型,而函数只能有IN类~~存储过程声明时不需要返回类型,而函数声明时需要描述返回类型,且函数体中必须包含一个有效的RETURN语句。
    • 存储过程,可以使用非确定函数,不允许在用户定义函数主体中内置非确定函数。
    • 存储过程一般是作为一个独立的部分来执行( EXECUTE 语句执行),而函数可以作为查询语句的一个部分来调用(SELECT调用),由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。 SQL语句中不可用存储过程,而可以使用函数。
  • 相关阅读:
    一行代码更改博客园皮肤
    fatal: refusing to merge unrelated histories
    使用 netcat 传输大文件
    linux 命令后台运行
    .net core 使用 Nlog 配置文件
    .net core 使用 Nlog 集成 exceptionless 配置文件
    Mysql不同字符串格式的连表查询
    Mongodb between 时间范围
    VS Code 使用 Debugger for Chrome 调试vue
    css权重说明
  • 原文地址:https://www.cnblogs.com/chenjiacheng/p/6522211.html
Copyright © 2011-2022 走看看