mysql中流程控制语句
mysql流程控制语句,一般用于函数、存储过程、触发器等中,类似c、java中的流程控制。因此一些逻辑代码可以直接在数据库中用存储过程或者触发器来实现,只是可维护性不高。
例如项目要重构,若是在代码中实现,方便重构,且注释到位,也方便其他人接手。但是在数据库中,则不是这样。但是从优化的角度来说,也有一定益处。
https://www.cnblogs.com/fbbg/p/13542230.html
mysql流程控制语句
数据:
if 函数:
格式:if(表达式,值1,值2);当表达式为true的时候,返回值1,否则返回值2
实例:
case结构:
两种用法:
第一种:类似于switch
格式:
case 表达式
when 值1 then 结果1或者语句1(如果是语句要加分号)
when 值2 then 结果2或者语句2
......
else 结果或者语句
end [case] //在select中使用时不同加case,在begin...end中必须要加case
实例:
1、在select中使用
2、在存储过程中使用
3、在函数中使用
第2种用法:类似java中的多重if语句
语法:
case
when 条件1 then 结果1或者语句1(语句需要加分号)
when 条件2 then 结果2或者语句2
......
else 条件或者语句
end [case];
这种写法和第一种类似,没太大改变
if 结构:只能使用在begin end之间
if 结构类似于java中的if ...else if.....else
语法:
if 条件语句1 then 语句1;
else if 条件语句2 then 语句2;
......
else 语句N;
end if;
实例:
1、在存储过程中。写一个存储过程,实现用户的更新和新增,如果id存在就更新,不存在就新增
循环:
mysql中的循环有三种写法:
while:类似于java的while循环
repeat:类似于java的do...while循环
loop:类似于java中的while(true)死循环
循环控制:
对循环内部的流程进行控制,如:
结束本次循环:类似于java中的continue
iterate 循环标签;
退出循环:类似于java中的break
leave 循环标签;
while循环:
[标签:] while 循环条件 do
循环体
end while [标签];
注:标签:是给while取个名字,标签和iterate、leave组合起来在循环内部控制循环。如跳出循环、结束本次循环
实例1:创建一个存储过程,根据传入的值向表中添加指定数量的数据
实例2:添加leave控制语句,传入一个参数,然后插入10条后循环结束
实例3:添加iterate控制语句,根据传入的参数向test1表中传入数据,只插入偶数数据
repeat循环:
语法:
[标签:]repeat
循环体;
until 结束循环条件 end repeat [标签];
repeat相当于java中的do......while,先执行一次,再进行判断
loop循环:
语法:
[标签:] loop
循环体;
end loop [标签];
loop相当于一个死循环,需要使用leave和iterate来控制循环
http://c.biancheng.net/view/7853.html
在存储过程和自定义函数中可以使用流程控制语句来控制程序的流程。MySQL 中流程控制语句有:IF 语句、CASE 语句、LOOP 语句、LEAVE 语句、ITERATE 语句、REPEAT 语句和 WHILE 语句等。
下面将详细讲解这些流程控制语句。
1. IF语句
IF 语句用来进行条件判断,根据是否满足条件(可包含多个条件),来执行不同的语句,是流程控制中最常用的判断语句。其语法的基本形式如下:
IF search_condition THEN statement_list [ELSEIF search_condition THEN statement_list]... [ELSE statement_list] END IF
其中,search_condition 参数表示条件判断语句,如果返回值为 TRUE ,相应的 SQL 语句列表(statement_list)被执行;如果返回值为 FALSE,则 ELSE 子句的语句列表被执行。statement_list 可以包括一个或多个语句。
注意:MySQL 中的 IF( ) 函数不同于这里的 IF 语句。
例 1
下面是一个使用 IF 语句的示例。代码如下:
IF age>20 THEN SET @count1=@count1+1; ELSEIF age=20 THEN @count2=@count2+1; ELSE @count3=@count3+1; END lF;
该示例根据 age 与 20 的大小关系来执行不同的 SET 语句。如果 age 值大于20,那么将 count1 的值加 1;如果 age 值等于 20,那么将 count2 的值加 1;其他情况将 count3 的值加 1。IF 语句都需要使用 END IF 来结束。
2. CASE语句
CASE 语句也是用来进行条件判断的,它提供了多个条件进行选择,可以实现比 IF 语句更复杂的条件判断。CASE 语句的基本形式如下:
CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement_list]... [ELSE statement_list] END CASE
其中:
- case_value 参数表示条件判断的变量,决定了哪一个 WHEN 子句会被执行;
- when_value 参数表示变量的取值,如果某个 when_value 表达式与 case_value 变量的值相同,则执行对应的 THEN 关键字后的 statement_list 中的语句;
- statement_list 参数表示 when_value 值没有与 case_value 相同值时的执行语句。
- CASE 语句都要使用 END CASE 结束。
CASE 语句还有另一种形式。该形式的语法如下:
CASE WHEN search_condition THEN statement_list [WHEN search_condition THEN statement_list] ... [ELSE statement_list] END CASE
其中,search_condition 参数表示条件判断语句;statement_list 参数表示不同条件的执行语句。
与上述语句不同的是,该语句中的 WHEN 语句将被逐个执行,直到某个 search_condition 表达式为真,则执行对应 THEN 关键字后面的 statement_list 语句。如果没有条件匹配,ELSE 子句里的语句被执行。
这里介绍的 CASE 语句与“控制流程函数”里描述的 SQL CASE 表达式的 CASE 语句有轻微的不同。这里的 CASE 语句不能有 ELSE NULL 语句,并且用 END CASE 替代 END 来终止。
例 2
下面是一个使用 CASE 语句的示例。代码如下:
CASE age WHEN 20 THEN SET @count1=@count1+1; ELSE SET @count2=@count2+1; END CASE;
代码也可以是下面的形式:
CASE WHEN age=20 THEN SET @count1=@count1+1; ELSE SET @count2=@count2+1; END CASE;
本示例中,如果 age 值为 20,count1 的值加 1,否则 count2 的值加 1。
3. LOOP 语句
LOOP 语句可以使某些特定的语句重复执行。与 IF 和 CASE 语句相比,LOOP 只实现了一个简单的循环,并不进行条件判断。
LOOP 语句本身没有停止循环的语句,必须使用 LEAVE 语句等才能停止循环,跳出循环过程。LOOP 语句的基本形式如下:
[begin_label:]LOOP statement_list END LOOP [end_label]
其中,begin_label 参数和 end_label 参数分别表示循环开始和结束的标志,这两个标志必须相同,而且都可以省略;statement_list 参数表示需要循环执行的语句。
例 3
使用 LOOP 语句进行循环操作。代码如下:
add_num:LOOP SET @count=@count+1; END LOOP add_num;
该示例循环执行 count 加 1 的操作。因为没有跳出循环的语句,这个循环成了一个死循环。LOOP 循环都以 END LOOP 结束。
4. LEAVE 语句
LEAVE 语句主要用于跳出循环控制。其语法形式如下:
LEAVE label
其中,label 参数表示循环的标志,LEAVE 语句必须跟在循环标志前面。
例 4
下面是一个 LEAVE 语句的示例。代码如下:
add_num:LOOP SET @count=@count+1; IF @count=100 THEN LEAVE add_num; END LOOP add num;
该示例循环执行 count 加 1 的操作。当 count 的值等于 100 时,跳出循环。
5. ITERATE 语句
ITERATE 是“再次循环”的意思,用来跳出本次循环,直接进入下一次循环。ITERATE 语句的基本语法形式如下:
ITERATE label
其中,label 参数表示循环的标志,ITERATE 语句必须跟在循环标志前面。
例 5
下面是一个 ITERATE 语句的示例。代码如下:
add_num:LOOP SET @count=@count+1; IF @count=100 THEN LEAVE add_num; ELSE IF MOD(@count,3)=0 THEN ITERATE add_num; SELECT * FROM employee; END LOOP add_num;
该示例循环执行 count 加 1 的操作,count 值为 100 时结束循环。如果 count 的值能够整除 3,则跳出本次循环,不再执行下面的 SELECT 语句。
说明:LEAVE 语句和 ITERATE 语句都用来跳出循环语句,但两者的功能是不一样的。LEAVE 语句是跳出整个循环,然后执行循环后面的程序。而 ITERATE 语句是跳出本次循环,然后进入下一次循环。使用这两个语句时一定要区分清楚。
6. REPEAT 语句
REPEAT 语句是有条件控制的循环语句,每次语句执行完毕后,会对条件表达式进行判断,如果表达式返回值为 TRUE,则循环结束,否则重复执行循环中的语句。
REPEAT 语句的基本语法形式如下:
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
其中:
- begin_label 为 REPEAT 语句的标注名称,该参数可以省略;
- REPEAT 语句内的语句被重复,直至 search_condition 返回值为 TRUE。
- statement_list 参数表示循环的执行语句;
- search_condition 参数表示结束循环的条件,满足该条件时循环结束。
- REPEAT 循环都用 END REPEAT 结束。
例 6
下面是一个使用 REPEAT 语句的示例。代码如下:
REPEAT SET @count=@count+1; UNTIL @count=100 END REPEAT;
该示例循环执行 count 加 1 的操作,count 值为 100 时结束循环。
7. WHILE 语句
WHILE 语句也是有条件控制的循环语句。WHILE 语句和 REPEAT 语句不同的是,WHILE 语句是当满足条件时,执行循环内的语句,否则退出循环。WHILE 语句的基本语法形式如下:
[begin_label:] WHILE search_condition DO
statement list
END WHILE [end label]
其中,search_condition 参数表示循环执行的条件,满足该条件时循环执行;statement_list 参数表示循环的执行语句。WHILE 循环需要使用 END WHILE 来结束。
例 7
下面是一个使用 WHILE 语句的示例。代码如下:
WHILE @count<100 DO SET @count=@count+1; END WHILE;
该示例循环执行 count 加 1 的操作,count 值小于 100 时执行循环。如果 count 值等于 100 了,则跳出循环。
MyBatis 常用写法
1、forEach 循环
forEach 元素的属性主要有 item, idnex, collection, open, separator, close。
- collection:传入的 List 或 Array 或自己封装的 Map。
- item:集合中元素迭代时的别名。
- idnex:集合中元素迭代是的索引。
- open:where 后面表示以什么开始,如以‘(’开始。
- separator:表示在每次进行迭代是的分隔符。
- close:where后面表示以什么结束,如以‘)’结束。
//mapper中需要传递一个容器
public List<User> queryByIdList(List<Integer> userIdList);
<select id="queryByIdList" resultMap="BaseResultMap" parameterType="map">
SELECT * FROM user
WHERE userId IN
<foreach collection="userIdList" item="id" index="index" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
2、concat 模糊查询
//模糊查询使用concat拼接sql
<select id="queryByName" resultMap="BaseResultMap" paramterType"string">
SELECT * FROM user
<where>
<if test="name != null">
name like concat('%', concat(#{name}, '%'))
</if>
</where>
</select>
3、if + where 标签
用 if 标签判断参数是否有效来进行条件查询。
<select id="getUserList" resultMap="BaseResultMap" paramterType="com.demo.User">
SELECT * FROM user
<where>
<if test="userId !=null and userId!= ''">
userId= #{userId}
</if>
<if test="name !=null and name!= ''">
AND name= #{name}
</if>
<if phone="userId !=null and phone!= ''">
AND phone= #{phone}
</if>
</where>
</select>
where 动态语句中,where 标签会自动去掉 AND 或 OR。防止 WHERE AND 错误。
4、if + set
使用 set 标签可以动态的配置 SET 关键字,使用 if + set 标签,如果某项为 null 则不进行更新。
<update id="updateUser" paramterType="com.demo.User">
UPDATE user
<set>
<if test=" name != null and name != ''">
name = #{name},
</if>
<if test=" phone != null and phone != ''">
phone = #{phone},
</if>
</set>
WHERE userId = #{userId}
</update>
5、if + trim 代替 where/set 标签
trim 可以更灵活的去处多余关键字的标签,可以实现 where 和 set 的效果。
<select id="getUserList" resultMap="BaseResultMap" paramterType="com.demo.User">
SELECT * FROM user
<trim prefix="WHERE" prefixOverrides="AND|OR">
<if test="userId !=null and userId!= ''">
userId= #{userId}
</if>
<if test="name !=null and name!= ''">
AND name= #{name}
</if>
<if phone="userId !=null and phone!= ''">
AND phone= #{phone}
</if>
</trim>
</select>
<update id="updateUser" paramterType="com.demo.User">
UPDATE user
<trim prefix="SET" suffixOverrides=",">
<if test=" name != null and name != ''">
name = #{name},
</if>
<if test=" phone != null and phone != ''">
phone = #{phone},
</if>
</trim>
WHERE userId = #{userId}
</update>
5、choose(when, otherwise)标签
choose 标签是按顺序判断其内部 when 标签中的 test 条件是否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满足,则执行 otherwise 中的 sql。类似 java 中的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。
<select id="selectCustomerByCustNameAndType" parameterType="map" resultMap="BaseResultMap">
SELECT * FROM user
<choose>
<when test="Utype == 'name'">
WHERE name = #{name}
</when>
<when test="Utype == 'phone'">
WHERE phone= #{phone}
</when>
<when test="Utype == 'email'">
WHERE email= #{email}
</when>
<otherwise>
WHERE name = #{name}
</otherwise>
</choose>
</select>
MySQL必知必会之使用存储过程(useful)
https://zhuanlan.zhihu.com/p/450099946
https://blog.csdn.net/weixin_43961909/article/details/130707887