文章目录

  • 存储过程和函数
    • 1、存储过程
      • 1.1 含义
      • 1.2 创建存储过程
      • 1.3 调用语法
      • 1.4 简单使用
      • 1.4 删除存储过程(命令删除)
      • 1.5 查看存储过程
        • 例题补充
    • 2、函数
      • 2.1 含义
      • 2.2 创建函数
      • 2.3 调用函数
      • 2.4 使用实例
      • 2.5 查看函数
      • 2.6 删除函数
    • 3、存储过程和函数的区别

存储过程和函数

类似于java中的方法,可以提高代码的复用性,简化操作,减少了编译次数,并且减少了和数据库服务器的连接次数,提高了效率。

1、存储过程

1.1 含义

一组预先编译好的sql语句的集合,可以理解成批处理语句

  • 优点:
  1. 存储过程可以把复杂逻辑封装在一个单元中
  2. 存储过程可以回传值,并可以接收参数
  3. 存储过程可以用在数据检验和业务逻辑实现

1.2 创建存储过程

# 更改sql语句的结束符号为$$
delimiter $$
# 创建存储过程
create procedure 存储过程名(参数列表)
begin存储过程体(一组合法的sql语句);
end
$$
# 将sql语句的结束标记重新设为分号
delimiter ;

注意:
1、参数列表中包含三个部分:参数模式 参数名 参数类型

  • 参数模式

    • IN:该参数可以作为输入,也就是该参数需要调用方法传入值
    • OUT:该参数可以作为输入,也就是该参数可以作为返回值
    • INOUT:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值

举例
in stuname varchar(20);


2、如果存储过程体中仅仅只有一句话,那么begin…end可以省略


3、存储过程体中的每条sql语句的结尾要求必须加分号。


4、存储过程的结尾需要delimiter设置结束标记,这个结束标记的符号可以自己定义,作用是更改sql语句的结束符,如下
语法:delimiter 结束标记
案例:delimiter $$
记得最后重新将分号设置为结束符。

为什么要改分隔符

1.3 调用语法

call 存储过程名(实参列表);

1.4 简单使用

# ======================================
# 案例1:空参的存储过程,往admin表中插入五条记录
# 创建admin表
CREATE table admin(id INT PRIMARY KEY,username VARCHAR(20),password INT
);# 往admin表中插入一些初始值
INSERT INTO admin(id,username,password) values(1,'jack',123321),(2,'rose',234432);# 创建存储过程
delimiter $$
CREATE PROCEDURE my_data()
BEGIN
INSERT INTO admin(id,username,password) values(6,'jack',123),(7,'rose',123),(3,'john',123),(4,'lily',121),(5,'hark',1321);
END
$$
delimiter ;# 调用存储过程
call my_data();# =========================================
# 带in模式的存储过程
# 案例1:
delimiter $$
create PROCEDURE in_param(IN p_in INT)
BEGIN
SELECT p_in;
END
$$# 设置变量并赋值
SET @p_in=3;# 调用存储过程
call in_param(@p_in);
# 等同于
# CALL in_param(3);#-------------------------------------# 案例2:
# 创建一个boys表
CREATE TABLE boys(id INT PRIMARY KEY,name VARCHAR(10) NOT NULL,age INT NOT NULL
);INSERT INTO boys VALUES(1,'鹿晗',30);
INSERT INTO boys VALUES(2,'胡歌',30);
INSERT INTO boys VALUES(3,'陈晓',30);# 设置结束符为$$
delimiter $$# 创建存储过程
CREATE PROCEDURE myStorage(IN boyName varchar(10))
BEGINSELECT bo.*FROM boys boWHERE bo.name = boyName;
END
$$# 调用存储过程
CALL myStorage('陈晓');# 如果参数名和列名一样,那么可以通过表名.列名的方式来区分#======================================
# 带out模式的存储过程
# 使用前面创建过的boy表做案例
# 案例1
delimiter $$
CREATE PROCEDURE myStorage_2(IN boyName VARCHAR(10),OUT boyAge INT)
BEGINSELECT bo.ageFROM boys boWHERE bo.name = boyName;
END
$$delimiter ;# 根据传入的参数‘鹿晗',获取返回值,返回值用一个变量接收
CALL myStorage_2('鹿晗',@bName);
SELECT @bName; # 结果:30# =========================================
# 带inout模式参数的存储过程
# 案例:传入a和b两个值,最终a和b都翻倍并返回
delimiter $$
CREATE PROCEDURE myStorage_3(INOUT a INT, INOUT b INT)
BEGINSET a=a*2;SET b=b*2;
END
$$delimiter ;# 定义用户变量(变量还要用来接收返回值)
SET @m=10;
SET @n=15;
CALL myStorage_3(@m,@n);SELECT @m,@n; #20,30

