#存储过程和函数

/*

存储过程和函数类似于Java中的方法

好处:

1、提高代码重用性

2、简化操作

*/

#存储过程

/*

含义:一组编译好的SQL语句的集合,理解成批处理语句

1、提高代码的重用性

2、简化操作

3、减少了编译次数

4、减少了和数据库服务器连接次数,提高了效率

*/

#一、创建

CREATE PROCEDURE 存储过程名(参数列表)

BEGIN

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

END

注意:

1、参数列表包含3个部分

参数模式 参数名 参数类型

举例:

IN stuname VARCHAR(20)

参数模式:

IN:修饰的参数可以作为入口,也就是说该参数需要调用方传入值

OUT:修饰的参数可以作为出口,也就是说该参数可以作为返回值

INOUT:修饰的参数可以作为出口/入口,既可以传入值又可以返回值

2、如果存储过程体仅仅只有1句话,BEGIN END可以省略

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

存储过程的结尾可以使用DELIMITER重新设置

语法:

DELIMITER 结束标记

案例:

DELIMITER $

#二、调用

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

#1、空白列表

#案例:插入到admin表中5条记录

SELECT * FROM admin;

#设置结束标志

DELIMITER $

#定义

CREATE PROCEDURE myp1()

BEGIN

INSERT INTO admin(username,`password`)

VALUES('john1','0000'),('lily','0000'),('rose','0000'),('jack','0000'),('tom','0000');

END $

#如果SQLyog中运行不了,就粘贴到cmd打开girls数据库,再运行

#调用

CALL myp1()$#之后结束符号都不是;了,都换成$

SELECT * FROM admin$

#如果SQLyog中运行不了,就粘贴到cmd打开girls数据库,再运行

#2、创建带in模式参数的存储过程

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

#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('宋茜')$

#如果出现报错: Incorrect string value: '\xC1\xF8\xD1\xD2' for column 'beautyName' at row 8

#说明是字符集的问题,这时要重新设置一下字符集

SET NAMES gbk$

CALL myp2('宋茜')$#不报错了

#案例2:创建存储过程实现,用户登陆是否成功

#定义

CREATE PROCEDURE myp5(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 myp5('张飞','8888')$

#3、创建带out模式的存储过程

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

CREATE PROCEDURE myp6(IN beautyName VARCHAR(20),OUT boyname VARCHAR(20))

BEGIN

SELECT bo.boyName INTO boyName

FROM boys bo

INNER JOIN beauty b ON b.boyfriend_id=bo.id

WHERE b.name=beautyName;

END$

#调用

#第二个参数就是一个变量,不需要有值,用于接收返回值

SET @bName$#定义一个用户变量,甚至可以不定义,直接用@bName

CALL myp6('宋茜',@bName)$

SELECT @bName$#这就是男神名

#案例2:根据女神名,返回对应的男神名和男神的魅力值

CREATE PROCEDURE myp7(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT userCP INT)

BEGIN

SELECT bo.boyName,bo.userCP INTO boyName,userCP

FROM boys bo

INNER JOIN beauty b ON b.boyfriend_id=bo.id

WHERE b.name=beautyName;

END$

#调用

CALL myp7('宋茜',@bName,@usercp)$

SELECT @bName,@usercp$

#4、创建带有inout模式参数的存储过程

#案例1:传入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$

#三、存储过程的删除

/*

语法:drop procedure 存储过程名称

说明:每次只能删除一个【在SQLyog中就可以运行】

*/

DROP PROCEDURE test_prop3;

#四、查看存储过程信息

SHOW CREATE PROCEDURE myp2;

#desc myp2是错误写法

#【练习】

#练习1:创建存储过程,实现传入用户名和密码,插入到admin表中

CREATE PROCEDURE test_pro1(IN username VARCHAR(20),IN loginPwd VARCHAR(20))

BEGIN

INSERT admin(admin.username,PASSWORD)

VALUES(userName,loginPwd);

END;$#这里也可以加个分号

CALL test_pro1('admin','0000')$

SELECT * FROM admin$

#练习2:创建存储过程实现传入女神编号,返回女神名称和女神电话

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 beauty b

WHERE b.id=id;

END$

CALL test_pro2(7,@n,@p)$

SELECT @n,@p$

#练习3:创建存储过程或函数实现传入两个女神生日,返回大小

CREATE PROCEDURE test_pro3(IN birth1 DATETIME, IN birth2 DATETIME,OUT result INT)

BEGIN

SELECT DATEDIFF(birth1,birth2) INTO result;

END$

CALL test_pro3('1998-1-1',NOW(),@result)$

SELECT @result$

#练习4:创建存储过程或函数实现传入一个日期,格式化成xx年xx月xx日并返回

CREATE PROCEDURE test_pro4(IN mydate DATETIME,OUT strDate VARCHAR(50))

BEGIN

SELECT DATE_FORMAT(mydate,'%y年%m月%d日') INTO strDate;

#DATE_FORMAT将日期转换为字符串并且返回一个字符串

END$

CALL test_pro4(NOW(),@str)$

SELECT @str$

#练习5:创建存储过程或函数实现传入女神名称,返回:女神 and 男神 格式的字符串

CREATE PROCEDURE test_pro5(IN beautyName VARCHAR(20),OUT str VARCHAR(50))

BEGIN

SELECT CONCAT(beautyName,' and ',IFNULL(boyName,'null')) INTO str

FROM boys bo

RIGHT JOIN beauty b ON b.boyfriend_id=bo.id

WHERE b.name=beautyName;

END$

CALL test_pro5('宋茜',@str)$

SELECT @str$

#练习6:创建存储过程函数,根据传入的条目数和起始索引,查询beauty表的记录

CREATE PROCEDURE test_pro6(IN startIndex INT, IN size INT)

BEGIN

SELECT * FROM beauty LIMIT startIndex,size;

END$

CALL test_pro6(1,2)$#索引和id无关

mysql storage_mySQL__storage课堂笔记和练习相关推荐

  1. mysql day01课堂笔记

    mysql day01课堂笔记 1.什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么? 数据库:英文单词DataBase,简称DB.按照一定格式存储数据的一些文件的组合.顾名思义 ...

  2. mysql 学习课堂笔记 第二天(值得学习、收藏!)

    笔记来自b站 老杜带你学_mysql入门基础(mysql基础视频+数据库实战)很棒的mysql讲解,建议观看. 话不多说,开始笔记 一共四天的笔记,今天是第二天的,很高兴能给大家提供数据库笔记,这四个 ...

  3. MySQL约束课堂笔记

    今日内容 1. DQL:查询语句1. 排序查询2. 聚合函数3. 分组查询4. 分页查询2. 约束 3. 多表之间的关系 4. 范式 5. 数据库的备份和还原 DQL:查询语句 1. 排序查询* 语法 ...

  4. MySQL基础课堂笔记

    今日内容 数据库的基本概念 MySQL数据库软件 安装 卸载 配置 SQL 数据库的基本概念 1. 数据库的英文单词: DataBase 简称 : DB 2. 什么数据库?* 用于存储和管理数据的仓库 ...

  5. mysql全部加两岁,mysql数据库课堂笔记2

    1.回顾 建库建表应该注意的问题 1)首先建立数据库 2)使用数据库 3)建表 4) 插入数据 2.讲解常用查询语句 1)全字段查询 select * from sanguo; 2)单字段查询 #查询 ...

  6. MySQL约束- 基础(课堂笔记)

    # DQL:查询语句         1.排序查询                 * 语法:order by 子句                         *order by 排序字段1 排 ...

  7. (B站动力节点老杜MySQL教程)MySQL课堂笔记-day01.txt

    文章目录 文件来源/资料下载: MySQL课堂笔记-day01.txt 1.sql.DB.DBMS分别是什么,他们之间的关系? 2.什么是表? 3.学习MySQL主要还是学习通用的SQL语句,那么SQ ...

  8. (B站动力节点老杜MySQL教程)MySQL课堂笔记-day03.txt

    文章目录 文件来源/资料下载: MySQL课堂笔记-day03.txt 1.约束 1.1.唯一性约束(unique) 1.2.主键约束 1.3.外键约束 2.存储引擎?(整个内容属于了解内容) 2.1 ...

  9. (B站动力节点老杜MySQL教程)MySQL课堂笔记-day02.txt

    文章目录 文件来源/资料下载: MySQL课堂笔记-day02.txt 1.关于查询结果集的去重? 2.连接查询 2.1.什么是连接查询? 2.2.连接查询的分类? 2.3.在表的连接查询方面有一种现 ...

