lyt经典版MySQL基础——流程控制结构
时间:2021-07-01 10:21:17
帮助过:7人阅读
#流程控制结构
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基础——流程控制结构
标签:concat case call 试题 cat ble 存储过程 auto dex