1. mysql 存储过程中尽量使用 @变量 而不用局部变量, @变量不容易报错!权限小,更改一下就报错! 2. sql中判断相等'=' ,用'=' 不用'=='. 3.
#流程控制结构 /* 顺序结构: 程序从上往下依次执行; 分支结构: 程序从多条路径中选择一条往下执行 循环结构: 程序在满足一定条件的基础上,重复执行一段代码 */ #一: 分支结构 #if 函数 : 实现简单的双分支 /*语法: 实现简单的双分支 if(表达式1,表达式2,表达式3) 执行顺序: 如果表达式1成立, 则if函数返回表达式2的值, 否则返回表达式3的值 */ #2.case 结构 /* 情况1: 类似于java中的switch 语句,一般用于实现等值判断; 语法: case 变量/表达式/字段 when 要判断的值1 then 返回的值1 when 要判断的值2 then 返回的值2 when 要判断的值3 then 返回的值3 .... else 要返回的值n end 情况2: 类似于java中的多重IF 语句,一般用于实现区间的判断 语法: case when 要判断的条件1 then 返回的值1或者语句1; when 要判断的条件2 then 返回的值2或者语句2; ... else 要返回的值n或语句n; #可以省略else end case; 特点: 1)可以作为表达式,嵌套在其他语句中使用,可以放在任何地方, begin end 中,或 begin end 的外面 2)可以作为独立的语句去使用,只能放在begin end中 3)如果when中的某一项值满足条件或者条件成立,则执行对应的then后面的语句,并且结束case 如果都不满足,则执行else 语句 4)else可以省略, */ #案例: #创建存储过程,根据传入的成绩,来显示等级,比如传入的成绩: 90-100,显示A; 80-90,显示B;60-80显示C;否则显示D; DELIMITER $ CREATE PROCEDURE test_case(IN score INT) BEGIN CASE WHEN score>=90 AND score <=100 THEN SELECT 'A'; WHEN score>=80 THEN SELECT 'B'; WHEN score>=60 THEN SELECT 'C'; ELSE SELECT 'D'; END CASE; END $ CALL test_case(95) $ #A CALL test_case(55) $ #D #3:if 结构, 实现多重分支 /* 语法: if 条件1 then 语句1; elseif 条件2 then 语句2; ... [else 语句n;] end if; 应用场合: 只能在begin /end 中 */ #案例1:根据传入的成绩,来显示等级,比如传入的成绩: 90-100,返回A; 80-90,返回B;60-80返回C;否则返回D; DELIMITER $ CREATE FUNCTION test_if(score INT) RETURNS NVARCHAR(10) BEGIN IF score>=90 AND score<=100 THEN RETURN 'A'; ELSEIF score>=80 THEN RETURN 'B'; ELSEIF score>=60 THEN RETURN 'C'; ELSE RETURN 'D'; END IF; END $ SELECT test_if(66) $ #C #二: 循环结构 /* 分类: while/loop/repeat 循环控制: 结束本次循环进行下一次: iterate 类似于continue 结束当前所在的循环结构 : leave 类似于break IF 条件 THEN LEAVE 标签名; END IF; */ #1.while ****重点 /*语法: [标签(名字):]while 循环条件 do 循环体; end while[标签名]; */ #2.loop /* 语法: [标签:]loop 循环体; end loop[标签]; #需要搭配leave跳出死循环! #常用来表示模拟单纯的死循环 */ #3.repeat /* 语法: [标签名:]repeat 循环体; util 结束循环的条件; end repeat [标签]; */ #案例1(简单while循环): 批量插入,根据次数插入到admin 表中的多条记录 DELIMITER $ CREATE PROCEDURE 批量插入1(IN insertCount INT) BEGIN DECLARE i INT DEFAULT 1; wa: WHILE i<=insertCount DO INSERT INTO admin(username,`password`) VALUES('Rose'+i,'660'); SET i=i+1; END WHILE wa; END $ CALL 批量插入1(100) $ #案例2(LEAVE(break循环的)+while循环): 批量插入,根据次数插入到admin 表中的多条记录,; 如果次数大于20,则停止插入数据 TRUNCATE TABLE admin; DELIMITER $ CREATE PROCEDURE 批量插入2(IN insertCount INT) BEGIN DECLARE i INT DEFAULT 1; wa: WHILE i<=insertCount DO INSERT INTO admin(username,`password`) VALUES(164215000+i,'123456'); IF i>=20 THEN LEAVE wa; END IF; SET i=i+1; END WHILE wa; END $ CALL 批量插入2(100) $ #案例3(iterate(continue)+while循环): 批量插入,根据次数插入到admin 表中的多条记录; 仅仅偶数学号插入. TRUNCATE TABLE admin; DELIMITER $ CREATE PROCEDURE 批量插入5(IN insertCount INT) BEGIN DECLARE i INT DEFAULT 0; wa: WHILE i<=insertCount DO SET i=i+1; IF i%2=1 THEN ITERATE wa; END IF; INSERT INTO admin(username,`password`) VALUES(164215000+i,'123456'); END WHILE wa; END $ CALL 批量插入5(60) $ ############################################### /*案例一:已知表StringContent ,向该表插入指定的个数的随机长度的随机字符串[1,20] ****随机模式-先随机长度,然后再从字母表中取出一个字符加进已有的字符串 其中字段: id 自增长, content varchar(20) */ CREATE TABLE StringContent( id INT PRIMARY KEY AUTO_INCREMENT , content VARCHAR(20) ); DELIMITER $ CREATE PROCEDURE test_randstr_insert4(IN nums INT) BEGIN #select concat('共插入',nums,'条数据'); SET @i = 0; SET @table_str ='abcdefghijklmnopqrstuvwxyz'; a:WHILE @i<nums DO SET @i=@i+1; SET @s2str = ''; SET @len = CEILING(RAND()*15); #代表字符长度 ,共需要循环随机产生len次数据 SET @j = 0; b:WHILE @j<@len+1 DO SET @j=@j+1; SET @s2str = CONCAT(@s2str ,SUBSTR(@table_str,CEILING(RAND()*26),1) ); END WHILE b; INSERT INTO `stringcontent`(id,content) VALUES(@i,@s2str); END WHILE a; END $ CALL test_randstr_insert4(FLOOR(RAND()*100)+1) $ SELECT RAND(); #0.41551091188146816 SELECT FLOOR(RAND()*100); #FLOOR 函数返回小于或等于所给数字表达式的最大整数, 获取[0,99]之间的数值 SELECT CEILING(RAND() * 100); #CEILING 函数返回大于或等于所给数字表达式的最小整数, 获取[1,100]之间的数值 SELECT ROUND(RAND() *100); #四舍五入 ,获取[0,100]之间的数值, 可以出现: 0和100 SELECT ('a'+'b');