mysql基本函数、循环、跳出循环、游标使用及说明
作者:destiny@
这篇文章主要介绍了mysql基本函数、循环、跳出循环、游标使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
SQL99语法新特性
- NATURAL JOIN (自然连接) : 她会帮你自动查询两张表中所有相同的字段,然后进行等值连接
select a.dept_id,b.dept_id from A a NATURAL JOIN B b
- USING : 两张表中字段一样(dept_id) 才能使用
select a.dept_id,b.dept_id form A a join A b USING(dept_id)
- match ()Against() 全文检索
- 需查询的字段创建为fulltext索引
- match默认不支持中文检索,所以添加索引时需要添加解析器: WITH PARSER ngram
- 传统like会是索引失效
- show VARIABLES like 'ngram_token_size’查看分词方式,可以修改
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错误。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
