mysql存储过程、存储函数练习题

准备数据

CREATE DATABASE test15_pro_func;
USE test15_pro_func;
CREATE TABLE admin(
id INT PRIMARY KEY AUTO_INCREMENT,
user_name VARCHAR(15) NOT NULL,
pwd VARCHAR(25) NOT NULL
);
CREATE TABLE beauty(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(15) NOT NULL,
phone VARCHAR(15) UNIQUE,
birth DATE
);
INSERT INTO beauty(NAME,phone,birth)
VALUES
('朱茵','13201233453','1982-02-12'),
('孙燕姿','13501233653','1980-12-09'),
('田馥甄','13651238755','1983-08-21'),
('邓紫棋','17843283452','1991-11-12'),
('刘若英','18635575464','1989-05-18'),
('杨超越','13761238755','1994-05-11');

存储过程

#1. 创建存储过程insert_user(),实现传入用户名和密码,插入到admin表中
DELIMITER $
CREATE PROCEDURE insert_user(IN NAME VARCHAR(15),IN pwd VARCHAR(25))
BEGIN
	INSERT INTO admin(`user_name`,`pwd`) VALUES(NAME,pwd);
END $
DELIMITER ;
CALL insert_user('赵刚','123456');
SELECT * FROM `admin`
#2. 创建存储过程get_phone(),实现传入女神编号,返回女神姓名和女神电话
#参数名不能和字段名相同,不然分不出用的哪个,除非起别名区分如方式2
#方式1
DELIMITER $
CREATE PROCEDURE get_phone(IN NO INT)
BEGIN
	SELECT `NAME`,`phone` FROM `beauty` WHERE `id`=NO;
END $
DELIMITER ;
CALL get_phone(1);
#方式2
DELIMITER $
CREATE PROCEDURE get_phone1(IN id INT,OUT NAME VARCHAR(15),OUT phone VARCHAR(15))
BEGIN
	SELECT a.`NAME` ,a.`phone` INTO NAME,phone FROM `beauty` a WHERE a.`id`=id;
END $
DELIMITER ;
CALL get_phone1(1,@name,@phone);
SELECT @name,@phone;
#3. 创建存储过程date_diff(),实现传入两个女神生日,返回日期间隔大小
DELIMITER $
CREATE PROCEDURE date_diff(IN `birth1` DATE,IN `birth2` DATE,OUT result INT)
BEGIN
	SELECT DATEDIFF(birth1,birth2) INTO result;
END $
DELIMITER ;
SET @birth1='2022-11-11';
SET @birth2='2022-11-09';
CALL date_diff(@birth1,@birth2,@result);
SELECT @result;
#4. 创建存储过程format_date(),实现传入一个日期,格式化成xx年xx月xx日并返回
DELIMITER $
CREATE PROCEDURE  format_date(IN date1 DATE,OUT result VARCHAR(20))
BEGIN
	SELECT DATE_FORMAT(date1,'%y年%m月%d日') INTO result;
END $
DELIMITER ;
CALL format_date('2022-12-12',@result);
SELECT @result;
#5. 创建存储过程beauty_limit(),根据传入的起始索引和条目数,查询女神表的记录
DELIMITER $
CREATE PROCEDURE beauty_limit(IN startindex INT ,IN size INT)
BEGIN
 SELECT * FROM `beauty` LIMIT startindex , size;
END $
DELIMITER ;
CALL beauty_limit(1,2);
#创建带inout模式参数的存储过程
#6. 传入a和b两个值,最终a和b都翻倍并返回
#方式1
DELIMITER $
CREATE PROCEDURE add_double(INOUT a INT,INOUT b INT)
BEGIN
	SELECT a*2,b*2 INTO a,b;
END $
DELIMITER ;
SET @a=3,@b=3;
CALL add_double(@a,@b);
SELECT @a,@b;
#方式2
DELIMITER $
CREATE PROCEDURE add_double1(INOUT a INT,INOUT b INT)
BEGIN
	SET a=a*2,b=b*2;
	
END $
DELIMITER ;
SET @a=4,@b=3;
CALL add_double1(@a,@b);
SELECT @a,@b;
#7.查看题目6中存储过程的信息
SHOW CREATE PROCEDURE add_double;
SHOW PROCEDURE STATUS LIKE '%add_double%';
#8.根据传入的值实现累加计算
DELIMITER $
CREATE PROCEDURE sp1(IN n INT)
BEGIN
DECLARE i INT;
DECLARE num INT;
SET i=1;
SET num=0;
WHILE i<=n DO
	SET num=num+i;
	SET i=i+1;
END WHILE;
SELECT num;
END $
DELIMITER ;
CALL sp1(50);

准备数据

CREATE TABLE `departments` (
  `department_id` int NOT NULL DEFAULT '0',
  `department_name` varchar(30) CHARACTER SET utf8 NOT NULL,
  `manager_id` int DEFAULT NULL,
  `location_id` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;



insert  into `departments`(`department_id`,`department_name`,`manager_id`,`location_id`) values (10,'Administration',200,1700),(20,'Marketing',201,1800);


CREATE TABLE `employees` (
  `employee_id` int NOT NULL DEFAULT '0',
  `first_name` varchar(20) CHARACTER SET utf8 DEFAULT NULL,
  `last_name` varchar(25) CHARACTER SET utf8 NOT NULL,
  `email` varchar(25) CHARACTER SET utf8 NOT NULL,
  `phone_number` varchar(20) CHARACTER SET utf8 DEFAULT NULL,
  `hire_date` date NOT NULL,
  `job_id` varchar(10) CHARACTER SET utf8 NOT NULL,
  `salary` double(8,2) DEFAULT NULL,
  `commission_pct` double(2,2) DEFAULT NULL,
  `manager_id` int DEFAULT NULL,
  `department_id` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;



insert  into `employees`(`employee_id`,`first_name`,`last_name`,`email`,`phone_number`,`hire_date`,`job_id`,`salary`,`commission_pct`,`manager_id`,`department_id`) values (100,'Steven','Abel','SKING','515.123.4567','1987-06-17','AD_PRES',24000.00,NULL,NULL,10),(101,'Neena','Kochhar','NKOCHHAR','515.123.4568','1989-09-21','AD_VP',17000.00,NULL,100,90);

存储函数

如果创建函数报错,先执行
mysql> SET GLOBAL log_bin_trust_function_creators = 1;

#无参有返回
#1. 创建函数get_count(),返回公司的员工个数
DELIMITER $
CREATE FUNCTION get_count()
RETURNS INT
BEGIN
 RETURN (SELECT COUNT(1) FROM `employees`);
END $
DELIMITER ;
SELECT get_count();



#有参有返回
#2. 创建函数ename_salary(),根据员工姓名,返回它的工资
DELIMITER $
CREATE FUNCTION ename_salary(NAME VARCHAR(25))
RETURNS DOUBLE
BEGIN
 RETURN (SELECT `salary` FROM `employees` WHERE `last_name`=NAME);
END $
DELIMITER ;
SELECT ename_salary('Abel');

#3. 创建函数dept_sal() ,根据部门名,返回该部门的平均工资
DELIMITER $
CREATE FUNCTION dept_sal(NAME VARCHAR(30))
RETURNS DOUBLE
BEGIN
 RETURN (SELECT AVG(`salary`) FROM `employees` JOIN `departments` USING(`department_id`) WHERE `department_name`=NAME);
END $
DELIMITER ;
SELECT dept_sal('Administration');
#4. 创建函数add_float(),实现传入两个float,返回二者之和
DELIMITER $
CREATE FUNCTION add_float(a FLOAT,b FLOAT)
RETURNS FLOAT
BEGIN
RETURN (a+b);
END $
DELIMITER ;
SET @a=4,@b=4;
SELECT add_float(@a,@b);
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【完整课件如下】 MySQL从入门到精通 第01章 初始MySQL(共19页).ppt MySQL从入门到精通 第02章 MySQL的安装与配置(共14页).ppt MySQL从入门到精通 第03章 数据库的基本操作(共11页).ppt MySQL从入门到精通 第04章 数据表的基本操作(共26页).ppt MySQL从入门到精通 第05章 数据类型和运算符(共17页).ppt MySQL从入门到精通 第06章 MySQL函数(共76页).ppt MySQL从入门到精通 第07章 查询数据(共48页).ppt MySQL从入门到精通 第08章 插入、更新与删除数据(共10页).ppt MySQL从入门到精通 第09章 索引(共11页).ppt MySQL从入门到精通 第10章 存储过程函数(共19页).ppt MySQL从入门到精通 第11章 视图(共20页).ppt MySQL从入门到精通 第12章 触发器(共11页).ppt MySQL从入门到精通 第13章 用户管理(共25页).ppt MySQL从入门到精通 第14章 数据备份与还原(共21页).ppt MySQL从入门到精通 第15章 MySQL日志(共22页).ppt MySQL从入门到精通 第16章 性能优化(共18页).ppt MySQL从入门到精通 第17章 MySQL Workbench5.2 的使用(共15页).ppt MySQL从入门到精通 第18章 MySQL Replication(共27页).ppt MySQL从入门到精通 第19章 MySQL Cluster(共49页).ppt MySQL从入门到精通 第20章 PHP操作MySQL数据库(共7页).ppt MySQL从入门到精通 第21章 MySQL实战-新闻发布系统数据库设计(共6页).ppt MySQL从入门到精通 第22章 MySQL实战-论坛管理系统数据库设计(共6页).ppt

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值