最新文章

  1. 序列模式挖掘、频繁项集与频繁序列
  2. demo解析 小程序node.js_小程序-demo:小程序示例
  3. python教程app下载地址_python教程
  4. 如何快速将Android库发布到JCenter
  5. cfF. Boring Queries
  6. 使用Google Test的一个简单例子
  7. linux 内核设备管理模型sysfs(入门篇)
  8. python中提取几列_自己录制的公开课视频中提取字幕(python+opencv+Tesseract-OCR)
  9. 兰州理工大学linux试题,兰州理工大学学期《电子技术》试题.doc
  10. pycharm调试debug入门
  11. 令人激动!谷歌推强化学习新框架「多巴胺」,基于TensorFlow,已开源丨附github...
  12. 【STM32】使用ST-LINK V2下载程序
  13. 计算机表格设置宽度,word表格大小调整固定单元格大小设置——想象力电脑应用...
  14. REUSE_ALV_GRID_DISPLAY_LVC函数输入参数属性的应用
  15. YoLoV5学习(4)--detect.py程序(预测图片、视频、网络流)逐段讲解~
  16. C++单例对象是什么?(单例模式)
  17. 虚拟机配置静态ip地址(VMware,linux系统)
  18. Linux学习笔记(十一):磁盘配额、磁盘阵列与逻辑卷
  19. 阿里腾讯“主战场”揭幕:马云33亿入股恒生电子
  20. private关键字使用实例

热门文章

  1. 用驴子拖宝马——怎样滥用结构体
  2. C#中的Socket编程-TCP客户端
  3. 汇编语言不带冒号标号的用法
  4. ecc加解密算法 c++_ECC加密算法的基本介绍
  5. git reset后本地拉取_一份值得收藏的 Git 异常处理清单
  6. 东南大学4系短学期matlab,东南大学短学期混凝土教学实践
  7. python中head_python学习笔记[headfirst]
  8. python编程的常用工具_小白学Python(2)——常用Python编程工具,Python IDE
  9. 拦截retrofit数据请求返回的信息来判断程序错误点
  10. java 时间段内月份_java获取某段时间内的月份列表