概述
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错误。
最后
以上就是负责酸奶为你收集整理的mysql 基本函数、循环、跳出循环、游标使用SQL99语法新特性基本函数循环游标的全部内容,希望文章能够帮你解决mysql 基本函数、循环、跳出循环、游标使用SQL99语法新特性基本函数循环游标所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复