MySQL学习——常用语法


MySQL流程控制语句

1. WHILE

语法:

WHILE 条件 DO

……

END WHILE;

 

题目:

1、建立函数getPrereq_id,实现用迭代输出某个课程(作为函数输入)的所有先修课程号(包含本课程的课程号),用‘|’隔开。
输入以下两条指令以查看效果。
INSERT INTO prereq VALUES('BIO-101', 'PHY-101');
SELECT getPrereq_id('BIO-399');

2. 代码(树形查询)

参考:

https://www.jianshu.com/p/9e7c2a481e49

drop function if exists getPrereq_id;
delimiter $$
CREATE FUNCTION getPrereq_id(id varchar(8)) RETURNS VARCHAR(1000)
BEGIN
	DECLARE a varchar(1000) DEFAULT id;
	DECLARE r varchar(20);
	set r = id;
	WHILE a is not NULL DO
		select GROUP_CONCAT(prereq_id seperator '|') into a from prereq where
		FIND_IN_SET(course_id,a)>0;
		if a is not null then
			set r = concat(r,'|',a);
		end if;
	END WHILE;
	RETURN r;
END;$$
delimiter ;

判断循环终止的条件:
1)树形查询通过查询结果为空

2)使用cursor的while循环,通过handler来捕获异常,对标志值设置值来终止循环。

例子:

create procedure sp_updatesalary() 
BEGIN
	DECLARE i varchar(5);
	DECLARE s varchar(8);
	DECLARE cur1 CURSOR FOR SELECT ID,salary FROM instructor;
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET i = NULL; 	
	OPEN cur1;
	FETCH cur1 INTO i,s;
	WHILE i is not null DO
		IF s < 70000 THEN
		UPDATE instructor SET salary = s*1.2 WHERE ID = i;
		ELSE 
		UPDATE instructor SET salary = s*1.15 WHERE ID = i;
		END IF;
		FETCH cur1 INTO i,s;--个人理解最好把fetch cursor放在while的最后,保证cur为空的时候不会执行其他语句
	END WHILE;
	CLOSE cur1;
END;

2. IF

IF 条件 THEN

……

END IF;

注意不要忘记THEN


其他语法知识

1. MySQL的常用内置函数

  • CONCAT(s1,s2,s3,s4……)

作用:连接字符串

注意,如果连接的字符串里有NULL,最后结果会变成NULL

  • find_in_set(str,strlist)

返回str在strlist中第一次出现的位置,所以如果需判断str出现在strlist中,可以判断返回值是否大于0.

  • GROUP_CONCAT

在作业中用于把查询得到的一组结果组合成一个字符串。操作对象是结果集中的列名。

更多相关的用法参考https://hchmsguo.iteye.com/blog/555543

2. 细节问题

  • 给变量赋值要用set
  • 调用过程或函数需要设置参数时可以:

set @prem = ……

call function(@prem)

select procedure(@prem)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值