mysql存储过程总结

N年没写过存储过程了,突然要写存储一下都忘记完了,现在回顾总结。
先废话的说下mysql中的变量有1.系统变量 和 2.自定义变量

  1. 系统变量:变量由系统提供,不是用户定义,属于服务器层面
    a.查看所有的系统变量: show global | session variables;
    b.查看满足条件的部分系统变量: show global | 【session】 variables like '%char%';
    c.查看指定的某哥系统变量的值: 
    select @@global | 【session】.系统变量名;
    d.为某个系统变量赋值
    方法一:
    set global | 【session】 系统变量名 = 值;
    方法二:
    set @@global | 【session】.系统变量名 = 值;
    e.全局变量
    1.查看所有的全局变量:
    SHOW GLOBAL VARIABLES;

    1. 查看部分的全局变量:
      SHOW GLOBAL VARIABLES LIKE '%char%';
      3.查看指定的全局变量的值:
      SELECT @@global.autocommit;
      SELECT @@tx_isolation;
      4.为某个指定的全局变量赋值:
      SET @@global.autocommit=0;
      f.会话变量
      1.查看所有的会话变量
      SHOW VARIABLES;
      SHOW SESSION VARIABLES;
      2.查看部分的会话变量
      SHOW VARIABLES LIKE '%char%';
      SHOW SESSION VARIABLES LIKE '%char%';
      3.查看指定的某个会话变量
      SELECT @@tx_isolation;
      SELECT @@session.tx_isolation;
      4.为某个会话变量赋值
      方式一:
      SET @@tx_isolation='read-uncommitted';
      方式二:
      SET SESSION tx_isolation='read-committed';
  2. 自定义变量: 变量是用户自定义的,不是系统的
    作用域: 针对于当前会话(连接)有效,同于会话变量的作用域。应用在任何 地方,也就是begin end里面或begin end外面
    2.1用户变量
    赋值的操作符: = 或 :=
    a.声明并初始化
    SET @用户变量名=值;
    或 SET @用户变量名:=值;
    或 SELECT @用户变量名:=值
    b.赋值(更新用户变量的值)
    方式一: 通过SET 或 SELECT
    SET @用户变量名=值;
    或 SET @用户变量名:=值;
    或 SELECT @用户变量名:=值;
    方式二: 通过SELECT INTO
    SELECT 字段 INTO @变量名 FROM 表;
    c.使用(查看用户变量的值)
    SELECT @用户变量名;

例子:
#声明并初始化
SET @name='john';
SET @name=100;
SET @count=1;
#赋值
SELECT COUNT( * ) INTO @count FROM 表名
#查看
SELECT @count;

2.2 局部变量
         作用域: 仅仅在定义它的begin end 中有效,应用在begin end中的第一句                      话
  a.声明
          DECLARE 变量名 类型;
            DECLARE 变量名 类型 DEFAULT 值;
      b.赋值
           方式一: 通过SET 或 SELECT
                         SET 局部变量名=值;
                   或  SET 局部变量名:=值;
                   或  SELECT @局部变量名:=值;
             方式二: 通过SELECT INTO
                  SELECT 字段 INTO 局部变量名 FROM 表
         c.使用
            SELECT 局部变量名;

对比用户变量和局部变量 
用户变量:
作用域: 当前会话
定义和使用的位置: 会话中的任何地方
语法: 必须加@符合,不用限定类型
局部变量:
作用域: BEGIN END中
定义和使用的位置: 只能在BEGIN END中,且为第一句话
语法: 一般不用加@符合,需要限定类型

例如: 声明两个变量并赋初始值,求和,并打印
SET @m=1;
SET @n=2;
SET @sum = @m + @n;
SELECT @sum;

