创建表格books,price;
b_id | bname | author | b_date |
01 | 大江东去 | 阿耐 | 2019-01-01 |
02 | 解忧百货店 | 东野圭吾 | 2012-03-28 |
b_id | b_price |
01 | 100 |
02 | 50 |
#b_date:出版时间
#notes:若要设置存储过程或自定义函数,首先运行以下语句,为了不发生执行错误
set global log_bin_trust_function_creators=TRUE;
问题:
根据books数据,输入作者名,得到作者的书的价格?(假定一个作者一本书的情况)
分别用存储过程以及自定义函数写
解答:
①用存储过程写
思路:
存储过程:首先先把每一个查询语句即步骤写出来,再做封装,定义存储字段
步骤1:输入作者名那就是表books的author,例如阿耐,得出b_id=01
步骤1语句:select b_id from books where author="作者名";.
步骤2:根据步骤1得出的b_id查出价格,表price中的字段b_price,得出b_price=100;
步骤2语句:select b_price from price where b_id =01;
输入:
#注意以下创建字段一起选中运行
create procedure proc_maxprice(zuozheming varchar(10))#创建存储过程
begin
declare book_id int;#创建字段名book_id对应books表中的b_id字段名
#封装步骤
#步骤1的作者名替换为zuozheming,b_id 传入 book_id,使用into;
select b_id into book_id from books where author=zuozheming;
#步骤2,步骤1的结果b_id替换为book_id,即01替换为book_id
select b_price from price where b_id=book_id;
end;
#调用存储过程
call proc_maxprice("阿耐");
②用自定义函数写
思路:
自定义函数首先先确定函数内的参数以及它的数据类型
我们使用什么字段可以得到结果
因为函数调用是使用select语句且函数只返回一个值,所以确定查询表格及返回值
步骤:
#第一步,先确定函数内的参数,即对应books表格中的字段author
参数:作者名 数据类型
#第二步,除第一步需要的字段,还需要查询表的其他字段,即books表格中的b_id,price表的b_price,这里叫做定义变量
变量:书id 数据类型:int 价格 数据类型:int
#第三步,确定调用函数时,语句中的查询表以及返回值以及数据类型
#查询表,因为是根据作者名得到价格,所以没有查询表。所以语句为
select func_get_price() ;
returns int
return 价格
#注意以下创建字段一起选中运行
create function func_get_price(zuozheming varchar(10))#创建自定义函数
returns int#返回值的类型
begin
declare book_price int;
declare book_id int;
select b_id into book_id from books where author=zuozheming;
select b_price into book_price from price where b_id=book_id;
return book_price;#函数返回值只有一个
end;
#调用函数
select func_get_price("阿耐");
可创建表,自行练习,代码如下
#创建表books并写入数据
create table books(b_id int,bname varchar(10),author varchar(10),b_date date);
insert into books values
(01,"大江东去","阿耐","2019-01-01"),
(02,"解忧百货店","东野圭吾","2012-03-28");
#创建表price并写入数据
create table price(b_id int,b_price int);
insert into price values
(01,100),
(02,50);