创建表格books,price;

books

b_id  

bname

author

b_date

01

大江东去

阿耐

2019-01-01

02

解忧百货店

东野圭吾

2012-03-28

price

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