分类:
- 系统变量
- 全局变量
- 会话变量
- 自定义变量
- 用户变量
- 局部变量
变量由系统提供,不是用户定义,属于服务器层面
如果是全局级别,需要加global,如果是会话级别,则需要加session,如果不写,则默认session
作用域:服务器每次启动将为所有的全局变量赋初始值,必须拥有super权限才能为系统变量赋值,针对所有的会话(连接)有效,但不能跨重启。
- 查看系统变量
#全局变量
show global variables;
#会话变量
show session variables;
- 查看满足条件的部分变量
show global variables like '%char%';
- 查看指定的某个系统变量的值
select @@global.autocommit;
select @@transaction_isolation;
- 为某个具体的变量赋值
set @@global.autocommit=0;
作用域:仅针对于当前会话(连接)有效
- 查看所有会话变量
#会话变量
show session variables;
show variables;
- 查看满足条件的部分变量
show session variables like '%char%';
show variables like '%char%';
- 查看指定的某个系统变量的值
select @@session.transaction_isolation;
select @@transaction_isolation;
- 为某个具体的变量赋值
set @@session.autocommit=0;
set session autocommit=0;
用户自定义的,不是由系统提供的
使用步骤:
- 声明
- 赋值
- 使用(查看、比较、运算等)
作用域:针对于当前会话(连接)有效,同于会话变量的作用域
应用在任何地方, begin end 里外都可以
#1.声明并初始化
set @用户变量名=值;
set @用户变量名:=值;
select @用户变量名:=值;
#2. 更新用户变量的值
#方式一
set @用户变量名=值;
set @用户变量名:=值;
select @用户变量名:=值;
#方式二
select 字段 into @变量名 from 表;
#3. 查看用户变量的值
select @用户变量名
set @count=1;
select count(*) into @count from employees;
select @count;
作用域:仅仅在定义它的begin end中有效
应用在 begin end 中的第一句话
#1. 声明
declare 变量名 类型;
declare 变量名 类型 default 值;
#2. 赋值
#方式一
set 局部变量名=值;
set 局部变量名:=值;
select @局部变量名:=值;
#方式二
select 字段 into 局部变量名 from 表;
#3. 使用
select 局部变量名;
用户变量
- 作用域:当前会话
- 定义和使用的位置:会话中的任何地方
- 语法:必须加@符号,不用限定类型
局部变量
- 作用域:begin end中
- 定义和使用的位置:只能在begin end 中,且为第一句话
- 语法:一般不用加@符号,需要限定类型
#声明两个变量并赋初始值,求和,并打印
#1. 用户变量
set @m=1;
set @n=2;
set @sum=@m+@n;
select @sum;
#2. 局部变量
declare m int default 1;
declare n int default 2;
declare sum int;
set sum=m+n;
select sum;
类似于java中的方法
好处:
- 提高代码的重用性
- 简化操作
含义:一组预先编译好的SQL语句的集合,理解成批处理语句
好处:
- 提高代码的重用性
- 简化操作
- 减少了编译次数,并且减少了和数据服务器的连接次数,提高效率
语法:create procedure 存储过程名(参数列表) begin 存储过程体(一组合法的sql语句) end
注意:
- 参数列表包含三部分:参数模式 参数名 参数类型
in stuname varchar(20)
- 参数模式
- in: 该参数可以作为输入,该参数需要调用方传入值
- out: 该参数作为输出,该参数可以作为返回值
- inout: 该参数既可以作为输入,又可以作为输出
- 如果存储过程体仅仅只有一句话,begin end 可以省略
- 存储过程体中的每条sql语句的结尾必须加分号,存储过程的结尾可以使用 delimiter 重新设置
- 语法:
delimiter 结束标记
- 语法:
语法:call 存储过程名(实参列表)
- 空参列表
#插入到admin表中五条记录
delimiter $
create procedure myp1()
begin
insert into admin(username,password) values('john1', '0000'), ('lily', '0000'), ('rose', '0000'),('jack', '0000'),('tom', '0000');
end $
call myp1()$
- 创建带in模式参数的存储过程
#根据女神名,查询对应的男神信息
create procedure myp2(in beautyName varchar(20))
begin
select bo.* from boys bo right join beauty b on bo.id = b.boyfriend_id where b.name = beautyName;
end $
call myp2('liuyan')$
#用户是否登录成功
create procedure myp3(in username varchar(20), in password varchar(20))
begin
declare result int default '';
select count(*) into result from admin where admin.username=username and admin.password=password;
select if(result>0,'success','unsuccess');
end $
call myp3('zhangfei', '8888')$
- 创建带out模式的存储过程
#根据女神名,返回对应的男神名
create procedure myp4(in beautyName 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 $
set @bName$
call myp4('xiaozhao', @bName)$
select @bName$
#根据女神名,返回对应的男神名和男神魅力值
create procedure myp5(in beautyName varchar(20), out boyName varchar(20), out userCP int)
begin
select bo.boyName,bo.userCP into boyName,userCP from boys bo inner join beauty b on bo.id = b.boyfriend_id where b.name=beautyName;
end $
call myp5('xiaozhao', @bName, @usercp)$
select @bName, @usercp$
- 创建带inout模式的存储过程
#传入a和b两个值,最终a和b都翻倍并返回
create procedure myp6(inout a int, inout b int)
begin
set a=a*2;
set b=b*2;
end $
set @m=10$
set @n=20$
call myp6(@m, @n)$
select @m, @n$
语法:drop procedure 存储过程名;
drop procedure mp1;
show create procedure myp2;
- 存储过程:可以有0个返回,也可以有多个返回。适合批量插入、批量更新
- 函数:有且仅有1个返回。适合在处理数据后返回一个结果
语法:create function 函数名(参数列表) returns 返回类型 begin 函数体 end
- 参数列表包含两部分:参数名+参数类型
- 函数体:肯定会有return语句,如果没有会报错
- 函数体仅有一句话,则可以省略begin end
- 使用 delimiter语句 设置结束标记
语法:select 函数名(参数列表)
- 无参有返回
#返回公司的员工个数
create funciton myf1() returns int
begin
declare c int default 0;
SELECT
COUNT(*)
INTO c FROM
employees;
return c;
end $
select myf1() $
- 有参有返回
#根据员工名,返回他的工资
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') $
#根据部门名,返回该部门的平均工资
create function myf3(depName varchar(20)) returns double
begin
declare sal double;
select avg(salary) into sal from employees e join departments d on e.department_id = d.department_id where d.department_name=deptName;
return sal;
end $
select myf3('IT')$
show create function myf3;
drop function myf3;