变量
分类
- 系统变量
- 全局变量
- 会话变量
- 自定义变量
- 用户变量
- 局部变量
系统变量
变量由系统提供,不是用户自定义,属于服务器层面。
使用语法:
查看所有的系统变量
show global variables; /*全局变量*/ show session variables; /*会话变量,session可不写*/
查看满足条件的部分系统变量
show global variables like '%char%';
查看指定的某个系统变量的值
select @@global.系统变量名;
为某个系统变量赋值
set global 系统变量名 = 值; /*方法一*/ set @@global.系统变量名 = 值; /*方法二*/
全局变量
作用域:服务器每次启动将为所有的全局变量附初始值。针对所有的会话(连接)有效,但是不能跨重启。
查看所有的全局变量
show global variables; /*全局变量*/
查看部分全局变量
查看指定的某个全局变量的值
select @@global.autocommit; select @@transaction_isolation;
为某个全局变量赋值
set @@global.autocommit = 0; /*取消自动提交*/
会话变量
作用域:针对当前会话(连接)有效。
自定义变量
变量是用户自己定义的。
使用步骤:
- 声明
- 赋值
- 使用(查看,比较,运算等)
用户变量
作用域:针对于当前会话(连接)有效,同于会话变量的作用域。
应用:任何地方,也就是begin,end里面或外面。
声明并初始化
set @用户变量名 = 值; set @用户变量名 : 值; select @用户变量名 : 值;
赋值(更新)
方式一:
set @用户变量名 = 值; set @用户变量名 : 值; select @用户变量名 : 值;
方式二:
select 字段 into 变量名 from 表;
查看某个用户变量的值
select @用户变量名;
局部变量
作用域:仅仅在定义的begin,end中有效。
应用:begin,end里面第一句话。
声明
declare 变量名 类型; declare 变量名 类型 default 值;
赋值
set @局部变量名 = 值; set @局部变量名 : 值; select @局部变量名 : 值; select 字段 into 局部变量名 from 表;
使用
select @局部变量名;
存储过程 procedure 和函数
类似于java中的方法。
存储过程 procedure
含义:一组预先编译好的SQL语句的集合,理解成批处理语句。
优点:
- 提高代码的重用性
- 简化操作
- 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率。
创建语法:
create procedure 存储过程名(参数列表) begin 存储过程体(一组合法的SQL语句) end
注意:参数列表包括三部分:参数模式,参数名,参数类型。
例:
in stuname varchar(20)
参数模式:in (作为输入,需要调用方法传入值),out (作为输出,作为返回值),inout (作为输入和输出)
如果存储过程体只有一句话,那么begin,end可省略。
存储过程的结尾可以使用delimiter重新设置。
delimiter $ /*$ 为结束标记,其他也可*/
调用语法
call 存储过程名(实参列表);
案例演示一:
结果:
案例演示二:创建带in模式的存储过程
案例1:创建存储过程实现,根据女神名,查询对应的男神信息
案例2:创建存储过程实现,用户是否登录
函数
与存储过程的区别:
- 存储过程:可以有0个返回,也可以有多个返回,适合做批量插入,批量更新。
- 有且仅有一个返回,适合做处理数据后返回一个结果。
创建语法:
create function 函数名(参数列表) returns 返回类型 begin 函数体 end
注意:
参数列表包括两部分:参数名,参数类型。
函数体:必须有return语句,否则报错。最好return语句放在最后。
函数体中只有一句话,可以省略begin,end。
使用delimiter语句设置结束标记。
调用语法:
select 函数名(参数列表)
查看函数
show create function 函数名;
删除函数
drop function 函数名;
案例演示:
无参有返回
有参有返回
流程控制结构
- 顺序结构
- 分支结构
- 循环结构
分支结构
if函数
语法:
if(表达式1, 表达式2, 表达式3)
case结构
类似于java中的switch结构,一般用于实现的等值判断
case 变量|表达式|字段 where 要判断的值 then 返回值1 where 要判断的值 then 返回值2 ...... else 要返回的值n end /*单独执行,放在存储过程和函数中*/ case 变量|表达式|字段 where 要判断的值 then 语句1; where 要判断的值 then 语句2; ......; else 语句n; end case;
类似java中的多重if语句,一般用于实现区间判断
case 变量|表达式|字段 where 要判断的条件 then 返回值1 where 要判断的条件 then 返回值2 ...... else 要返回的值n end /*单独执行,放在存储过程和函数中*/ case 变量|表达式|字段 where 要判断的值 then 语句1; where 要判断的值 then 语句2; ......; else 语句n; end case;
特点:可以作为表达式,嵌套在其他语句当中使用,可以放在任何地方;可以作为独立语句,只能放在begin,end中。
案例:
if结构
应用在begin,end中。
语法:
if 条件1 then 语句1;
elseif 条件2 then 语句2;
......
else 语句n
end if;
案例:
循环结构
分类:
- while
- loop
- repeat
循环控制:
- iterate,类似于continue
- leave,类似于break
语法:
/*标签:*/ while 循环条件 do
循环体;
end while /*标签*/;
/*标签:*/ loop
循环体;
end loop /*标签*/; /*模拟简单的死循环*/
/*标签:*/ repeat
循环体;
until 结束循环的条件
end repeat /*标签*/;
案例: