bitscn.com
--存储过程及常用流程控制语法
/*该代码是创建了一个名叫p4的存储过程并设置了s1,s2,s3两个int型一个varchar型参数,还可以是其他数据类型,内部创建了x1,x2两个变量
delimiter是修改分隔符的
delimiter $$的意思是把默认分隔符;换成$$,这样分段写的存储过程就能整个被执行,而不是被当成多条sql语句单独执行
创建完过程再将分隔符改回成;
两种创建变量并赋值的方式
set @变量名 = 值;
select 值 into @变量名;
使用变量前必须先运行该变量赋值语句
过程内部还可以通过 declare 变量名 类型(字符串型要加范围) default 值; 来创建变量,但如此创建的变量只能在该过程内部访问
存储过程只有三种类型参数 in,out,inout
调用过程时过程有几个参数传几个参数,只是in型的参数可以传的是变量,可以是常量,而out和inout型的参数传的必须是变量
传给out,inout参数的变量值会随着在过程中改变在外部也改变,而给in参数的变量外部值则不受过程内变量值改变的影响
*/delimiter $$
drop procedure if exists `p4`$$
create procedure `p4`(in s1 int,out s2 int,inout s3 varchar(10))
begin
declare x1 varchar(10) default 'this is x1';
declare x2 varchar(10) default 'this is x2';
set s1 = 11;
set s2 = 22;
set s3 = 'iss3';
/*if语法*/
if s1 = 11 and s2 = 12 then
select s1,s2;
end if;
if s3 = 's3' or s1 = s2 then
select s3;
else
select s1,s2,s3;
end if;
/*case语法*/
case s3
when 's1' then
select 'this is s1';
when 's2' then
select 'this is s2';
else
select 'this is s3';
end case;
/*while循环*/
while s1>1 do
set s1=s1-1;
end while;
select s1;
/*repeat循环语句
与while不同的是while满足条件就执行,repeat始终执行直到满足条件终止
*/repeat
set s1 = s1-1;
until s1=1
end repeat;
select s1;
/*loop循环
loop没有循环条件,会不停的循环直到遇到 leave zidingyi; zidingyi是自定义的loop标记*/
zidingyi:loop
set s1 = s1+1;
if s1 = 5 thenleave zidingyi;
end if;
end loop;
select s1;
end$$
delimiter ;
set @p_in=1;
set @p_out=2;
set @p_inout = 's3';
select 'hello world1' into @p_4;
/*调用存储过程*/
call p4(@p_in,@p_out,@p_inout);
select @p_in,@p_out,@p_inout,@p_4;
/*存储过程如果只有一个语句则语句不用 begin...end包围
存储过程中可以直接使用外部定义的变量
存储过程中用set和select定义的变量就是全局的,执行该过程后内部用set和select定义的变量外部可以访问,其他过程也可以直接使用*/
create procedure p1() set @var='p1';
create procedure p2() select concat('last procedure was ',@var);
call p1();
call p2();
select @var;
create procedure p3() select concat(@p3_var,' world');
set @p3_var='hello';
call p3();
/*删除存储过程*/
drop procedure p4;
/*或者*/
drop procedure if exists `p4`
/*查看该数据库下有哪些存储过程 test为数据库名*/
select name from mysql.proc where db='test';
/*或者*/show procedure status where db='test';
/*查看存储过程详细信息,包括创建语句*/show create procedure p4;
--创建触发器(表里的触发器如果是触发本表,就会报错;触发其他的表就可以)
create trigger zl_tri after insert on zl_table
for each row
insert into zl_table1(count) values(2222);
--显示触发器
show triggers [from 库名]
--删除触发器
drop trigger 库名.触发器名;
--集合
mysql只支持union(并集)集合运算,好像也是4.0以后才有的;
但是对于交集intersect、差集except,就没有实现了。
--连接(和sql语法一样)
--基本语法(基本和sql语法一样,一下是不一样的地方)
select * from emp order by emp_sal desc limit 2; --limit相当于top
查看工资排名第2到第3的员工资料:
mysql> select * from emp order by emp_sal desc limit 1,2;
使用rand()抽样调查,随机抽取2个员工,查看其资料
mysql> select * from emp order by rand() limit 2;
bitscn.com