SQL第9篇 存储过程与函数

存储过程

含义:一组预先编译好的sql语句,可以理解成批处理语句,有点类似于函数
优点:
提高代码重用性,
简化操作,
减少编译次数和数据库服务器的连接次数,提高效率

一、创建语法

 

 create procedure 存储过程名(参数列表)
 begin

      存储过程体(一组合法的sql语句)
 end

注意:
1.参数列表包含三部分
参数模式 参数名 参数类型
举例:
in fun_name varchar(20)

参数模式
in:输入,需要调用方传入值
out:输出,可以作为返回值
inout:既可以作为输入又可以作为输出,既要传入值又可以返回值

2.加入存储过程体只有一句话,begin end 可以省略
存储过程体中的结尾必须加分号,存储过程体的结尾用delimiter重新设置
语法:
delimiter 结束标志
举例:delimiter $

二、调用方法:

CALL 存储过程名(实参列表)
in : call myp(值)  call myp(@name)  call myp(@name)$

1.空参列表

案例:向gils库中的admin表插入5条数据

 

SELECT * FROM admin; #id is AUTO_INCREMENT


DELIMITER $
CREATE PROCEDURE myp1()
BEGIN 

    INSERT INTO admin (username,`password`)
    VALUES('a','111'),('b','112'),('c','113'),
    ('d','114'),('e','115'),('f','116');
END $

CALL myp1()$

注意结束符号的使用

 

myp1-执行.png

 

插入后的结果

 

myp1.png

2.创建带in参数的存储过程

案例:创建存储过程,根据女神名查询对应的男神的信息

 

CREATE PROCEDURE myp2(IN beautyName VARCHAR(20))
BEGIN

    SELECT bo.* FROM boys bo RIGHT JOIN beauty b
    ON bo.id=b.boyfriend_id
    WHERE b.name=beautyName;
END$

CALL myp2('杨紫')$

cmd中设置字符集,显示中文。

 

myp2-in参数.png

案例:创建存储过程,用户是否登录(admin里存在即登录成功,查询个数>=1)

 

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('张飞','0000')$

if函数的使用

 

myp3.png

3.带out参数的存储过程

案例:根据女神名,返回对应的男神名

 

CREATE PROCEDURE myp5(IN beautyName VARCHAR(20),OUT girlName VARCHAR(20),OUT boyName VARCHAR(20))
BEGIN
    SELECT b.name ,bo.boyName INTO  girlName,boyName
    FROM beauty b JOIN boys bo
    ON b.boyfriend_id =bo.id
    WHERE b.name=beautyName;
END$

SET @bName$
CALL myp5('李沁',@bName)$

#或者 直接使用用户变量@bName
CALL myp5('杨紫',@bName,@boName)$
SELECT @bName,@boName$

多个out 的形式

 

多个out.png

4.带inout参数法存储过程

案例:传入a,b,将a,b翻倍并返回

 

CREATE PROCEDURE myp6(INOUT a INT , INOUT b INT)
BEGIN
    SET a=a*2;
    SET b=b*2;
END$

SET @m=10$
SET @n=20$
CALL myp6(@m,@n)$  #调用的时候传入的是变量,所以先去声明变量
SELECT @m,@n$

inout参数.png

三、删除存储过程

一次只能删除一个
语法: drop procedure 存储过程名

 

DROP PROCEDURE myp4;

四、查看存储过程信息

 

SHOW CREATE PROCEDURE myp5;

不能修改存储过程中间的sql语句,想修改的话,直接删掉重新建。

五、案例练习

1.创建存储过程或者函数,传入日期,返回xx年xx月xx日

 

CREATE PROCEDURE test_myp1(IN mydate DATETIME, OUT date_str VARCHAR(50))
BEGIN
    SELECT DATE_FORMAT(mydate,'%y年%m月%d日') INTO date_str;
END$

CALL test_myp1(NOW(),@str_date)$
SELECT @str_date$

test1.png

2.根据女神名,返回'女神名 and 男神名',如果女神没有对应的男神,返回 '女神名 and null'
与之前的多输出进行对比,看看区别与联系,concat的使用,ifnull的使用

 

DROP PROCEDURE test_myp2$
CREATE PROCEDURE test_myp2(IN beautyName VARCHAR(20),OUT str VARCHAR(50))
BEGIN
    SELECT CONCAT(beautyName ,' and ',IFNULL(bo.boyName,'null')) INTO str
    FROM beauty b LEFT JOIN boys bo
    ON b.boyfriend_id =bo.id
    WHERE b.name=beautyName;
END$


CALL test_myp2('苍老师',@result)$
SELECT @result$

concat连接.png

3.根据传入的条目数和起始索引,查询beauty表的记录

 

CREATE PROCEDURE test_myp3( IN start_index INT,IN size INT )
BEGIN 
    SELECT * FROM beauty LIMIT  start_index,size;
END$

CALL test_myp3(3,5)$

limit的使用,起始索引,显示条数;

 

limit.png

函数

含义与优点与存储过程相同
区别:
存储过程:可以有0个返回值也可以有多个返回值,适合批量插入,更新
函数:有且只有1个返回值,适合处理数据后返回一个结果

一、创建语法

 

      CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
      BEGIN

          函数体
      END

注意:
1.参数列表包含两部分:参数名 参数类型

2.函数体:肯定要有return语句,如果ruturn语句没有放在函数体最后也不报错,但是不建议
3.函数仅有一条语句,begin end 可以省略
4.使用delimiter 设置结束标记

二、调用函数

 

  SELECT 函数名(参数列表)

三、案例演示

1.无参数

返回员工个数

 

USE `myemployees`$
CREATE FUNCTION myf1() RETURNS INT
BEGIN
    DECLARE c INT DEFAULT 0;
    
    SELECT COUNT(*) INTO c
    FROM `employees`;
    
    RETURN c;
END$

SELECT myf1()$

2.有参数

根据员工名返回他的工资

 

CREATE FUNCTION myf2(employee_name VARCHAR(20)) RETURNS DOUBLE
BEGIN
    SET @sal=0;
    SELECT salary  INTO @sal
    FROM `employees`
    WHERE `last_name`=employee_name ;
    
    RETURN @sal;
END$

SELECT myf2('Kochhar')$

3.根据部门名返回该部门的平均工资

 

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

SELECT myf3('Exe')$

三、查看与删除

 

SHOW CREATE FUNCTION myf3;
DROP FUNCTION myf3;



 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值