MYSQL存储过程基础入门教程

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MYSQL存储过程基础入门教程
#创建一个简单的存储过程
 
DELIMITER $$
CREATE PROCEDURE selectStu()
BEGIN 
   SELECT * FROM stu WHERE id = 3;
END ;
 
$$
 
DELIMITER;   
 
-- 调用存储过程
CALL selectStu();
 
#存储过程多个 查询
DELIMITER $$ 
CREATE PROCEDURE selectStuAndTeaAll()
BEGIN 
   SELECT * FROM stu WHERE id = 8;
   SELECT * FROM tea WHERE id = 2;
END ;
$$
DELIMITER;
-- 调用存储过程会出现 两个结果集
CALL selectStuAndTeaAll();
 
 
# 存储过程的 变量 使用
DELIMITER $$
CREATE PROCEDURE finalSelectStu()
BEGIN 
   DECLARE name_stu VARCHAR(20) DEFAULT '';
   SET name_stu = '默认值';
   SELECT `name` INTO name_stu FROM stu WHERE id = 1;
   SELECT name_stu;
END ;
$$
DELIMITER;  
-- 调用存储过程  以前一直出错  可能出现字符集问题。
CALL    finalSelectStu();
 
   
# 存储过程出现多个代码块
 
DELIMITER $$
CREATE PROCEDURE selectStuAndTeaMinMax()
BEGIN
   BEGIN
      DECLARE sum_stu INT DEFAULT 0;
      DECLARE sum_tea INT DEFAULT 0;
      SELECT COUNT(*) INTO sum_stu FROM stu ;
      SELECT COUNT(*) INTO sum_tea FROM tea;
      SELECT sum_stu,sum_tea;
   END; 
   BEGIN 
      -- 记得数据类型要一直 我这里出现的错误
      DECLARE regStuMax_time  TIMESTAMP;
      DECLARE regStuMin_time  TIMESTAMP;
      SELECT MAX(TIMESTAMP) ,MIN(TIMESTAMP) INTO regStuMax_time,regStuMin_time FROM stu;
   END ;   
END;
$$
DELIMITER;
-- 调用存储过程
CALL selectStuAndTeaMinMax()
 
# 存储过程传入参数 IN
 
DELIMITER $$
-- 传参 ( IN stuId INT) in不写默认
CREATE PROCEDURE parameterSelectStu(stuId INT)
BEGIN 
   
   DECLARE name_stu VARCHAR(20) DEFAULT '';
   SELECT `name` INTO name_stu FROM stu WHERE id = stuId;
   SELECT name_stu;
END;
$$
DELIMITER;   
-- 调用存储过程
CALL parameterSelectStu(5);
 
#存储过程传出参数 OUT
DELIMITER $$
CREATE PROCEDURE outStuName(IN stuId INT,OUT stuName VARCHAR(20))
BEGIN 
   SELECT `name` INTO stuName FROM stu WHERE id = stuId;
   SELECT stuName;
END;
$$
DELIMITER;   
-- 调用存储过程,注意参数
CALL outStuName(2,@stuName);
 
# 存储过程 可变参数 INOUT 的使用,即是传入参数又是传出参数
DELIMITER $$
CREATE PROCEDURE inoutStuIdName(INOUT stuId INT ,INOUT stuName VARCHAR(20))
BEGIN 
   SELECT id,`name` INTO stuId,stuName FROM stu WHERE id = stuId;
   SELECT stuId,stuName;
END;
$$
DELIMITER;   
-- INOUT 不会调用啊 (还是百度的啊)
SET @stuIds = 8;
SET @stuNames = '';
CALL inoutStuIdName(@stuIds,@stuNames);
 
 
# 存储过程的条件语句
DELIMITER $$
CREATE PROCEDURE ifElseStu(IN stuId INT)
BEGIN 
   DECLARE stuName VARCHAR(20) DEFAULT '';
   -- 注意 这里不是 ==  是 = 在这里错过
   IF(stuId%2=0)   
   THEN 
     SELECT `name` INTO stuName FROM stu WHERE id = stuId;
     SELECT stuName;
   ELSE
     SELECT stuId;
   -- 注意在这里是 end if 在这里错过  
   END IF;
END;
$$
DELIMITER;       
-- 调用存储过程   
CALL  ifElseStu(2);  
   
# 案例  如果 = 5 字段age + 10 ;如果id = 9 字段 age - 10 ;其他都+100   
 
