存储过程(存储函数)
简称:存过 (不推荐使用,了解就可以)
往emp表中插入10000条数据
定义:一组预编译的sql语句的集合,理解成可批量执行的sql语句,类似于java的中的方法
好处:提高代码的复用性,简化操作
弊端:占用磁盘空间,容易造成数据库IO瓶颈
语法:
create procedure 过程名(参数列表)
begin
逻辑(要执行的sql)
end
注意:
参数列表:参数模式 参数名 参数类型,参数模式 参数名 参数类型
参数模型 :
in 输入的参数 入参
out 输出的参数 出参 就是返回值
inout 可以入也可以出
但凡修改存过的逻辑,一定重新执行一下创建存过
-- 往emp里面插入5条数据
drop procedure if exists insertemp;
create procedure insertemp()
begin
insert into emp(empno,ename) values("1003","Andy1");
insert into emp(empno,ename) values("1004","Andy2");
insert into emp(empno,ename) values("1005","Andy3");
insert into emp(empno,ename) values("1006","Andy4");
insert into emp(empno,ename) values("1007","Andy5");
end;
-- 存过和方法一样不调用 不执行
-- 调用存过
call insertemp();
select * from emp;
-- 根据姓名 查询出该员工所在的部门名称
select ename,dname,loc from emp e join dept d on e.deptno = d.deptno and e.ename = 'smith';
drop procedure if exists selectbyname;
create procedure selectbyname(in ename char(50))
begin
select ename,dname,loc from emp e join dept d on e.deptno = d.deptno and e.ename = ename;
end;
-- 调用有参存过
call selectbyname('smith');
-- 创建一个登陆逻辑 判断用户是否登陆成功
select count(1) from user u where u.user_name = 'admin' and u.password = 123456;
drop procedure if exists islogin;
create procedure islogin(in username char(50),in password char(50))
begin
declare result int default 0; -- 声明局部变量
-- 把count(1)的结果赋值给result
select count(1) into result from user u where u.user_name = username and u.password = password;
select if(result,"登陆成功","账号密码错误") '登陆状态';
end;
-- 调用登陆验证存过
call islogin("admin","123456"); -- 0 1 应用层还得转 0转成登陆失败 1转成登陆成功
-- 创建一个带输出参数的存过
-- 根据员工的名字查询员工工作的地址
drop procedure if exists selectlocbyename;
create procedure selectlocbyename(in ename char(50),out loc char(50))
begin
select d.loc into loc from emp e,dept d where e.deptno = d.deptno and e.ename = ename;
end;
-- 调用有参有返回值的存过
call selectlocbyename('smith',@loc); -- smith用于传参到存过中,@loc是用于接收存过的返回值
-- mysql中成员变量不用事先声明,用的时候直接 @变量名 就可以
-- mysql里面打印用select
select @loc;
变量:就是内存中的一个存储空间
- 局部变量
作用域: 存过的begin and中间 语句执行完,变量消失
语法: declare 变量名 数据类型 default 默认值
注意: declare声明变量 必须写在存过的begin的第一行
- 用户变量(成员变量)
作用域: 用于当前的连接,当前的连接断开,变量就消失
语法:
使用:select @变量名
赋值:
set @变量名 = 1;
set @变量名 := 2;
= 和 := 区别:在用select给变量进行赋值的时候,只能用:=
因为 select语句 = 表赋值
- = 用于比较两个值是否相等。
- := 用于给变量赋值。
注意:
select into 和 select := 区别
select into既可以给局部变量赋值也可以给用户变量赋值
如果是赋值的话,只能赋值,不会有返回值,也就是查询结果
select := 只能给用户变量赋值,不能给局部变量赋值,赋值的同时会有返回结果
- 会话变量
作用域: 用于当前的连接(仅限于当前连接,就是每个连接对象的会话变量是独立的),当前的连接断开,变量就消失
查看会话变量有很多种方式,其中之一查看所有会话变量 show session variables; 其他的自行百度
设置会话变量:
set auto_increment_increment = 值 直接设置 其他方式自行百度
- 全局变量(一般在数据库等级保障的时候,如果不想修改配置文件的情况,可以通过全局变量去设置一些安全方面的配置)
当mysql服务启动的时候,会将所有的全局变量给一个初始化默认值,作用域为整个mysql服务的生命周期。
查看全局变量:show global variables;
设置变量 :set 变量名 = 值
-- 查看全局变量:
show global variables;
show variables like "%sql_warnings%";
set sql_warnings = false;
-- 查看所有会话变量
show session variables;
select @a:= 12; -- 给变量@a赋值 同时会返回赋值后的结果
select @a; -- 查询@a变量的值是多少
select @a=12; -- 1 不可以用=赋值
select @a;
set @b = 10;
select @b;
set @b:=100;
select @b;