Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql基本函数、循环、跳出循环、游标

mysql基本函数、循环、跳出循环、游标使用及说明

作者:destiny@

这篇文章主要介绍了mysql基本函数、循环、跳出循环、游标使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

SQL99语法新特性

  1. NATURAL JOIN (自然连接) : 她会帮你自动查询两张表中所有相同的字段,然后进行等值连接
select a.dept_id,b.dept_id from A a NATURAL JOIN B b
  1. USING : 两张表中字段一样(dept_id) 才能使用
select a.dept_id,b.dept_id form A a join A b USING(dept_id)
  1. match ()Against() 全文检索
SELECT
	id_,
	pat_name,
	id_card_no,
	phone_ 
FROM
	`inspect_meal_appointment_record` 
WHERE
	MATCH ( pat_name ) Against (
	'张三' 
	)
	

create fulltext index ind on inspect_meal_appointment_record (pat_name)  WITH PARSER ngram;


基本函数

循环

使用储存过程(procedure)进行演示

repeat 循环

CREATE DEFINER=`root`@`localhost` PROCEDURE `repeatTest`()
BEGIN
	DECLARE nums INT DEFAULT 1;
	
	REPEAT
	  set nums = nums+1;
		UNTIL nums >= 10
		
	END REPEAT;

SELECT nums;


END

while 循环

CREATE DEFINER=`root`@`localhost` PROCEDURE `whileTest`()
BEGIN
	DECLARE nums INT DEFAULT 1;
	
	WHILE nums <= 10 DO
	set nums = nums+1;
END WHILE;


SELECT nums;


END

loop循环

CREATE DEFINER=`root`@`localhost` PROCEDURE `loopTest`()
BEGIN
	DECLARE nums INT DEFAULT 1;
	
	test_label: LOOP
	set nums = nums+1;

	IF nums >= 110 THEN
		LEAVE test_label; 
	END IF; 
END LOOP test_label;



SELECT nums;


END

leave 跳出

可以用在循环或者单独的语句中

CREATE DEFINER=`root`@`localhost` PROCEDURE `leaveTest`()
BEGIN
	DECLARE nums INT DEFAULT 1;
	
	while_label:WHILE TRUE DO
		IF nums > 10 THEN LEAVE while_label;
		END IF;
		set nums = nums+1;
END WHILE;


SELECT nums;


END

iterate 执行下一次循环

只能用在循环中,相当于java的 continue

CREATE DEFINER=`root`@`localhost` PROCEDURE `ITERATETest`()
BEGIN
	DECLARE nums INT DEFAULT 1;
	
	test_label: LOOP
	set nums = nums+1;
	IF nums < 10
			THEN ITERATE test_label;
	ELSEIF nums > 15 
	THEN LEAVE test_label; 
	END IF; 
END LOOP test_label;



SELECT nums;


END

游标

CREATE DEFINER=`inspect-v2-develop`@`%` PROCEDURE `updateTypeLabel`()
    COMMENT '数据迁移,储存过程'
BEGIN
	DECLARE s INT DEFAULT  0;
	DECLARE mealId VARCHAR(64);
	DECLARE num INT DEFAULT 0;
	
	DECLARE list CURSOR FOR  SELECT deploy_meal_id,COUNT(deploy_meal_id) from inspect_meal_deploy WHERE   is_deleted = '0' GROUP BY deploy_meal_id;
	
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s = 1;
	
	OPEN list;
		
		FETCH list into mealId,num;
		while s<> 1 do
			IF num >= 1 THEN 
			UPDATE  inspect_meal_type_label SET meal_deploy_id = (SELECT id_ FROM inspect_meal_deploy WHERE is_deleted = '0' AND deploy_meal_id = mealId LIMIT 1) WHERE meal_id =  mealId AND is_deleted = '0';
			END IF;
			
			FETCH list into mealId,num;
		END WHILE;
		
	CLOSE list;

END

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s = 1;是一个声明句柄,它类似于存储过程中的一个异常。

这里边有一个关键字continue,这个关键字是和exit关键字相对应的。continue语句会执行完指定操作后继续循环,而exit语句会退出将从最近的begin…end语句块中退出。 在这里的指定的操作就是set s = 1

既然声明了句柄,就要告诉程序句柄在什么时候调用,在这个例子中,当sqlstate '02000'语句被调用时会执行句柄。那么这个sqlstate '02000'是什么意思呢?该句柄将在无法再找到记录行后调用。也就是说当遍历完所有的结果集后就会调用。

因此,DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s = 1;的意思就是当遍历完结果集之后把s的值设为1。

注意,句柄要定义在游标之后,不然会报ERROR 1338 (42000): Cursor declaration after handler declaration错误。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文