存储过程和函数-练习题

存储过程

  1. 准备工作
CREATE DATABASE test15_pro_func;
USE test15_pro_func;

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表中
  2. 创建存储过程get_phone(),实现传入女神编号,返回女神姓名和女神电话
  3. 创建存储过程date_diff(),实现传入两个女神生日,返回日期间隔大小
  4. 创建存储过程format_date(),实现传入一个日期,格式化成xx年xx月xx日并返回
  5. 创建存储过程beauty_limit(),根据传入的起始索引和条目数,查询女神表的记录
  6. 传入a和b两个值,最终a和b都翻倍并返回
  7. 删除题目5的存储过程
  8. 查看题目6中存储过程的信息
1. 创建存储过程insert_user(),实现传入用户名和密码,插入到admin表中
DELIMITER //
CREATE PROCEDURE insert_user(IN username VARCHAR(20),IN loginPwd VARCHAR(20))
BEGIN
INSERT INTO admin(user_name,pwd)
VALUES(username,loginpwd);
END //
DELIMITER ;

2. 创建存储过程get_phone(),实现传入女神编号,返回女神姓名和女神电话
DELIMITER //
CREATE PROCEDURE get_phone(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 //
DELIMITER ;
#调用
CALL get_phone(1,@name,@phone);
SELECT @name,@phone;

3. 创建存储过程date_diff(),实现传入两个女神生日,返回日期间隔大小
DELIMITER //
CREATE PROCEDURE date_diff(IN birth1 DATETIME,IN birth2 DATETIME,OUT result INT)
BEGIN
SELECT DATEDIFF(birth1,birth2) INTO result;
END //
DELIMITER ;
#调用
SET @birth1 = '1992-09-08';
SET @birth2 = '1989-01-03';
CALL date_diff(@birth1,@birth2,@result);
SELECT @result;

4. 创建存储过程format_date(),实现传入一个日期,格式化成xx年xx月xx日并返回
DELIMITER //
CREATE PROCEDURE format_date(IN mydate DATETIME,OUT strdate VARCHAR(50))
BEGIN
SELECT DATE_FORMAT(mydate,'%y年%m月%d日') INTO strDate;
END //
DELIMITER ;
#调用
SET @mydate = '1992-09-08';
CALL format_date(@mydate,@strdate);
SELECT @strdate;

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,3);

创建带inout模式参数的存储过程
6. 传入a和b两个值,最终a和b都翻倍并返回
DELIMITER //
CREATE PROCEDURE add_double(INOUT a INT ,INOUT b INT)
BEGIN
SET a = a * 2;
SET b = b * 2;
END //
DELIMITER ;
#调用
SET @a = 3,@b = 5;
CALL add_double(@a,@b);
SELECT @a,@b;

7. 删除题目5的存储过程
DROP PROCEDURE beauty_limit;

8. 查看题目6中存储过程的信息
SHOW CREATE PROCEDURE add_double;
SHOW PROCEDURE STATUS LIKE 'add_double';

存储函数

  1. 准备工作
USE test15_pro_func;
CREATE TABLE employees
AS
SELECT * FROM atguigudb.`employees`;
CREATE TABLE departments
AS
SELECT * FROM atguigudb.`departments`;
  1. 创建函数get_count(),返回公司的员工个数
  2. 创建函数ename_salary(),根据员工姓名,返回它的工资
  3. 创建函数dept_sal() ,根据部门名,返回该部门的平均工资
  4. 创建函数add_float(),实现传入两个float,返回二者之和
1. 创建函数get_count(),返回公司的员工个数
DELIMITER //
CREATE FUNCTION get_count() RETURNS INT
BEGIN
RETURN (SELECT COUNT(*) FROM employees);
END //
DELIMITER ;
#调用
SELECT get_count();

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

3. 创建函数dept_sal() ,根据部门名,返回该部门的平均工资
DELIMITER //
CREATE FUNCTION dept_sal(dept_name VARCHAR(20)) RETURNS DOUBLE
BEGIN
RETURN (
SELECT AVG(salary)
FROM employees e JOIN departments d
ON e.department_id = d.department_id
WHERE d.department_name = dept_name
);
END //
DELIMITER ;
#调用
SELECT dept_sal('Marketing');

4. 创建函数add_float(),实现传入两个float,返回二者之和
DELIMITER //
CREATE FUNCTION add_float(num1 FLOAT,num2 FLOAT) RETURNS FLOAT
BEGIN
RETURN (SELECT num1 + num2 );
END //
DELIMITER ;
#调用
SET @num1 := 1.2,@num2 = 3.2;
SELECT add_float(@num1,@num2);
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 题目描述: 编写一个函数sum_odd(n),用于计算1到n之间所有奇数的和。其中,n是一个正整数。 函数接口定义: def sum_odd(n): 输入参数: n:一个正整数 输出参数: 返回1到n之间所有奇数的和 样例: 输入:n=10 输出:25 解释:1+3+5+7+9=25 解题思路: 本题需要编写一个求奇数和的函数,可以使用循环遍历1到n之间的所有奇数并求和,也可以使用数学公式计算。 具体实现方法如下: 方法一:使用循环遍历 1. 定义一个变量sum,用于存储奇数和的结果,初始值为。 2. 使用for循环遍历1到n之间的所有奇数,每次将奇数加到sum中。 3. 循环结束后,返回sum的值。 方法二:使用数学公式 1. 定义一个变量sum,用于存储奇数和的结果,初始值为。 2. 计算n/2的整数部分,得到m。 3. 使用公式sum = m * m,计算1到n之间所有奇数的和。 4. 如果n为奇数,则需要加上n本身,即sum = sum + n。 5. 返回sum的值。 代码实现: 方法一:使用循环遍历 def sum_odd(n): sum = for i in range(1, n+1, 2): sum += i return sum 方法二:使用数学公式 def sum_odd(n): sum = (n // 2) ** 2 if n % 2 == 1: sum += n return sum 注意事项: 1. 在使用循环遍历的方法中,需要注意循环的步长为2,以遍历所有奇数。 2. 在使用数学公式的方法中,需要注意整数除法的运算符//,以及幂运算的运算符**。 ### 回答2: 这道题目要求我们使用函数来求1到100中的奇数和。要解决这个问题,我们需要先把1到100中的奇数找出来,然后将这些奇数相加,最终输出结果。 先来看如何找出1到100中的奇数。我们可以使用for循环从1到100遍历每个数,然后判断其是否为奇数。如果是奇数,就将其加入一个列表odd_numbers中保存。 接下来,我们可以编写一个函数sum_odd_numbers来计算odd_numbers中所有元素的和。这里可以使用sum函数来计算列表元素之和。 最后,我们只需要调用sum_odd_numbers函数并输出其结果即可。完整代码如下: ``` def sum_odd_numbers(): odd_numbers = [] for i in range(1, 101): if i % 2 != 0: odd_numbers.append(i) return sum(odd_numbers) print(sum_odd_numbers()) ``` 运行程序,输出结果为2500,符合预期结果。 这道题目的解法虽然简单,但是通过这道题可以学到如何使用函数来模块化程序,使得代码更加易于维护和扩展。同时,我们还学会了如何使用for循环和if语句来快速找出满足特定条件的数值。 ### 回答3: 这道题的要求是使用函数求一个范围内所有奇数的和,具体实现可以按照如下步骤进行: 1. 定义一个函数,接收两个参数,分别为范围的起始和结束值。 2. 在函数内部,通过一个循环遍历指定范围内的所有数,判断每个数是否为奇数,如果是,则将其累加到一个变量中。 3. 最后返回累加和即可。 具体代码实现如下: ```python def sum_odd(start, end): sum = 0 for i in range(start, end+1): if i % 2 == 1: sum += i return sum ``` 可以看到,这个函数的思路非常简单,只需要判断一个数是否为奇数,然后累加即可,因此它的时间复杂度为O(n),其中n为范围内所有数的个数。 使用这个函数求解具体范围的奇数和也很简单,只需要调用函数,传入起始和结束值即可,例如: ```python print(sum_odd(1, 100)) # 输出 2500,1到100之间所有奇数的和 ``` 总之,这道题的主要思路就是使用一个循环遍历范围内的所有数,判断是否为奇数,并累加到一个变量中,最终返回累加和。使用这个思路可以解决更多类似的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值