-- 修改前  id= 5 age = 33 ,id=9 age= 53
DELIMITER $$
CREATE PROCEDURE topIfThen(IN stuId INT)
BEGIN 
   DECLARE stuAge INT DEFAULT 0;
   SELECT age INTO stuAge FROM stu WHERE id = stuId;
   --  如果age = 55 加10 
   IF(stuAge = 55)
   THEN
     UPDATE stu SET age=stuAge + 10 WHERE id = stuId;
   -- 如果 age = 33 减 10;  
   ELSEIF (stuAge = 33)
     UPDATE stu SET age=stuAge - 10 WHERE id = stuId; 
   -- 其他情况加  30  
   ELSE    
     UPDATE stu SET age = stuAge + 30 WHERE id = stuId;
   END IF ;
END;
$$
DELIMITER; 
 
 
#WHILE 循环语句
DELIMITER $$
CREATE PROCEDURE whileStu()
BEGIN 
   DECLARE i INT DEFAULT 0;
   WHILE (i < = 10) DO
     BEGIN 
       SELECT i;
       SET i = i+1;
       INSERT INTO stu (age) VALUES(2); 
       END;
     END WHILE;
END;
$$
DELIMITER;       
 

/*
SQLyog Ultimate v11.27 (32 bit)
MySQL - 5.5.56 : Database - test
*********************************************************************
*/
 
 
/*!40101 SET NAMES utf8 */;
 
/*!40101 SET SQL_MODE=''*/;
 
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`test` /*!40100 DEFAULT CHARACTER SET utf8 */;
 
USE `test`;
 
/*Table structure for table `stu` */
 
DROP TABLE IF EXISTS `stu`;
 
CREATE TABLE `stu` (
  `id` int(36) NOT NULL AUTO_INCREMENT,
  `name` varchar(12) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  `reg` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;
 
/*Data for the table `stu` */
 
insert  into `stu`(`id`,`name`,`age`,`reg`) values (1,'荀攸',10,'2017-10-26 15:16:58'),(2,'郭嘉',10,'2017-10-26 16:07:26'),(3,'庞统',10,'2017-10-26 16:07:26'),(4,'刘备',10,'2017-10-26 16:07:26'),(5,'曹操',10,'2017-10-26 16:07:26'),(6,'孙权',10,'2017-10-26 16:07:26'),(7,'陆逊',10,'2017-10-26 16:07:26'),(8,'孙浩',10,'2017-10-26 16:07:26'),(9,'周瑜',10,'2017-10-26 16:07:26'),(10,'张飞',10,'2017-10-26 15:23:38'),(11,'张苞',10,'2017-10-26 16:07:26'),(12,'关羽',10,'2017-10-26 16:07:26'),(13,'赵子龙',10,'2017-10-26 16:07:26');
 
/*Table structure for table `tea` */
 
DROP TABLE IF EXISTS `tea`;
 
CREATE TABLE `tea` (
  `id` int(32) NOT NULL AUTO_INCREMENT,
  `name` varchar(6) DEFAULT NULL,
  `age` int(5) DEFAULT NULL,
  `reg` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;
 
/*Data for the table `tea` */
 
insert  into `tea`(`id`,`name`,`age`,`reg`) values (1,'李斯',23,'2017-07-31 09:05:50'),(2,'蒙恬',85,'2017-09-12 09:05:56'),(3,'嬴政',45,'2017-09-18 09:06:00'),(4,'吕不韦',56,'2017-07-12 09:06:04'),(5,'嫪毐',75,'2017-10-09 09:06:09'),(6,'吴广',63,'2017-10-18 09:06:12'),(7,'项羽',78,'2017-12-08 09:06:15'),(8,'刘邦',22,'2018-01-19 09:06:19'),(9,'萧何',33,'2018-01-19 09:06:23'),(10,'张良',55,'2017-05-16 09:06:27'),(11,'赵高',68,'2017-07-03 09:06:32'),(12,'韩信',67,'2017-10-09 09:06:36'),(13,'吕后',13,'2017-10-02 09:06:39');
 
/* Procedure structure for procedure `finalSelectStu` */
 
/*!50003 DROP PROCEDURE IF EXISTS  `finalSelectStu` */;
 
DELIMITER $$
 
/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `finalSelectStu`()
begin 
   declare name_stu varchar(20) default '';
   set name_stu = '默认值';
   select `name` into name_stu from stu where id = 1;
   select name_stu;
end */$$
DELIMITER ;
 
/* Procedure structure for procedure `ifElseStu` */
 
/*!50003 DROP PROCEDURE IF EXISTS  `ifElseStu` */;
 
DELIMITER $$
 
/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `ifElseStu`(in stuId int)
begin 
   declare stuName varchar(20) default '';
   if(stuId%2=0)   
   then 
     select `name` into stuName from stu where id = stuId;
     select stuName;
   else
     select stuId;
   end if;
end */$$
DELIMITER ;
 
/* Procedure structure for procedure `inoutStuIdName` */
 
/*!50003 DROP PROCEDURE IF EXISTS  `inoutStuIdName` */;
 
DELIMITER $$
 
/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `inoutStuIdName`(inout stuId int ,inout stuName varchar(20))
begin 
   select id,`name` into stuId,stuName from stu where id = stuId;
   select stuId,stuName;
end */$$
DELIMITER ;
 
/* Procedure structure for procedure `outStuName` */
 
/*!50003 DROP PROCEDURE IF EXISTS  `outStuName` */;
 
DELIMITER $$
 
/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `outStuName`(in stuId int,out stuName varchar(20))
begin 
   select `name` into stuName from stu where id = stuId;
   select stuName;
end */$$
DELIMITER ;
 
/* Procedure structure for procedure `parameterSelectStu` */
 
/*!50003 DROP PROCEDURE IF EXISTS  `parameterSelectStu` */;
 
DELIMITER $$
 
/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `parameterSelectStu`(stuId int)
begin 
   
   declare name_stu varchar(20) default '';
   select `name` into name_stu from stu where id = stuId;
   select name_stu;
end */$$
DELIMITER ;
 
/* Procedure structure for procedure `selectStu` */
 
/*!50003 DROP PROCEDURE IF EXISTS  `selectStu` */;
 
DELIMITER $$
 
/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `selectStu`()
begin 
   select * from stu where id = 3;
end */$$
DELIMITER ;
 
/* Procedure structure for procedure `selectStuAndTeaAll` */
 
/*!50003 DROP PROCEDURE IF EXISTS  `selectStuAndTeaAll` */;
 
DELIMITER $$
 
/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `selectStuAndTeaAll`()
begin 
   select * from stu where id = 8;
   select * from tea where id = 2;
end */$$
DELIMITER ;
 
/* Procedure structure for procedure `selectStuAndTeaMinMax` */
 
/*!50003 DROP PROCEDURE IF EXISTS  `selectStuAndTeaMinMax` */;
 
DELIMITER $$
 
/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `selectStuAndTeaMinMax`()
begin
   begin
      declare sum_stu int default 0;
      declare sum_tea int default 0;
      select count(*) into sum_stu from stu ;
      select count(*) into sum_tea from tea;
      select sum_stu,sum_tea;
   end; 
   begin 
      declare regStuMax_time  timestamp;
      declare regStuMin_time  timestamp;
      select max(timestamp) ,min(timestamp) into regStuMax_time,regStuMin_time from stu;
   end ;   
end */$$
DELIMITER ;
 
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(2)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
2天前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(1)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
6天前
|
存储 关系型数据库 MySQL
MySql创建带事务操作的存储过程
MySql创建带事务操作的存储过程
|
16小时前
|
存储 关系型数据库 MySQL
MYSQL--存储过程操作
MYSQL--存储过程操作
|
17小时前
|
存储 SQL 关系型数据库
MySQL存储过程和存储函数的使用
MySQL的存储过程和存储函数在功能和用法上有明显的区别。存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,通过指定名称和参数(如果有)来调用执行,可以返回多个值或结果集,但不直接返回值。而存储函数则是一个有返回值的特殊存储过程,它返回一个值或表对象,可以直接嵌入SQL语句中使用,如SELECT语句中。两者都是为了提高SQL代码的重用性和性能,但使用场景和方式有所不同。
|
2天前
|
存储 关系型数据库 MySQL
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(4)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
2天前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(3)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
7天前
|
存储 关系型数据库 MySQL
MySQL数据库——存储过程-条件处理程序(通过SQLSTATE指定具体的状态码,通过SQLSTATE的代码简写方式 NOT FOUND)
MySQL数据库——存储过程-条件处理程序(通过SQLSTATE指定具体的状态码,通过SQLSTATE的代码简写方式 NOT FOUND)
8 0
MySQL数据库——存储过程-条件处理程序(通过SQLSTATE指定具体的状态码,通过SQLSTATE的代码简写方式 NOT FOUND)
|
1天前
|
SQL 关系型数据库 MySQL
MySQL中如何查看所有数据库的名称?
【6月更文挑战第12天】MySQL中如何查看所有数据库的名称?
12 3
|
2天前
|
关系型数据库 数据管理 数据库
数据管理DMS产品使用合集之如何极速恢复RDS(关系型数据库服务)中的数据表
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。