目录
1、变量
(1)局部变量
函数里面定义的,变量名 类型
(2)会话变量
本次连接会话有效,不需要定义声明,直接使用,@变量名 类型
set @x=10;
select @x;
(3)系统变量
又叫全局变量,只有root变量才能使用,一直有效。因为全局变量影响服务器运行,所以Mysql不允许自定义全局变量,只能查看和修改
查看所有的全局变量
show global variables;
select @@autocommit;
2、判断选择
(1)if选择语法
if (表达式) then 执行语句; 执行语句; 执行语句;
elseif (表达式2) 执行语句; 执行语句; 执行语句;
elseif (表达式2) 执行语句; 执行语句; 执行语句;
drop function if exists myfun;
delimiter //
create function myfun(n int)
returns varchar(45)
begin
declare res varchar(45) default '';
if (n>0) then set res ='正数';
elseif (n=0) then set res='零';
else set res='负数';
end if;
return res;
end //
delimiter ;
select myfun(0);
(2)case选择
语法1、
case 变量 when 值1 then 执行语句;执行语句;
when 值1 then 执行语句;执行语句;
when 值1 then 执行语句;执行语句;
end case
语法2、
case when (表达式1) then 执行语句
when (表达式1) then 执行语句
when (表达式1) then 执行语句
end case
drop function if exists myfun;
delimiter //
create function myfun(n int)
returns varchar(45)
begin
declare res varchar(45) default '';
case when(n>0) then set res ='正数';
when (n=0) then set res='零';
when(n<0) then set res='负数';
end case;
return res;
end //
delimiter ;
select myfun(0);
3、循环
(1)while循环
while 条件
do
执行语句;
执行语句;
end while;
drop function if exists mySum;
delimiter //
create function mySum(n int)
returns int
begin
declare nSum int default 0;
declare i int default 1;
while (i<=n)
do
set nSum=nSum+i;
set i=i+1;
end while;
return nSum;
end //
delimiter ;
select mySum(10);
(2)其他循环
mysql中没有for循环
有repeat loop循环
4、存储过程
procedure是大型数据库系统中一组为了完成指定功能的sql语句集合
存储在数据库中,一次编译,永久有效
没有返回值,参数有in/out/inout类型,如果需要返回数据,可以把参数定义为out/inout类型,不定义默认是输入类型
优点:
减少网络流量
增强代码的重用性和共享性
加快系统的运行速度
使用灵活
创建存储过程语法:
delimiter //
create procedure 存储过程名(参数1 类型1,参数2 类型2........)
begin
sql语句;
end //
delimiter ;
执行存储过程
call 存储过程名(参数列表)
删除存储过程
drop procedure if exists 存储过程名
#例子:查询数据量比较大时需要分页,写一个分页的存储过程,查student表。
#输入参数当前是第几页(page int), 每页显示多少行数据(count int),表名作为参数传进来
drop procedure if exists studentTnformation;
delimiter //
create procedure studentTnformation(nPage int,nCount int)
begin
declare nOffset int default 0;
declare sumRows int;
declare maxPage int;
#查询总的数据行数
select count(*) into sumRows from student;
#计算最大页数,(注意是否能够整除,mysql采用四舍五入的方式进位)
set maxPage=(sumRows/nCount);
#当nPage<=0时,显示第一页数据,当nPage超过最大页数,显示最后一页数据
set nPage=case
when nPage<=0 then 1
when nPage>maxPage then maxPage
else nPage
end;
#计算起始页数
set nOffset=(nPage-1)*nCount;
select * from student limit nOffset,nCount;
end //
delimiter ;
call studentTnformation(2,4);
5、触发器
trigger ,当指定的事件(插入、修改、删除)发生的时候,系统自动调用
创建触发器语法
delimiter //
create trigger 触发器名字
after/before 操作名 #在发生***操作之前之后
on 表名 #产生触发的表
for each row #影响每一行
begin
执行语句;
end //
delimiter ;
删除触发器
drop trigger if exists 触发器名
drop trigger if exists mydel;
delimiter //
create trigger mydel
after delete
on student
for each row
begin
delete from sc where s=old.S;
#old表:删除/修改之前
#new:删除/修改之后
end //
delimiter ;
delete from student where s='04';
增加的触发器:每来一个同学,给这个同学默认选择01和02课程,分数是空
drop trigger if exists myinsert;
delimiter //
create trigger myinsert
after insert
on student
for each row
begin
insert into sc (S,C) values (new.S,'01');
insert into sc (S,C) values (new.S,'01');
end //
delimiter ;
insert into student (S,Sname) values (15,'人');
修改触发器,修改学生编号,对应sc表中的编号
drop trigger if exists myupdate;
delimiter //
create trigger myupdate
after update
on student
for each row
begin
update sc set S=new.S where S=old.S;
end //
delimiter ;
update student set S='20' where S='15';
6、事务:transaction
作为单个逻辑工作单元指定的一系列sql语句集合,要么都执行成功,要么都不执行
事务的特性
原子性:atom 事务是最小的工作单元,不可再分,要么都执行,要么都不执行
一致性:consistency 数据库的完整性约束不能被破坏
隔离性:isolation 并行执行的事务,相互之间不影响
持久性:durability 提交以后,数据改变永久保存在数据库中、
使用
开始事务:start transaction
执行语句;
执行语句;
执行语句;
commit; #提交改变数据
rollback; #回滚,数据变回到开始事务之间的状态