lyt经典版MySQL基础——流程控制结构

Posted 学而时习之,不亦说乎

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lyt经典版MySQL基础——流程控制结构相关的知识,希望对你有一定的参考价值。

  1 #流程控制结构
  2 /*
  3 顺序结构:程序从上往下依次执行
  4 分支结构:程序从两条或多条路径中选择一条去执行
  5 循环结构:程序在满足一定条件的基础上,重复执行一段代码
  6 
  7 */
  8 
  9 #一、分支结构
 10 #1.if函数
 11 /*
 12 功能:实现简单的双分支
 13 语法:
 14 if(表达式1,表达式2,表达式3)
 15 执行顺序:
 16 如果表达式1成立,则if函数返回表达式2的值,否则返回表达式3的值
 17 
 18 应用:任何地方
 19 */
 20 
 21 #2.case结构
 22 /*
 23 情况1:类似于java中的switch语句,一般用于实现等值判断
 24 
 25 语法:
 26     case 变量|表达式|字段
 27     when 要判断的值 then 返回的值1或语句1 ;
 28     when 要判断的值 then 返回的值2或语句2 ;
 29     ...
 30     else 要返回的值n或语句n ;
 31     end case ;
 32     
 33 情况2:类似于java中的多重if语句,一般用于实现区间判断
 34 
 35 语法:
 36     CASE 
 37     WHEN 要判断的条件1 THEN 返回的值1或语句1;
 38     WHEN 要判断的条件2 THEN 返回的值2或语句2;
 39     ...
 40     ELSE 要返回的值n或语句n;
 41     END case;
 42     
 43 特点:
 44 (1)
 45 可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,begin end 中或 begin end 的外面;
 46 可以作为独立的语句使用
 47 (2)
 48 如果when中的值满足或条件成立,则执行对应的then后面的语句,并且结束case;
 49 如果都不满足,则执行else中的语句或值
 50 (3)
 51 else可以省略,如果else省略了,并且所有when条件都不满足,则返回null
 52 */
 53 
 54 #案例
 55 #创建存储过程,根据传入的成绩,来显示等级,比如传入的成绩:90-100,显示A;80-90,显示B;
 56 #60-80,显示C;否则显示D
 57 DELIMITER $
 58 CREATE PROCEDURE test_case1(IN score INT)
 59 BEGIN
 60     CASE
 61     WHEN score>=90 AND score<=100 THEN SELECT A;
 62     WHEN score>=80 THEN SELECT B;
 63     WHEN score>=60 THEN SELECT C;
 64     ELSE SELECT D;
 65     END CASE; 
 66 END $
 67 
 68 CALL test_case1(55)$
 69 
 70 #3.if结构
 71 /*
 72 功能:实现多重分支
 73 
 74 语法:
 75 if 条件1 then 语句1;
 76 elseif 条件2 then 语句2;
 77 ...
 78 【else 语句n;】
 79 end if;
 80 
 81 应用在begin end中
 82 */
 83 
 84 #案例1:根据传入的成绩,来显示等级,比如传入的成绩:90-100,返回A;80-90,显示B;
 85 #60-80,显示C;否则显示D
 86 DELIMITER $
 87 CREATE FUNCTION test_if(score INT) RETURNS CHAR
 88 BEGIN
 89     IF score>=90 AND score<=100 THEN RETURN A;
 90     ELSEIF score>=80 THEN RETURN B;
 91     ELSEIF score>=60 THEN RETURN C;
 92     ELSE RETURN D;
 93     END IF;
 94 END$
 95 
 96 SELECT test_if(79)$
 97 
 98 #二、循环结构
 99 /*
100 分类:
101 while、loop、repeat
102 
103 循环控制:
104 iterate 类似于 continue,继续,结束本次循环,继续下一次
105 leave 类似于 break,跳出,结束当前所在的循环
106 */
107 
108 #1.while
109 /*
110 语法:
111 【标签:】while 循环条件 do
112       循环体;
113       end while【标签】;
114       
115 联想:
116 while(循环条件){
117     循环体;
118 }
119 */
120 
121 #2.loop
122 /*
123 语法:
124 【标签:】loop
125       循环体;
126       end loop 【标签】;
127       
128 可以用来模拟简单的死循环
129 */
130 
131 #3.repeat
132 /*
133 语法:
134 【标签:】repeat
135      循环体;
136      until 结束循环的条件
137      end repeat 【标签】;
138 */
139 
140 #没有添加循环控制语句
141 #案例:批量插入,根据次数插入到admin表中多条记录
142 DELIMITER $
143 CREATE PROCEDURE pro_while1(IN insertCount INT)
144 BEGIN
145     DECLARE i INT DEFAULT 1;
146     WHILE i<=insertCount DO
147         INSERT INTO admin(username,PASSWORD) VALUES(CONCAT(Rose,i),666);
148         SET i=i+1;
149     END WHILE;
150 END$
151 
152 CALL pro_while1(100)$
153 
154 /*
155 int i=1;
156 while(i<=insertCount){
157     //插入
158     i++;
159 }
160 */
161 
162 #2.添加leave语句
163 #案例1:批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
164 TRUNCATE TABLE admin$
165 DROP PROCEDURE IF EXISTS test_while1$
166 DELIMITER $
167 CREATE PROCEDURE test_while1(IN insertCount INT)
168 BEGIN
169     DECLARE i INT DEFAULT 1;
170     a:WHILE i<=insertCount DO
171         INSERT INTO admin(username,PASSWORD) VALUES(CONCAT(xiaohua,i),0000);
172         IF i>=20 THEN LEAVE a;
173         END IF;
174         SET i=i+1;
175     END WHILE a;
176 END$
177 
178 CALL test_while1(100)$
179 
180 #案例2:批量插入,根据次数插入到admin表中多条记录,只插入偶数次
181 DELIMITER $
182 CREATE PROCEDURE test_while1(IN insertCount INT)
183 BEGIN
184     DECLARE i INT DEFAULT 0;
185     a:WHILE i<=insertCount DO
186         SET i=i+1;
187         IF MOD(i,2)!=0 THEN ITERATE a;
188         END IF;
189         INSERT INTO admin(username,PASSWORD) VALUES(CONCAT(xiaohua,i),0000);
190     END WHILE a;
191 END$
192 
193 CALL test_while1(100)$
194 /*
195 int i=0;
196 while(i<=insertCount){
197     i++;
198     if(i%2==0){
199         continue;
200     }
201     插入
202 }    
203 */
204 
205 #经典案例面试题
206 /*1、已知表stringcontent
207 其中字段:
208 id 自增长
209 content varchar(20)
210 向该表插入指定个数的,随机的字符串
211 */
212 DROP TABLE IF EXISTS stringcontent;
213 CREATE TABLE IF NOT EXISTS stringcontent(
214     id INT PRIMARY KEY AUTO_INCREMENT,
215     content VARCHAR(20));
216 DESC stringcontent;
217 DELIMITER $
218 CREATE PROCEDURE test_randstr_insert(IN insertcount INT)
219 BEGIN
220     DECLARE i INT DEFAULT 1; #定义一个循环变量i,表示插入次数
221     DECLARE str VARCHAR(26) DEFAULT abcdefghijklmnopqrstuvwxyz;
222     DECLARE startIndex INT DEFAULT 1; #代表起始索引
223     DECLARE len INT DEFAULT 0; #代表截取的字符的长度
224     WHILE(i<=insertcount)DO
225         SET startIndex=FLOOR(RAND()*26+1); #产生一个随机的整数,代表起始索引1 ~ 26
226         SET len=FLOOR(RAND()*(26-startIndex+1)+1); #产生一个随机的整数,代表 截取长度,1 ~ 26-startIndex+1
227         INSERT INTO stringcontent(content) VALUES(SUBSTR(str,startIndex,len));
228         SET i=i+1; #循环变量更新
229     END WHILE;
230 END$
231 
232 CALL test_randstr_insert(10)$

 

以上是关于lyt经典版MySQL基础——流程控制结构的主要内容,如果未能解决你的问题,请参考以下文章

lyt经典版MySQL基础——函数

lyt经典版MySQL基础——变量

lyt经典版MySQL基础——进阶1:基础查询

lyt经典版MySQL基础——进阶2:条件查询

lyt经典版MySQL基础——进阶2:常见函数-分组函数

lyt经典版MySQL基础——进阶6:连接查询-sql92语法-内连接