一、变量

系统变量:全局变量【global】、会话变量【session】
自定义变量:用户变量、局部变量
1.系统变量

说明:变量由系统提供,不是用户定义,属于服务器层面
使用语法:
1.查看所有的系统变量
show global/session variables;
2.查看满足条件的部分系统变量
show global/session variables like '%char%';
3.查看指定的某个系统变量的值
select @@global/[session]. 系统变量名;
4.为某个系统变量赋值
(1)set global/[session] 系统变量名=值;
(2)set @@global/[session] .系统变量名=值;
注意:如果是全局级别,则需要加global,如果是会话级别,则需要加session,如果不写,则默认seesion。

(1)全局变量作用域:
服务器每次启动将为所有的全局变量赋初始值,针对于所有的会话有效,但不能跨重启
(2)会话变量作用域:
仅仅针对于当前会话(连接)有效

二、自定义变量

说明:变量是用户自定义的,不是由系统定义的
使用步骤:
声明
赋值
使用(查看、比较、运算等)

1.用户变量
作用域:针对当前会话(连接)有效,同会话变量;
应用于任何地方,begin end里面或外面
(1)声明并初始化
<a> set @用户变量名=值;
<b> set @用户变量名:=值;
<c> select @用户变量名:=值;
(2)赋值(更新用户变量的值)
方式一:<a> set @用户变量名=值;
	   <b> set @用户变量名:=值;
		 <c> select @用户变量名:=值;
方式二:通过select into
		select 字段 into 变量名 from 表;
(3)查看用户变量的值
select @用户变量名;
2.局部变量
作用域:仅仅在定义它的begin end中有效;
应用在begin end 中的第一句话
(1)声明
declare 变量名 类型;
declare 变量名 类型 default 值;
(2)赋值
方式一:<a> set 局部变量名=值;
	   <b> set 局部变量名:=值;
		 <c> select 局部变量名:=值;
方式二:通过select into
		select 字段 into 局部变量名 from 表;
(3)使用
select 局部变量名;

二、存储过程和函数

1.存储过程
(1)含义:一组预先编译好的SQL语句的集合,理解成批处理语句
(2) 好处:
(a)提高代码的重用性
(b)简化操作
(c)减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

一、创建语法
create procedure 存储过程名(参数列表)
begin
	存储过程体(一组合法的SQL语句)
end
注意:1.参数列表包含三部分
参数模式:
	in: 该参数可以作为输入,也就是该参数需要调用传入值
	out: 该参数可以作为输出,也就是该参数可以作为返回值
	inout: 该参数既可以作为输入,又可以作为输出,也就是该参数既需要传入值,又可以返回值
参数名: 
参数类型
2.如果存储过程体仅仅只有一句话,Begin end 可以省略
存储过程体中的每条SQL语句的结尾要求必须加分号;
存储过程的结尾可以使用Delimiter重新设置
语法:
delimiter 结束标记
案例:
delimiter $
二、调用语法
call 存储过程名(实参列表);
#1.空参列表
#案例:插入到admin表中五条记录
select *from admin;
delimiter $
create procedure myp1()
begin
	insert into admin(username,'password')
	values('jonh1','0000'),('rose','0000'),('lily','0000');
end $
#调用 
call myp1()$
2.创建带in模式参数的存储过程
#案例1:创建存储过程实现,根据女神名,查询对应的男神信息
create procedure myp2(in beautyName verchar(20))
begin
	select bo.*
	from boys bo
	right join beauty b on bo.id=b.boyfriend_id
	where b.name=beautyName;
end $
#调用
call myp2('柳岩')$

#案例2:创建存储过程实现,用户是否登录成功
create procedure myp3(in username varchar(20),in password varchar(20))
begin
	declare result int defalute 0;
	select count(*) into result
	from admin
	where admin.username=username 
	and admin.password=password;
	
	select if(result>0,'成功','失败');
end$
3.创建带out模式的存储过程
#案例1:根据女神名,返回对应的男神名
create procedure myp3(in username varchar(20),out boyName varchar(20))
begin
	select bo.boyName into boyName
	from boys bo
	inner join beauty b on bo.id=b.boyfriend_id
	where b.name=beautyName;
end$
#调查
call myp5('小昭',@bName)$
select @bName$
4.创建带inout模式参数的存储过程
#案例1:传入a和b两个值,最终a和b都翻倍并返回
create procedure myp5(inout a int, inout b int)
begin
	set a=a*2;
	set b=b*2;
end$
#调用
set @m=10$
set @n=20$
call myp5(@m,@n)$
select @m,@n$
二、删除存储过程
语法:
drop procedure 存储过程名;
三、查看存储过程的信息
show create procedure myp2;

2.函数
含义和特点与存储过程相同;
区别:
存储过程:可以有0个返回,也可以有多个返回,适合做批量插入、批量更新
函数:有且只有一个返回,适合做数据处理后返回一个结果

一、创建语法
create function 函数名(参数列表) returns 返回类型
begin
	函数体
end
注:1.参数列表包含两部分:参数名 参数类型
2.函数体:肯定有return语句,如果没有会报错
3.函数体中仅有一句话,则begin end可省略
4.可使用delimiter语句设置结束标记

二、调用语法
select 函数名(参数列表)

#案例演示
#1.无参有返回:
create function myf1() returns int
begin
	declare c int default 0; #定义变量
	select count(*) into c #赋值
	from employees;
	return c;
end$
#调用
select myf1()$
#2.有参有返回
#案例1:根据员工名,返回它的工资
create function myf2(empName varchar(20)) returns double
begin
	set @sal=0;#定义用户变量
	select salary into @sal
	from employees
	where last_name=empName;
	return @sal
end$
select myf2('Kochhar')$
三、查看函数
show create function myf2;
四、删除函数
drop function myf2;