• MySQL高级:函数(二)自定义函数


    自定义函数

    除了使用系统为我们提供的函数以外,我们也可以自定义函数,并使用我们自定义的函数进行数据处理,唯一比较麻烦的就是函数定义后不能修改,只能删了重新写。

    基本语法

    MySQL的函数与Java中的方法类似,也可以添加参数和返回值,可以通过CREATE FUNCTION创建函数:

    1. CREATE FUNCTION test() RETURNS INT
    2. BEGIN
    3. RETURN 666;
    4. END

    定义函数的格式为:

    • create function 函数名称([参数列表]) returns 返回值类型
    • begin 和 end 之间写函数的其他逻辑,begin和end就相当于Java中的花括号{ ... }
    • return后紧跟返回的结果

    添加参数也很简单,我们只需要在函数名称括号中添加即可,注意类型需要写在参数名称后面:

    1. CREATE FUNCTION test(i INT) RETURNS INT
    2. BEGIN
    3. RETURN i * i;
    4. END

    定义局部变量的格式为:

    • declare 变量名称 变量类型 [, ...]
    • declare 变量名称 变量类型 default 默认值

    为变量赋值的格式为:

    • set 变量名称 = 值

    我们还可以在函数内部使用select语句,它可以直接从表中读取数据,并可以结合into关键字将查询结果赋值给变量:

    1. BEGIN
    2. DECLARE a INT;
    3. -- select into from 语句
    4. SELECT COUNT(*) INTO a FROM student;
    5. RETURN a;
    6. END

    流程控制

    接着我们来看一下如何使用流程控制语句,其中最关键的就是IF判断语句:

    1. BEGIN
    2. DECLARE a INT DEFAULT 10;
    3. IF a > 10 THEN
    4. RETURN 1;
    5. ELSE
    6. RETURN 2;
    7. END IF;
    8. END

    IF分支语句的格式为:

    • if 判断条件 then  ... else if 判断条件 then .... else ... end if;

    我们可以结合exists关键字来判断是否为NULL:

    1. BEGIN
    2. DECLARE a INT DEFAULT 0;
    3. -- IF EXISTS(SELECT * FROM student WHERE sid = 100) THEN
    4. IF NOT EXISTS(SELECT * FROM student WHERE sid = 100) THEN
    5. SET a = 10;
    6. END IF;
    7. RETURN a;
    8. END

    我们也可以在函数中使用switch语句:

    1. BEGIN
    2. DECLARE a INT DEFAULT 10;
    3. CASE a
    4. WHEN 10 THEN
    5. RETURN 2;
    6. ELSE
    7. RETURN 1;
    8. END CASE;
    9. END

    SWITCH分支语句的格式为:

    • case 变量 when 具体值或是布尔表达式 then ... when * then ... else ... end case;

    与Java不同的是,它支持使用布尔表达式:

    1. BEGIN
    2. DECLARE a INT DEFAULT 10;
    3. CASE
    4. WHEN 1 < 5 THEN
    5. SET a = 5;
    6. ELSE
    7. SET a = 10;
    8. END CASE;
    9. RETURN a;
    10. END

    我们以类似于elseif的形式进行判断,其实和上面直接使用是一样的。

    我们接着来看循环语句,MySQL提供了三种循环语句,其中第一种是WHILE语句

    1. BEGIN
    2. DECLARE a INT DEFAULT 10;
    3. WHILE a < 11 DO
    4. SET a = a + 1;
    5. END WHILE;
    6. RETURN a;
    7. END

    格式为:

    • while 循环条件 do ...  end while;

    我们接着来看第二种循环语句,LOOP循环:

    1. BEGIN
    2. DECLARE a INT DEFAULT 10;
    3. lp1: LOOP
    4. SET a = a - 1;
    5. IF a = 0 THEN
    6. LEAVE lp1;
    7. END IF;
    8. END LOOP lp1;
    9. RETURN a;
    10. END

    相比while语句,我们可以使用LEAVE精准控制结束哪个循环,有点类似于goto语句:

    1. BEGIN
    2. DECLARE a INT DEFAULT 0;
    3. lp1: LOOP
    4. lp2: LOOP
    5. SET a = a + 1;
    6. IF a > 5 THEN
    7. LEAVE lp1;
    8. END IF;
    9. END LOOP lp2;
    10. END LOOP lp1;
    11. RETURN a;
    12. END

    类似于Java中的goto写法(在JavaSE阶段已经讲解过):

    1. public static void main(String[] args) {
    2. int a = 0;
    3. lp1: while (true){
    4. lp2: while (true){
    5. a++;
    6. if(a > 5) break lp1;
    7. }
    8. }
    9. System.out.println(a);
    10. }

    它的语法格式如下:

    • 循环名称 loop ...(可以插入leave语句结束) end loop 循环名称;

    接着我们来看最后一种循环语句,repeat语句:

    1. BEGIN
    2. DECLARE a INT DEFAULT 0;
    3. REPEAT
    4. SET a = a + 1;
    5. UNTIL a > 0 END REPEAT;
    6. RETURN a;
    7. END

    它类似于Java中的do-while循环语句,它会先去执行里面的内容,再进行判断,格式为:

    • repeat ... until 结束循环条件 end repeat;

    全局变量

    某些情况下,我们可以直接在一次会话中直接定义变量并使用,这时它并不是位于函数内的,这就是全局变量,它无需预先定义,直接使用即可:

    set @x = 10;

    我们可以将全局变量作为参数传递给函数:

    select test(@x);

    除了我们自己定义的全部变量以外,系统默认也有很多的变量,因此我们自己定义的变量称为用户变量,系统默认变量称为系统变量。查看系统变量的命令为:

    show GLOBAL VARIABLES

  • 相关阅读:
    阿里巴巴按关键字搜索商品 API 返回值说明
    JVM优化之垃圾收集底层算法实现
    AI人工智能Mojo语言:AI的新编程语言
    原来电商企业也能运用模型规划设计营销活动
    一文轻松掌握深度学习框架中的einsum
    【测试开发】用例篇 · 熟悉黑盒测试用例设计方法(1)等价类划分法、边界值法、判定表法
    安科瑞基于物联网技术的智能电力抄表服务平台-Susie 周
    Python自学教程4-数据类型学什么
    荧光标记氨基酸:FITC标记D-精氨酸;FITC-D-Arginine
    SAP 设置不能用ME52N修改PR,但需要PR的修改权限
  • 原文地址:https://blog.csdn.net/Leon_Jinhai_Sun/article/details/126921587