hungzz 2020-06-16
我们将我们的客户端的编码设置为utf8,客户端和客户端连接设为utf8,表设计为utf8,字段设置成utf8。
如果我们的客户端是gbk的编码,那我们就通知mysql服务器客户端和客户端连接是gbk的就行了。这样也不会出现乱码。
查看会话变量
show session variables [like ‘%关键字%‘]
查看字段的变量名称select @@session.变量名称。
指定会话变量的值 set @@session.变量名称=值 也可以使用set 变量名称=值
全局变量
全局变量一旦设置在所有的客户端都有效。
查看全局变量
show global variables [like ‘%关键字%‘]
select @@global.变量名称
指定全局变量的值 set global 变量名称=值 set @@global.变量名称=变量值。
用户定义变量 set @变量名称=值;比如set name=‘张三‘
存储过程是为了完成特定功能的sql语句集,经过编译后存储在数据库中,用户通过指定存储过程的名称并给定参数来调用并执行他。有点类似于自定义函数。
优点:
1增强了sql语言的功能和流程性,我们可以完成复杂的判断和运算
2存储过程创建完成后,可以多次被调用。
3 存储过程能实现较快的执行速度,如果一个操作包含大量的事务,那么存储过程速度要快很多,因为存储过程是预编译的,首次运行mysql的优化器会对其进行优化,而批量处理事务每次都要进行编译和优化,速度相对慢一些。
4 能减少网络的流量,因为发送的数据少。
5 存储过程相对来说安全。
存储过程的存储步骤
1 首先选中一个数据库,存储过程是放在某个数据库下的。use 数据库;
2 改变分割符,不要让;作为执行结束的标记 使用:delimiter $$ 将$$作为sql语句执行的结束符。
3 创建一个存储过程
create procedure 名称()
begin
sql语句;
sql语句;
end
$$
4 恢复语句执行的分割符delimiter ;
5 执行存储过程 call 名称[(参数1,参数2,...)];
以上是存储过程的基本用法,当然存储过程是复杂的,接下来我们通过细节讲解来学习存储过程。
我们可以在存储过程中定义局部变量,定义局部变量可以使用:
declare 变量名称 类型(长度),比如:
create procedure 名称()
begin
declare name varchar(20) default ‘‘;
select name;
end
$$
调用:call 名称;
我们也能使用
create procedure 名称()
begin
declare stu_no int;
set stu_no=10;
select stu_no;
end
$$;
调用: call 名称;
我们在创建存储过程时可以传递参数。
参数的类型:
IN:输入参数,表示该参数的值必须在调用存储过程之前指定,在存储过程中修改的值不能被返回。
create procedure 名称(IN number int)
begin
select number;
set number=number+1;
select number;
end
$$;
delimiter ;
set @number=3;
call 名称(@number)
我们在重新查询number的值
select @number 我们发现number的值还是3,并没有发生什么改变,由此可见IN类型的参数在执行完存储过程后他的值并不会发生任何变化,有点类似php的局部变量。
OUT:输出参数,该值可以在存储过程内部改变,并且可以返回,往往是用于获取存储过程里的参数值。
当我们传进入一个变量值是存储过程不认识,在重新赋值后就会有值了。
INOUT:输入输出参数,该值可以在调用时指定,并可修改和返回,是in和out的综合使用。
if分支
IF condition1 THEN
要执行的语句;
ELSEIF condition2 THEN
要执行的语句;
ELSE
要执行的语句;
ENDIF
和存储过程结合
create procedure showage(in age int)
begin
if age>18 then
select "成年人";
else
select "未成年人";
end if;
end
$$
set @age=19;
call showage(@age);
case分支
CASE case_value
WHEN when_value THEN
要执行的语句;
[WHEN when_value THEN 要执行的语句]
[ELSE 要执行的语句]
END CASE
其中case_value参数表示条件判断变量,when_value 表示变量取值。
create procedure addsalary(IN emno int)
begin
declare add int;
case emno
when 1001 then
set add=100;
when 1002 then
set add=200;
when 1003 then
set add=300;
else
set add=500;
end case;
update salary set money=money+add where emno=emno;
end;
$$
存储过程的使用。
set @emno=1002;
call addsalary(emno);
我们也可以把控制流程写到sql语句中
ifnull函数的使用,ifnull(exp1,exp2) 如果exp1为空值,那么返回的结果是exp2,如果exp1不为空,返回的结果就是exp1。
while语句
create procedure addnum()
begin
declare i int default 1;
declare sum int default 0;
while i < 100 do
set sum=sum+i;
set i=i+1;
end while
select sum;
end;
$$;
调用:call addnum
repeat .....until
create procedure updateGender()
begin
declare imin int default 1;
declare imax int default 1;
select min(emp_no) into imin from employees;
select max(emp_no) into imax from employees;
repeat
if imin % 2=0 then
update employees set gender=‘F‘ where emp_no=imin;
end if;
set imin=imin+1;
until imin >imax;
end repeat;
end;
$$
loop....end loop
create procedure updateHire()
begin
declare imin int default 1;
declare imax int default 1;
select min(emp_no) into imin from employees;
select max(emp_no) into imax from employees;
myloop:loop
if imin % 2=0 then
update employees set hire_date=‘1999-12-11‘ where emp_no=imin;
end if;
set imin=imin+1;
if imin > imax then
leave myloop;
end if;
end loop;
end;
$$
mysql中存储过程中捕获错误和处理
如果这样写存储过程,会报错。我们可以捕获这个错误。
存储过程的管理
show procedure status where db="库名";显示我们的数据库下有那些存储过程。
查看数据库下存储过程的列表
use 数据库
select specific_name from mysql.proc;
查看存储过程的创建过程
show create procedure 名称
select specifie_name,body from mysql.proc where specific_name="名称";
删除存储过程
drop procedure if exists 名称
首先查看是否已经开启了创建函数的功能
show variables like "%fun%";
如果值为off,那么需要开启
set global log_bin_trust_function_creators=1;
创建函数的语法
create function 函数名称(变量1,变量2)
returns 数据类型
begin
执行的程序的代码
return 数据;
end;
求两个数的和
可以通过show create function 函数名称 可以看见创建的代码。
可以通过drop function if exists 函数名称;
下面的这个函数可以判断用户输入用户名称和密码是否登录成功。
存储函数和存储过程的区别
我们的存储函数必须要有返回值。