1.4 删除存储过程(命令删除)

drop procedure 存储过程名

1.5 查看存储过程

show create procedure 存储过程名;

例题补充

# 创建存储过程或函数实现传入一个日期,格式化成xx年xx月xx日的形式并返回
delimiter $$
CREATE PROCEDURE myTest_1(IN mydate DATETIME,OUT strDate VARCHAR(30))
BEGINSELECT DATE_FORMAT(mydate,'%y年%m月%d日') INTO strDate;
END
$$delimiter ;CALL myTest_1(now(),@str);
SELECT @str;

2、函数

2.1 含义

和存储过程差不多,同样是一组预先编译好的sql语句的集合,可以理解成批处理语句。

2.2 创建函数

create function 函数名(参数列表) returns 返回类型
begin函数体
end

注意
(1)参数列表包含两部分:参数名,参数类型
(2)函数体肯定会包含return语句,如果没有会报错。如果return语句没有放在函数体的最后并不会报错。
(3)函数体中仅有一句话时则可以省略begin end
(4)同样使用delimiter语句设置结束标记,格式delimiter 结束标记

2.3 调用函数

select 函数名(参数列表);

2.4 使用实例

# 创建一个employees表(里面有四条数据)
CREATE TABLE employees(id INT PRIMARY KEY,name varchar(20) NOT NULL,salary INT NOT NULL
);INSERT INTO employees values(1,'jack',1234),(2,'tom',1234)
,(3,'sily',1234),(4,'rose',1234);# =========================================
# 1、无参数有返回值
# 案例:返回员工的个数
delimiter $$CREATE FUNCTION numbers() RETURNS INT
deterministic # 用于表示这是确定性函数,不使用的话会报1418的错误
BEGINDECLARE c INT DEFAULT 0; # 定义变量SELECT COUNT(*) INTO c # 赋值FROM employees;# 返回值RETURN c;
END
$$delimiter ;# 调用函数
SELECT numbers();# 2、有参有返回
# 案例:根据员工名,返回工资
delimiter $$
CREATE FUNCTION fun_1(empName VARCHAR(20)) RETURNS INT
DETERMINISTIC
BEGINSET @sal=0; # 定义一个用户变量SELECT salary INTO @sal # 赋值FROM employeesWHERE name=empName;RETURN @sal;
END
$$
delimiter ;SELECT fun_1('rose');

2.5 查看函数

show create function 函数名;

2.6 删除函数

drop function 函数名;

3、存储过程和函数的区别

(1)存储过程可有0个返回,也可以有多个返回;函数有且仅有一个返回。
(2)存储过程适合做批量插入、批量更新;函数适合做处理数据后返回一个结果