存储过程:
使用存储过程的好处: 1.提高代码的重用性; 2.简化操作; 3.减少了编译次数并减少了和数据库服务器的连接次数,提高了效率
含义: 一组预先编译好的SQL语句的集合,理解成批处理语句
一. 创建语法:
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体(一组合法的SQL语句)
END
注意: 1.参数列表包含三部分:参数模式(IN、OUT、INOUT) , 参数名,参数类型
例如: IN stuname VARCHAR(20)
参数模式:
IN:该参数可以作为输入,也就是该参数需要调用方法入值
OUT:该参数可以作为输出,也就是该参数可以作为返回值
INOUT:该参数即可以作为输入又可以作为输出,也就是该参数即需要传入 值,又可以返回值
2.如果存储过程体仅仅只有一句话,BEGIN END可以省略
存储过程体中的每条SQL语句的结尾要求必须加分号。
存储过程的结尾可以使用DELMITER重新设置,语法:
DELIMITER 结束标记
例如: DELIMITER $ 
二.调用语句
CALL 存储过程名(实参列表);

     例如:
        1.空参列表
           #例:插入到admin表中五个记录
                 DELIMITER $
                 CREATE PROCEDURE myp1()
                 BEGIN
                      INSERT INTO admin(username, password)
                            VALUES('name1','1111'),('name2','1111'),('name3','1111'),('name4','1111'),('name5','1111');
                 END $

                 调用: CALL myp1() $
    2.创建带IN模式参数的存储过程
     例如: 创建存储过程实现 根据名字查询对应的信息
        CREATE PROCEDURE myp2(IN beautyName VARCHAR(20))
            BEGIN
                 SELECT tb1.*
                     FROM table1 tb1
                     RIGHT JOIN table2 tb2 on tb1.id = tb2.nameId
                     WHERE tb1.name = tb2.name
            END $
            调用: CALL myp2('姓名') $

    例如:创建存储过程实现,用户是否登陆成功
    CREATE PROCEDURE myp3(IN username VARCHAR(20), IN password VARCHAR(20))
    BEGIN
         DECLARE result INT DEFAULT 0;  #声明并初始化
             SELECT COUNT(*) INTO result #赋值
             FROM admin
             WHERE admin.username = username
             AND admin.password = password;

             SELECT IF(result>0, '成功', '失败');  #使用
    END $
    调用:  CALL myp3('name','password') $

    3.带返回值的
    例如:根据gril姓名,返回对应的boy姓名
    CREATE PROCEDURE myp5(IN grilName VARCHAR(20), OUT boyName VARCHAR(20))
    BEGIN
         SELECT b.boyName INTO boyName
             FROM boys b
             INNER JOIN gril g ON b.id = g.boy_id
             WHERE g.name = grilName;
    END $
    调用: CALL myp5('name', @bName) $
    输出: SELECT @bName$

    例如: 根据gril姓名,返回对应的boy的姓名和魅力值
    CREATE PROCEDURE myp6(IN gName VARCHAR(20),  OUT bName VARCHAR(20), OUT bCp INT)
    BEGIN
        SELECT b.boyname, b.userCp INTO bName, bCp
            FROM boys b
            INNER JOIN gril g on b.id = g.boy_id
            WHERE g.name = gName
    END $
    调用: CALL myp6(‘name’, @bName, @usercp)$
    输出: SELECT @bName, @usercp

    4.创建带INOUT模式参数的存储过程
    例如: 传入a和b两个值,最终a和b都翻倍并返回
    CREATE PROCEDURE myp8(INOUT a INT, INOUT b INT )
    BEGIN
         SET a=a*2;
             SET b=b*2;
    END $
    调用:
        SET @m=10$
            SET @n=20$
            CALL myp8(@m, @n)$
            SELECT @m,@n

#一、创建存储过程实现传入用户名和密码,插入到admin表中
CREATE PROCEDURE test_pro1(IN username VARCHAR(20), IN loginPwd VARCHAR(20))
BEGIN
       INSERT INTO admin(admin.username, admin.password)
             VALUES(username, loginPwd);
END $
#二、创建存储过程实现传入女神编号,返回女神名称和女神电话
CREATE PROCEDURE test_pro2(IN id INT, OUT name VARCHAR(20), OUT phone VARCHAR(20))
BEGIN
        SELECT b.name, b.phone INTO name,phone
                FROM gril b
                WHERE b.id = id
END $
#三、创建存储过程实现传入两个生日,返回大小
 CREATE PROCEDURE test_pro3(IN birth1 DATETIME, IN birth2 DATETIME, OUT result INT)
 BEGIN
       SELECT DATEDIFF(birth1, birth2) INTO result;
 END $
    #四、创建存储过程实现传入一个日期,格式化成为YYYY年MM月DD日并返回
    CREATE PROCEDURE test_pro4(IN mydate DATETIME, OUT strDate VARCHAR(50))
    BEGIN
       SELECT DATE_FORMAT(mydate, '%y年%m月%d日') INTO strDate;
    END $
 CALL test_pro4(NOW(), @str)$
 SELECT @str $

    #五、创建存储过程实现分页的效果
    CREATE PROCEDURE test_pro6(IN startIndex INT, IN size INT)
    BEGIN
       SELECT * FROM admin LIMIT  startIndex, size;
    END $

 3.删除存储过程
 语法: DROP PROCEDURE 存储过程名
 ![](https://s1.51cto.com/images/blog/201912/11/0dd990e41b7c87c4d79badb99502788b.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

 4.查看存储过程
 SHOW CREATE PROCEDURE 存储名称;

 

函数:
函数和存储过程的区别:
存储过程:可以有0个返回,也可以有多个返回,适合做批量插入、批量更新
函数:有且仅有1个返回,适合做处理数据后返回一个结果

一、创建语法
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
          函数体
END
注意: 
1.参数列表   包含两个部分:参数名     参数类型
2.函数体:肯定会有return语句,如果没有会报错
如果return语句没有放在函数体的最后也不报错,不建议
return 值;
3.函数体中仅有一句话,则可以省略BEGIN END
4.使用DELIMITER语句设置结束标记

二、调用语法
SELECT 函数名(参数列表)

例如:
  #1.无参有返回
    CREATE FUNCTION my1() RETURNS INT
    BEGIN
              DECLARE c INT DEFAULT 0; #定义变量
                        SELECT COUNT(*) INTO c; #赋值
                        FROM employees;
                        RETURN c;
    END $
    调用: SELECT myf1()$

    #2.有参有返回
    CREATE FUNCTION myf2(empName VARCHAR(20)) RETURNS DOUBLE
    BEGIN
          SET @sal=0; #定义用户变量
                SELECT salary INTO @sal #赋值
                FROM employees
                WHERE last_name = empName;
                RETURN @sal;
    END $

    SELECT myf2('k-ing') $

    CREATE FUNCTION myf3(deptName VARCHAR(20)) RETURNS DOUBLE
    BEGIN
        DECLARE sal DOUBLE;
            SELECT AVG(salary) INTO sal
            FROM employees e
            JOIN departments d ON e.department_id = d.department_id
            WHERE d.department_name = deptName;
            RETURN sal;
    END $

    SELECT myf3('IT')$

二、查看函数
SHOW CREATE FUNCTION 函数名;

三、删除函数
DROP FUNCTION 函数名;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值