变量
系统变量:全局变量、会话变量
自定义变量:会话用户变量、局部变量
//查看所有的系统变量show global|session variables;//查看指定的某个系统变量的值select @@变量名;//为某个系统变量赋值set 系统变量名=值;
#自定义变量//用户变量:针对于当前会话(连接有效),同时会话变量的作用域//声明并且初始化set @用户变量名=值;或set @用户变量名:=值;//赋值set @用户变量名=值;或select 字段 into @变量名 from 表;eg:select count(*) into @countfrom employees;//查看select @用户变量名;//局部变量:仅仅在定义它的begin end中有效;应用在begin end中的第一句话//声明declare 变量名 类型;declare 变量名 类型 default 值;//赋值set 局部变量名=值;或select 字段 into 局部变量名 from 表;//使用select 局部变量名;
存储过程
一组经过预先编译的sql语句的封装
//创建语法create procedure 存储过程名(参数列表)[characteristics ...]begin存储过程体(一组sql语句)end参数列表包含:参数模式、参数名、参数类型参数模式:in:该参数可作为输入,也就是该需要调用方法入值out:该参数可作为输出,也就是该参数可作为返回值inout:该参数可作为输入和输出//调用语法call 存储过程名(实参列表);注:存储过程的每条sql语句的结尾要求必须加分号存储过程的结尾可以用 Delimiter 重新设置。重新设置后,调用存储过程时结尾也要用重新设置的符号eg:Delimiter 结束标记//删除存储过程drop procedure 存储过程名;//查看存储过程show procedure status where db=数据库名;
#创建带in模式参数的存储过程//创建存储过程实现 用户是否登录成功DELIMITER $CREATE procedure myp2(in username varchar(20),in password varchar(20))begindeclare result int default 0;select count(*) into resultfrom adminwhere admin.username = usernameand admin.password=password;select if(result>0,'成功','失败') 结果;end $#创建带out模式参数的存储过程//创建存储过程 通过传入的员工id查出员工名字和所在部门名create procedure myp1(in empId int,out empname varchar(20),out depname varchar(20))beginselect e.last_name,d.department_name into empname,depnamefrom employees e INNER JOIN departments don e.department_id=d.department_idwhere employee_id=empId;end;set @empname,@depname; //定义两个变量来接收返回的值call myp1(101,@empname,@depname);select @empname,@depname;#创建带inout模式参数的存储过程//传入a,b两个值,使其翻倍后输出create procedure myp3(inout a int,inout b int)beginset a = a*2;set b = b*2;end;set@a=2;set@b=3;call myp2(@a,@b);select @a,@b;
存储函数
一组预先编译好的sql语句集合
#创建语法create function 函数名(参数名,参数类型....)returns 返回类型[characteristics ...]begin函数体 #函数体必须有RETURN 语句end;#调用语法select 函数名(参数列表)#查看函数show function status where db=数据库名;#删除函数drop function 函数名;
//根据员工id查出工资create FUNCTION myf2(empid int)returns DOUBLEbeginDECLARE m double DEFAULT 0.0;select salary into Mfrom employeeswhere employee_id =empid;return M;end;select myf2(101);
区别
存储过程:可以有0个返回,也可以有多个返回,适合做批量插入、批量更新
函数:只有一个返回,适合做数据处理后返回一个结果
循环控制
放在begin end中使用
#分类while、loop、repeat#循环控制iterate类似于 continue,结束本次循环继续下一次leave类似于 break 跳出当前所在循环
#语法while 循环条件 do循环体end while;
#案例//向表中插入指定个数的随机字符串create table stringContent(id int PRIMARY KEY auto_increment,content varchar(20));create procedure test_randstr_insert(in insertCount int)beginDECLARE i int DEFAULT 1;DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';DECLARE startIndex int DEFAULT 1;#起始索引DECLARE len int DEFAULT 1;#截取字符长度while i < insertCount DOset len = FLOOR(RAND()*(20-startIndex+1)+1);set startIndex = FLOOR(RAND()*26+1);insert into stringContent(content) VALUES(SUBSTR(str,startIndex));set i=i+1;end while;end;