mysql数据库基础:存储过程和函数相关推荐

  1. Mysql数据库基础知识(五)之:视图、变量、存储过程、函数、流程控制结构

    第一部分:Mysql数据库基础知识(一)之 基础查询----分组查询 第二部分:Mysql数据库基础知识(二)之 连接查询----子查询-----分页查询------union联合查询 第三部分:My ...

  2. Linux Mysql 数据库基础

    目录 Linux Mysql 数据库基础 一.数据库 数据库简介 数据库的分类 数据库的发展史 数据库系统发展阶段 DBMS 数据库管理系统 数据库管理系统的优点 数据库管理系统的基本功能 数据库系统 ...

  3. Mysql数据库基础第八章:窗口函数和公用表表达式(CTE)

    Mysql数据库基础系列 软件下载地址 提取码:7v7u 数据下载地址 提取码:e6p9 mysql数据库基础第一章:(一)数据库基本概念 mysql数据库基础第一章:(二)mysql环境搭建 mys ...

  4. MySQL数据库基础(一)

    MySQL数据库基础 一.数据库的基本概念 1.1数据的时代 1.2 数据库的发展史 1.2.1 文件管理系统的缺点 1.3 DBMS 数据库管理系统 1.4 数据库管理系统的优点 1.5数据库管理系 ...

  5. Mysql数据库基础入门教程

    Mysql数据库基础入门教程 课程链接:https://www.bilibili.com/video/BV1Qb411x7Yc?p=1 2022/1/22start 一.数据库简介 1.什么是数据库? ...

  6. MySQL数据库基础(五)——SQL查询

    MySQL数据库基础(五)--SQL查询 一.单表查询 1.查询所有字段 在SELECT语句中使用星号""通配符查询所有字段 在SELECT语句中指定所有字段 select fro ...

  7. MySQL数据库基础01 韩顺平 自学笔记

    MySQL数据库基础 数据库简单原理图 连接Mysql 启动和关闭mysql服务 连接Mysql指令 数据库三层结构 数据在数据库中的存储方式 SQL语句的分类 简单通过Java操作Mysql数据库 ...

  8. 【笔记】——MySQL数据库——基础知识-——快速回顾——(加深印象篇)

    文章目录 前言 一.MySQL是什么? 二.数据库的常见概念 三.数据库存储数据的特点 四.SQL语言的分类 1.)DML 2.)DDL 3.)DCL 五.数据库的基本操作 5.1.)创建数据库 5. ...

  9. 使用C语言访问MySQL数据库基础

    使用C语言访问MySQL数据库基础 一.MySQL管理 包含在MySQL发行版中的一些有用的工具程序使管理工作变得相当容易. 除mysqlshow命令以外,所有的MySQL命令都接受所示的3个标准参数 ...

  10. 数据库|MySQL数据库基础(一)

    欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 欢迎加入团队圈子!与作者面对面!直接点击! 问题描述 数据的储 ...

最新文章

  1. 系统架构师-基础到企业应用架构-表现层
  2. About darwin OS
  3. python PyQt5 QSplitter类(可拉伸区域分隔器)
  4. (轉貼) Embedded System與System on Chip的差異 (IC Design)
  5. 半监督学习之数据加载
  6. curl命令java_Java 应用线上问题排查思路、工具小结
  7. 天天用Redis,持久化方案你又知道哪些?
  8. linux挂载硬盘的分区创建,Linux 新增硬盘、新建分区、格式化硬盘、挂载硬盘的操作...
  9. vue实战案例:用学过的知识做一个小demo
  10. MySQL · 答疑解惑 · MySQL Sort 分页
  11. Atiti.ui原理与gui理论
  12. 多商户商城小程序系统(附微信抖音小程序商城分销系统源码)
  13. 微信小程序获取屏幕高度
  14. fireFox post请求插件,火狐浏览器插件
  15. 2010-2019中国企业所有跨国并购数据
  16. 华为模拟器eNSP练习题 - Hybrid
  17. 2005年10月--至今,开发过的项目
  18. mysql升级8.0后,项目遇到的坑
  19. ofd格式转pdf用什么软件?试试这几个转换软件
  20. 阿里云服务器ECS实例规格性能区别及选择攻略

热门文章

  1. 海尔android 电视直播软件,海尔智能电视如何安装直播软件看直播
  2. 三角函数与代数恒等式(1)
  3. 戴尔服务器显示器接口类型,戴尔推出UltraSharp U4021QW显示器 采用雷电3接口和5K×2K曲面屏...
  4. Ubuntu 20.04 多GPU,涡轮GPU 风扇转速手动调节
  5. 对象存储入门 [ minIo ozone ]
  6. Ceph 分布式存储架构解析与工作原理
  7. 摆脱“咖喱味”,让Win11的右键菜单回归经典
  8. Java第三章(数组)
  9. matlab ols hac,R语言中实现广义相加模型GAM和普通最小二乘(OLS)回归
  10. Masked Image Modelling(MAE,iBOT,Data2vec,SimMIM,CAE,BEVT)