MySQL-存储过程(数据类型、函数)
⽂章⽬录
MySQL存储过程
使⽤环境: 8.0.12 MySQL+win10,不同环境可能会有些许差异。
⼀、存储过程与函数
存储过程类似于函数,把⼀段代码封装起来,当要执⾏这⼀段代码时候,可以通过调⽤该存储过程来实现,在封装的语句体⾥⾯,可以⽤if/else,case,while等控制结构,可以进⾏sql编程。
与函数不同的是,创建关键字不同,函数使⽤create function 函数名创建,存储过程使⽤create procedure 存储过程名字创建。
另⼀⽅⾯,存储过程没有返回值,函数最后使⽤return 变量名返回。
⼆、命令⾏结束标志符号
默认情况下,mysql的结束标志符delimiter是分号‘;’,输⼊分号后回车,mysql将会提交命令。在存储过
程使⽤中,默认的结束标志符会与存储过程语句中的分号冲突,导致存储过程语句未执⾏完就提交,进⽽就报错了。所以在创建存储过程前,我们⼀般会声明标志符为其他符号。⽐如‘$’,当然其他符号也可以。
注意delimiter声明语句后⾯没有分号‘;’
delimiter $
三、关于变量的使⽤
1. 局部变量
在存储过程中,我们使⽤declare来声明局部变量,该语句只能⽤在存储过程begin…end复合语句⾥,且只能在语句的开头。
变量设置默认值,我们可以使⽤default⼦句(值可以是常数,也可以指定为⼀个表达式),如果没有默认值,变量初始值为null。
# 声明i变量为int类型,初始值为10.
declare i int default10
先定义再使⽤,未定义的变量,select返回空。
局部变量仅存在于存储过程中,当存储过程语句结束后,局部变量消失。相对地,⽤户变量可以⽤在存储过程内部和外部。
2. ⽤户变量
局部变量只有变量名字,没有@符号;⽤户变量名前有@符号。
存储过程使⽤,我们也可以传⼊事先set的⽤户变量,⽤户变量命名以‘@’开头。
set@a=10
delimiter $
create procedure p1(inout num int)
begin
屏蔽广告代码num = num +1
select num;
end$
delimiter;
#我们再调⽤存储过程
call p1(@a)
select@a;-- 11
⽤户变量的参数类型:in、out、inout
如参数类型命名,我们解释下其区别:
in:储存过程可以调⽤,但储存过程调⽤修改该变量后,该变量是不被修改的,只进不出。我们事先set⽤户变量并设置某个值,存储过程中可以修改,但修改仅作⽤于存储过程内部。存储过程结束后,返回的还是原来的值。
inout:可以传⼊,存储过程中可以修改,修改结果对于存储过程结束后同样有效。⽐如上⾯的案例,传⼊时⽤户变量@a 是10,存储过程+1变成了11,再输出这个参数时就是11了。可进可出。
out:变量传⼊存储过程为null(可理解为变量原来的值是不能传⼊存储过程的),但存储过程修改后,变量的修改于存储过程结束后同样有效,只出不进。
3. 存储过程结果赋值到变量的⼏种⽅法
⽅法⼀
delcare num int default0
select count(*)into num from table_name;
select num;
⽅法⼆
#我们使⽤下⽤户变量做个⽰例,注意⼀点是该⽅法的查询语句外边徐添加括号。
set@num=(select count(*)into num from table_name);
select@num;
⽅法三
# 多结果赋值到变量
select min(sales),max(sales)into@min,@max from table_name group by month(date);
四、存储过程的查看、删除、调⽤、创建
1. 查看存储过程
show procedure status;
#查看创建procedure_name存储过程的内容。
show create procedure procedure_name;
2. 删除存储过程
drop procedure if exists procedure_name
3. 调⽤存储过程
call procedure_name()
#如果传⼊变量@a
call procedure_name(@a)
4. 创建存储过程
create procedure 过程名([[in|out|inout] 参数名 数据类型[,[in|out|inout]参数名 数据类型…]])过程体过程体以begin开头,end结尾,⽰例:
delimiter $ -- 修改结束标志符
set@n :=10-- 设置⽤户变量@n,赋值10
create procedure p_test(in n int)-- 变量n参数为in,只进不出。
declare i int default10;-- 声明局部变量i,设置默认值10
declare num varchar(10);-- delcare语句放在begin-end复合语句开头。
set num :="num变量赋值";-- 为变量num赋值
set n :=100+ n;-- 我们尝试将⽤户变量修改为100 + n
begin-- 存储过程开始
select i, num, n;-- 存储过程内部,该处n修改有效。
end$ -- 存储过程结束
delimiter;-- 还原结束标志符
call p_test(@n)
select@n;-- 因为存储过程n参数是in,只进不出,该处@n返回还是原来的值:10
五、控制结构语句
⼤家在使⽤的时候,⼀定要注意语句各个地⽅的分号
1. 判断-if的使⽤
set@num=75;
delimiter $
create procedure p1(in num int)
begin
declare score char(3);
if num >80then
set score ="优秀";
elseif num >=60then
set score ="及格";
else
set score ="不及格";
end if;
select score;
end$
delimiter;
call p1(@num);
2. 判断-case when的使⽤
set@num=75;
ps免费模板素材网站delimiter $
create procedure p2(in num int)
begin
declare score char(3);
case num
when">80"then
set score ="优秀";
when">= 60"then
set score ="及格";
else
set score ="不及格";
end case;
select score;
end$
call p2(@num)$
3. while 循环
set@num=10;
delimiter $
create procedure p3(n smallint)
begin
declare i int;
declare s float;transport怎么记
set s =0;
set i =0;
while i < n do
set i = i +1;
set s = s + i;
吾爱破解论坛end while;
select s;
end$
mysql查看所有存储过程call p3(@num)$
4. repeat 循环
until+条件:结束循环
delimiter $
set@n=10$
create procedure p4(n smallint)
begin
declare i int;
declare s int;
set s =0;
set i =0;
repeat
set i = i +1;
set s = s + i;
until i =10
end repeat;
select s;
end$
call p4(@n)$
5. loop 循环
这⾥的循环名称‘myloop’可以⾃定义,leave表⽰结束循环。
delimiter $
set@n=10$
create procedure p5(n smallint)
begin
declare i int;
declare s int;
set s =0;
set i =0;
myloop : loop
set i = i +1;
set s = s + i;
if i =10then
leave myloop;
end if;
end loop myloop;
select s;
end$
call p5(@num)$
六、数据类型介绍
这⾥直接转载:www.runoob/mysql/mysql-data-types.html
感谢分享~~
MySQL中定义数据字段的类型对你数据库的优化是⾮常重要的。
MySQL⽀持多种类型,⼤致可以分为三类:数值、⽇期/时间和字符串(字符)类型。
1. 数值类型
MySQL⽀持所有标准SQL数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且⽀持MyISAM、MEMORY、InnoDB和BDB表。
作为SQL标准的扩展,MySQL也⽀持整数类型TINYINT、MEDIUMINT和BIGINT。下⾯的表显⽰了需要的每个整数类型的存储和范围。
类型⼤⼩范围(有符号)范围(⽆符号)⽤途
TINYINT 1 字节(-128,127)(0,255)⼩整数值
SMALLINT 2 字节(-32 768,32 767)(0,65 535)⼤整数值
MEDIUMINT 3 字节(-8 388 608,8 388 607)(0,16 777 215)⼤整数值
typedef给结构体取别名INT或
INTEGER
4 字节(-2 147 483 648,2 147 483 647)(0,4 294 967 295)⼤整数值
BIGINT8 字节(-9,223,372,036,854,775,808,9 223
372 036 854 775 807)
(0,18 446 744 073 709 551 615)极⼤整数值
FLOAT 4 字节(-3.402 823 466 E+38,-1.175 494 351
E-38),0,(1.175 494 351 E-38,3.402
823 466 351 E+38)
0,(1.175 494 351 E-38,3.402 823
466 E+38)
单精度
浮点数值
DOUBLE8 字节
(-1.797 693 134 862 315 7 E+308,-
2.225 073 858 507 201 4 E-308),0,
(2.225 073 858 507 201 4 E-
308,1.797 693 134 862 315 7
0,(2.225 073 858 507 201 4 E-
308,1.797 693 134 862 315 7
E+308)
双精度
浮点数值
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论