游乐游手机版
首页/数据库/文章详情

MySQL基本函数、循环与游标使用指南

时间:2026-06-18 06:58
SQL99的NATURALJOIN、USING及全文检索(需fulltext索引和ngram解析器)可简化查询;MySQL基本函数涵盖字符串与日期处理;存储过程通过REPEAT、WHILE、LOOP实现循环,使用LEAVE跳出、ITERATE继续下次循环;游标逐条处理结果集,需配合CONTINUEHANDLER声明以正常结束循环。

SQL99语法新特性

先介绍几个SQL99里相当实用的小特性,在日常查询中能够大幅简化操作,值得掌握。

  1. NATURAL JOIN(自然连接):它能够自动匹配两张表中所有同名字段,并完成等值连接。简单来说,就是省去了手动编写多个 ON 条件的麻烦。
select a.dept_id,b.dept_id from A a NATURAL JOIN B b
  1. USING:当两张表存在相同字段名(例如都包含 dept_id)时,使用 USING 指定该字段即可,语法更加简洁明了。
select a.dept_id,b.dept_id form A a join A b USING(dept_id)
  1. 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;

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

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

基本函数

MySQL 内置的基本函数涵盖范围很广,从字符串处理到日期计算应有尽有。下面这张图汇总了大部分常用函数,建议收藏作为速查手册。

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

循环

在存储过程中,循环是必不可少的控制结构。这里通过存储过程来演示三种循环方式:REPEATWHILELOOP,以及跳出循环所用的 LEAVE 和继续下一次循环的 ITERATE

REPEAT 循环

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

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 循环

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

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 循环

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

CREATE DEFINER=`root`@`localhost` PROCEDURE `loopTest`()
BEGIN
  DECLARE nums INT DEFAULT 1;
  test_label: LOOP
    SET nums = nums + 1;
    IF nums >= 110 THEN
      LEA VE test_label;
    END IF;
  END LOOP test_label;
  SELECT nums;
END

LEAVE 跳出循环

LEAVE 既可以用于循环中,也能用在单独的 BEGIN…END 块内。下面的例子展示了在 WHILE 循环里使用 LEAVE 提前终止循环。

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

CREATE DEFINER=`root`@`localhost` PROCEDURE `lea veTest`()
BEGIN
  DECLARE nums INT DEFAULT 1;
  while_label: WHILE TRUE DO
    IF nums > 10 THEN
      LEA VE while_label;
    END IF;
    SET nums = nums + 1;
  END WHILE;
  SELECT nums;
END

ITERATE 执行下一次循环

ITERATE 相当于 Java 中的 continue,只能用于循环内部。下面这个 LOOP 循环中,当 nums < 10 时直接跳转到下一次迭代,只有 nums 在 10~15 之间才会累加并继续执行。

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

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
      LEA VE test_label;
    END IF;
  END LOOP test_label;
  SELECT nums;
END

游标

游标在存储过程中用于逐条处理查询结果集。下面是一个实际数据迁移时用到的示例:遍历分组后的结果,对每个套餐 ID 更新对应的类型标签表。

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 那样直接退出最近的 BEGIN…END 块)。SQLSTATE '02000' 对应的是“未找到记录”,即当游标遍历完所有行后,会执行 SET s = 1,进而让 WHILE 条件不再满足,正常结束循环。

注意:句柄的声明必须放在游标之后,否则会报错 ERROR 1338 (42000): Cursor declaration after handler declaration,顺序不能颠倒。

总结

SQL99 语法中的 NATURAL JOIN、USING 以及全文检索能够使查询更加简洁高效;MySQL 的循环与游标则是存储过程中处理复杂业务逻辑的利器。熟练掌握这些基础用法,日常编写存储过程将更加得心应手。

来源:https://www.jb51.net/database/3657469os.htm
上一篇Hive哈希如何应对数据泄露 下一篇MySQL存储过程游标循环的解决方法
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
用Qwen大模型为MySQL查询推荐最佳可视化图表
数据库 · 2026-07-07

用Qwen大模型为MySQL查询推荐最佳可视化图表

如何用Qwen大模型为MySQL查询自动推荐最佳可视化图表 你是否希望从MySQL查出的销售数据自动生成柱状图,而不是对着满屏数字发呆?刚写完一条SELECT语句,却不确定该使用折线图还是热力图来展示时间趋势?或者你把查询结果复制进Excel后才想起,其实散点图更能说明问题。这些场景是不是很熟悉?

MongoDB 4.0事务处理机制底层原理详解
数据库 · 2026-07-07

MongoDB 4.0事务处理机制底层原理详解

MongoDB4 0多文档事务深度复用WiredTiger引擎原生多行事务能力,基于快照隔离和MVCC机制。事务启动获取clusterTime,读操作基于固定快照,写冲突在提交时检测。oplog异步刷盘可能影响持久性,生产环境需启用journal并控制事务超时。

Qwen大模型助力MySQL敏感数据脱敏与隐私保护
数据库 · 2026-07-07

Qwen大模型助力MySQL敏感数据脱敏与隐私保护

借助Qwen大模型一键生成合规的MySQL脱敏SQL语句 先看一个真实业务场景:你需要在MySQL中对姓名、手机号、身份证号这类敏感字段进行合规脱敏,且脱敏逻辑要具备可复用性、可审计性、可回溯能力。此时直接打开Qwen的Web界面或调用API,输入一条清晰指令就能搞定——例如:“请为MySQL表us

数据库里最反直觉的陷阱:NULL不等于空,90%新手踩过坑
数据库 · 2026-07-07

数据库里最反直觉的陷阱:NULL不等于空,90%新手踩过坑

NULL是数据库中表示“未知”的特殊标记,而非空值或0。它引入三值逻辑,导致用=NULL查不出数据、COUNT(column)忽略NULL、运算结果全为NULL、NOTIN遇NULL返回空、排序位置因数据库而异。正确处理需用ISNULL判断、COALESCE赋默认值、NOTEXISTS替代NOTIN,建表时尽量设置NOTNULL。

Qwen大模型生成MySQL性能优化量化对比报告测评
数据库 · 2026-07-07

Qwen大模型生成MySQL性能优化量化对比报告测评

Qwen大模型能够基于两份CSV文件,自动生成一份包含QPS、延迟等8项核心指标的MySQL优化量化对比报告。您只需导出规范的CSV数据,使用特定提示词触发解析,再将结果转为HTML或PDF格式即可交付。此外,通过三步验证流程,可确保所有数据真实可信,满足技术评审要求。需要一份能直接用于技术评审或D