存储过程函数

MySQL 中的存储过程和存储函数是一种在数据库服务器上存储复杂逻辑方式,允许您封装和重用 SQL 代码。它们在管理复杂数据库操作和提高性能方面非常有用。以下是对它们的详细介绍

存储过程(Stored Procedures

存储过程是一组预先编译好的 SQL 语句。它们可以执行复杂业务逻辑,能够接受参数执行 SQL 语句,并返回结果

存储函数(Stored Functions

当然可以。我将提供一个简单的实际例子展示一个存储函数和一个存储过程在 MySQL 中是如何定义使用的。

区别

注释、定界符与语句

MySQL 支持单行多行注释

在 MySQL 中,默认命令定界符是分号(;)。但在编写存储过程或函数时,经常需要更改定界符,以允许在过程或函数体内使用分号。

在 MySQL 的存储过程和函数中语句块是由 BEGINEND 关键字包围的一系列语句。语句块允许将多个语句组合在一起,作为一个单元执行。语句块在逻辑上被当做一个整体对待,因此,在程序执行流程中,语句块要么被执行,要么整体都被执行!!!

  • 使用语句块: 通常用于控制流语句(如 IFLOOPWHILE内部或存储过程和函数的定义中。

    示例:

    BEGIN
        -- 多个语句
        SET a = b + c;
        IF a > 10 THEN
            -- 更多语句
        END IF;
    END;
    
  • 注释:对代码进行说明提高可读性和维护性。

  • 定界符:在编写存储过程或函数时,用于区分过程或函数体内的语句结束和整个过程或函数定义的结束。

  • 语句块:允许在存储过程和函数中组织多个语句,用于控制流和逻辑分组

在 MySQL 中,有几种不同类型变量,包括用户会话变量局部变量系统变量。它们的作用范围和用途有所不同:

变量

用户会话变量(User-Defined Session Variables

局部变量(Local Variables

  • 作用范围局部变量仅在定义它们的存储过程或函数内部有效。

  • 定义和使用

    • 在存储过程或函数中使用 DECLARE 变量名 数据类型; 来定义。
    • 使用 SET 变量名 = 值; 或直接在 SQL 语句中引用来赋值和使用。
  • 示例

    CREATE PROCEDURE myProcedure()
    BEGIN
        DECLARE myVar INT;
        SET myVar = 100;
        SELECT myVar;
    END;
    
  • 用途:用于存储过程和函数中的数据处理控制流。

  • 再来一个实例

#定义局部变total_sale,类型int,初值为0
DECLAER total_sale INT DEFAULT 0;

#同时定义x,y两个变量,类型都是int,初始为0
DECLAER X,Y INT DEFAULT 0;

#定义局部变量myname,类型为VARCHAR(10),没有初始值就为NULL
DECLAER myname VARCHAR(10);

DECLAER total_s INT DEFAULT 0;
SELECT COUNT(*) INTO total_s FROM S;
SELECT total_s;

系统变量(System Variables

运算符

算术运算符

在 MySQL 中,算术运算符表达式用于执行基本的数学运算。以下是常见的算术运算符和一些相关函数的使用示例,我将它们按照您要求的表格形式呈现

运算符/函数 用法 运算表达式 结果
+ 加法 SELECT 5 + 3; 8
- 减法 SELECT 5 - 3; 2
* 乘法 SELECT 5 * 3; 15
/ 除法 SELECT 6 / 2; 3
%MOD 求余 SELECT 5 % 2;

SELECT MOD(5, 2);
1
ABS() 取绝对值 SELECT ABS(-5); 5
CEILING()CEIL() 向上取整 SELECT CEILING(5.2); 6
FLOOR() 向下取整 SELECT FLOOR(5.8); 5
ROUND() 四舍五入 SELECT ROUND(5.45); 5
POW()POWER() 求幂 SELECT POW(2, 3); 8
SQRT() 平方根 SELECT SQRT(9); 3

这些运算符和函数可以用于 SQL 查询中的表达式,用于进行数计算转换。例如,它们可以在 SELECT 语句、WHERE 子句、或者任何需要进行数计算的地方使用。

比较运算符

在 MySQL 中,比较运算符用于进行值的比较操作,这些操作通常返回布尔值:TRUE(真)、FALSE(假)或 NULL(在比较中涉及 NULL 值时)。以下是常见比较运算符的用法、表达式及其结果表格

运算 用法 运算表达式 结果示例
= 等于 SELECT 5 = 5; TRUE
!=<> 不等于 SELECT 5 != 4; TRUE
< 小于 SELECT 4 < 5; TRUE
> 大于 SELECT 6 > 5; TRUE
<= 小于或等于 SELECT 5 <= 5; TRUE
>= 大于或等于 SELECT 5 >= 4; TRUE
BETWEEN 在两值之间 SELECT 5 BETWEEN 1 AND 10; TRUE
IN 集合 SELECT 'a' IN ('a', 'b', 'c'); TRUE
IS NULL 是 NULL 值 SELECT NULL IS NULL; TRUE
IS NOT NULL 非 NULL 值 SELECT 'a' IS NOT NULL; TRUE
LIKE 字符串匹配 SELECT 'abc' LIKE 'a%'; TRUE
NOT LIKE 字符串匹配 SELECT 'abc' NOT LIKE 'b%'; TRUE
REGEXP 正则表达式匹配 SELECT 'abc' REGEXP '^a'; TRUE
NOT REGEXP 正则表达式匹配 SELECT 'abc' NOT REGEXP '^b'; TRUE

这些比较运算符可以用于 SELECT 语句的条件中,如在 WHEREHAVING 子句中,以及在 JOIN 条件中。它们是 SQL 查询数据分析中的基本工具,用于过滤和比较数据

  • NULL 值的比较:在 SQL 中,任何与 NULL 的比较都返回 NULL。例如,SELECT 'a' = NULL; 返回 NULL。要检查 NULL 值,应使用 IS NULLIS NOT NULL
  • LIKEREGEXP:这些运算符用于字符串模式匹配LIKE 用于简单模式(其中 % 表示任意字符串_ 表示任意单个字符),而 REGEXP 用于更复杂的正则表达式匹配

在 MySQL 中,逻辑运算符和位运算符用于执行逻辑和位级运算。下面是这些运算符的用法和示例。

逻辑运算符

逻辑运算符用于组合或修改布尔表达式的结果。常见的逻辑运算符包括:

运算符 用法 运算表达式 结果示例
AND&amp;&amp; 逻辑与 SELECT TRUE AND FALSE; FALSE
OR 或 ` ` 逻辑或
NOT! 逻辑非 SELECT NOT TRUE; FALSE
XOR 逻辑异或 SELECT TRUE XOR FALSE; TRUE

逻辑运算符通常用于 WHEREHAVING 子句中,用于组合多个条件

位运算符

位运算符用于对数值二进制表示进行操作。常见的位运算符包括:

运算符 用法 运算表达式 结果示例
&amp; 位与 SELECT 6 &amp; 3; 2
` ` 位或 `SELECT 6
^ 异或 SELECT 6 ^ 3; 5
~ 位非 SELECT ~1; -2
<< 左移 SELECT 2 << 1; 4
>> 右移 SELECT 4 >> 1; 2

位运算符在处理二进制数据、进行位级操作时非常有用,例如在权限管理、标志位处理场景中。

优先级

使用数字来表示运算符优先级是一个清晰的方式。以下是 MySQL 中一些常见运算符的优先列表,用数字表示,数字越小表示优先级越高:

优先 运算符
1 BINARY, COLLATE
2 !
3 - (负号), ~ (位非)
4 ^ (位异或)
5 *, /, DIV, %, MOD
6 -, +
7 <<, >>
8 &amp;
9 `
10 = (赋值), :=
11 IS, IS NOT, IS NULL, IS NOT NULL, IS TRUE, IS FALSE
12 <=>
13 >=, >, <=, <, =, <>, !=, LIKE, REGEXP, IN
14 BETWEEN, CASE, WHEN, THEN, ELSE
15 NOT
16 AND, &amp;&amp;
17 XOR
18 OR, `

这个表格按照 MySQL 中运算符的优先顺序排列,有助于理解和编写包含多个运算符的复杂 SQL 表达式。在实际应用中,如果表达式中包含多个不同优先级的运算符,建议使用括号明确指定运算顺序,以避免潜在的混淆错误

流程控制语句

MySQL 支持多种流程控制语句,这些语句主要用于存储过程和函数中,允许执行基于条件操作重复执行一组操作。以下是 MySQL 中常见的流程控制语句及其使用方法案例

1. IF 语句

用于基于条件执行不同的代码块。

  • 语法:

    IF condition THEN
        -- 代码块 1
    ELSEIF condition2 THEN
        -- 代码块 2
    ELSE
        -- 代码块 3
    END IF; #结束的时候用end if
    
  • 示例:

    IF user_age >= 18 THEN
        SELECT 'Adult';
    ELSE
        SELECT 'Minor';
    END IF;
    

2. CASE 语句

类似于其他编程语言中的 switch 语句,根据条件选择执行不同的代码块。

3. LOOP 语句

用于无条件循环执行一组语句,直到遇到 LEAVE 语句。与while语句相反,loop语句需要再判断条件为假的时候才会继续,一定判断条件为真,就会退出循环

4. REPEAT 语句

类似于 do-while 循环,至少执行一次代码块,直到条件为真。

  • 语法:

    REPEAT
        -- 代码块
    UNTIL condition
    END REPEAT;
    
  • 示例:

    REPEAT
        SET counter = counter + 1;
    UNTIL counter > 10
    END REPEAT;
    

5. WHILE 语句

只要条件为真,就重复执行代码块。

  • 语法:

    WHILE condition DO
        -- 代码块
    END WHILE;
    
  • 示例:

    WHILE counter < 10 DO
        SET counter = counter + 1;
    END WHILE;
    

原文地址:https://blog.csdn.net/weixin_53285092/article/details/134724313

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_18107.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注