mysql 操作同样有循环语句操作,三种标准循环模式:while, loop,repeat, 外加一种非标准循环:goto [在c或c#中貌似出现过类型循环但是一般不建议用!] 一般格式为:delimiter // 定义结束符 drop procedure if exists wk; 假如存在则删除create procedure name([in | out | input] 参数) begin while-loop-repeat-mysql-code end //
delimiter ; 还原
定义变量: declare count int default 1; 定义count为int类型 并且设置初始值为1; set count=1; 修改count变量的值为1 set count=count+1; 相当于python里面的自加打印值: select count;
条件语句:if mysql_condtion then; mysql_codeelse mysql_codeend if;
if mysql_condtion then; mysql_codeend if;
Sample_1:while while mysql_condtion do mysql_code end while; Sample_2:loop
loop_name:loop mysql_codeend loop;
Sample_3:repeat
repeat mysql_code until mysql_condtion end repeat;
BEGIN declare i int default 0; loop_label: loop set i=i+1; if i<8 then iterate loop_label; end if; if i>=10 then leave loop_label; end if; select i; end loop loop_label; END
存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql
使用存储过程的优点:
#1. 用于替代程序写的SQL语句,实现程序与sql解耦 #2. 基于网络传输,传别名的数据量小,而直接传sql数据量大
使用存储过程的缺点:
#1. 程序员扩展功能不方便
补充:程序与数据库结合使用的三种方式
#方式一: MySQL:存储过程 程序:调用存储过程 #方式二: MySQL: 程序:纯SQL语句 #方式三: MySQL: 程序:类和对象,即ORM(本质还是纯SQL语句)
对于存储过程,可以接收参数,其参数有三类: #in 仅用于传入参数用 #out 仅用于返回值用 #inout 既可以传入又可以当作返回值
废话不多说 上代码 #loop 循环delimiter //drop procedure if exists sum2;create procedure sum2(args int)begin declare sum int ; declare count int ; set count=1; set sum=1; loop_name:loop if count>args then leave loop_name; end if; set sum=sum+count; set count=count+1; end loop; select sum; 输出end //delimiter ; delimiter //drop procedure if exists sum2;create procedure sum2(args int)begin declare sum int ; declare count int ; set count=1; set sum=1; loop_name:loop --循环开始 if count>args then leave loop_name; --判断条件成立则结束循环 end if; set sum=sum+count; set count=count+1; end loop; --循环结束 select sum; --输出结果end //delimiter ;
desc copy;copy_struct: id int priymary key auto_increment sname varchar(25) not null
#无参 存储过程delimiter //drop procedure if exists loopcc;create procedure loopcc()begin declare i int; set i=0; repeat insert into copy (sname) values (now()); set i=i+1; until i>=20 end repeat;end //delimiter; #有参 存储过程delimiter //drop procedure if exists sum3;create procedure sum3(a int)begin declare sum int default 0; declare i int default 1; repeat -- 循环开始 set sum=sum+i; set i=i+1; until i>a end repeat; -- 循环结束 select sum; -- 输出结果end//delimiter ;---执行存储过程call sum3(100);drop prodedure if exists sum3; desc register_time;register_time struct:id int parmary key auto_increment,name varchar(15) not null,register_time datetime not null,email varchar(60) not null default 'xxxxxxx@126.com'gender enum('male','female') default 'male' #存储过程delimiter //create procedure p1()BEGIN DECLARE num INT ; SET num = 0 ; WHILE num < 100000 DO --循环开始 insert into index_test (name,regiter_time) values('李宗军',now()); SET num = num + 1 ; END WHILE ; --结束 END //delimiter ; desc copy;copy_struct: id int priymary key auto_increment sname varchar(25) not null #while 循环delimiter //drop procedure if exists wk;create procedure wk()begin declare i int; set i=1; while i<8 do insert into copy (sname) values ('你大爷'); set i=i+1; end while;end //delimiter ; desc student;student_stuct:sid int parmary key auto_increment,gender enum('male','female') default 'male',class_id int not null,sname varchar(32) not null #传参数查询 指定范围的 数据
delimiter //
drop procedure if exists get_data;
create procedure get_data(in id_value int)
begin
select * from student where sid>id_value;
end //
delimiter ;
call get_data(4);
drop procedure get_data;
create table emp(
eid int primary key auto_increment,
ename varchar(20),
sex enum('male','female') not null default 'male',
hire_time datetime default now(),
salary varchar(15) not null default 'egon大哥看着给!',
department_fk int
);
insert into emp (ename,department_fk) values('egon',2);
查询员工
--创建存储过程
delimiter //
drop procedure if exists get_emp_info;
create procedure get_emp_info(eid int)
begin
select * from emp where emp.eid=eid;
end //
delimiter ;
call get_emp_info(1);
drop procedure get_emp_info;
同样的 在begin里面可执行其他操作来进行值得修改与查询 Sample: begin update emp set sex='female' where eid=1; end begin truncate emp; end begin delete from emp; end out 参数的使用 delimiter //drop procedure if exists get_res;create procedure get_res(out res int)begin select department_fk from emp where eid=res; set res=5end // delimiter ; set @res=1;call get_res(@res);select @res;