关于like语句的循环查询

本文介绍了一种使用SQL进行复杂查询的方法,特别是如何通过子查询和连接操作来筛选特定的数据记录,并按指定条件进行排序。

 

select s.uecode,s.codedic  from sys_function s ,(select uecode uecode from sys_function  where fid in(0013000000,0014000000)) t
  where s.uecode like t.uecode||'%' order by s.uecode

 

<think>嗯,用户想了解如何在MySQL中使用循环执行删除语句的方法。我先看看用户提供的参考引用,发现其中有不少相关信息。用户引用了四篇资料,仔细一看:第一篇讲的是根据查询结果循环执行SQL的基本流程;第二篇讨论如何监控正在执行的SQL语句;第三篇详细介绍了用存储过程实现循环操作的具体语法,包括LOOP和REPEAT的示例;第四篇则涉及查看执行中SQL的方法。这些资料很全面啊,特别是第三篇对存储过程的说明非常实用。结合用户需求来想,用户明显需要动态删除数据的场景。不过要提醒用户注意,MySQL的DELETE语句本来就能用WHERE条件批量删除,多数情况下根本不需要循环。只有在需要逐条处理或有特殊逻辑时才用循环。我准备用存储过程来实现循环删除,这样效率高又安全。在存储过程里可以这么设计:先用游标安全遍历要删除的数据集,每取一条记录就执行删除。这样能避免锁表问题。参考第三篇引用的存储过程写法,DECLARE声明变量很重要,BEGIN和END的代码块结构也要写规范。得特别注意循环内的COMMIT频率控制,防止大事务超时。对了用户可能是新手,我得强调安全事项。比如测试时用SELECT替代DELETE验证逻辑,循环删除前务必备份数据。事务控制也很关键,最好每次删少量就COMMIT一次。这些安全措施比单纯给代码更重要。示例结构可以这样:先创建测试表和示例数据,然后写带游标的存储过程。在循环内用IF添加条件判断的演示会更实用。最后别忘了让用户调用存储过程的步骤。这个方案应该能满足需求了。用户可能还会关心如何监控执行进度,这正好用上第二篇引用的监控方案,比如SHOWPROCESSLIST。不过实际执行时用SELECT看进度更直观。这些细节也要点到。</think> 以下是在 MySQL 中使用存储过程通过循环执行删除语句的完整示例教程,结合核心引用内容整理: --- ### 一、循环删除的实现方法 **核心原理**:通过存储过程中的游标(Cursor)逐行获取待删除数据,再执行动态 SQL 删除操作(参考引用[3])。 ### 二、示例教程 #### 1. 创建测试数据 ```sql CREATE TABLE `user_log` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `user_id` INT NOT NULL, `log_time` DATETIME NOT NULL ); -- 插入示例数据 INSERT INTO `user_log` (`user_id`, `log_time`) VALUES (1, '2023-01-01'), (1, '2023-02-01'), (2, '2023-01-15'), (3, '2024-05-01'); -- 符合保留条件的数据 ``` #### 2. 创建循环删除存储过程 ```sql DELIMITER $$ -- 修改分隔符(引用[3]) CREATE PROCEDURE batch_delete_old_logs() BEGIN DECLARE done BOOLEAN DEFAULT FALSE; DECLARE target_id INT; DECLARE target_time DATETIME; -- 声明游标:查询所有 2024 年之前的日志 DECLARE cur CURSOR FOR SELECT user_id, log_time FROM user_log WHERE log_time < '2024-01-01'; -- 删除条件 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; -- 打开游标 -- 开始循环 delete_loop: LOOP FETCH cur INTO target_id, target_time; IF done THEN LEAVE delete_loop; END IF; -- 执行删除(核心操作) DELETE FROM user_log WHERE user_id = target_id AND log_time = target_time; -- 可选:添加事务控制(每删除 100 条提交一次) END LOOP; CLOSE cur; -- 关闭游标 END$$ DELIMITER ; -- 恢复分隔符 ``` #### 3. 执行存储过程 ```sql CALL batch_delete_old_logs(); -- 调用存储过程 ``` #### 4. 监控执行状态(引用[2][4]) ```sql -- 查看正在执行的 SQL SELECT * FROM information_schema.PROCESSLIST WHERE COMMAND = 'Query' AND INFO LIKE '%DELETE%'; ``` --- ### 三、关键注意事项 1. **游标与循环** - 使用 `DECLARE cur CURSOR FOR ...` 定义待处理数据集 - `LOOP ... END LOOP` 结构实现逐行操作(引用[3]) 2. **安全建议** - 测试阶段先用 `SELECT` 替代 `DELETE` 验证条件 - 重要数据提前备份:`CREATE TABLE backup_table AS SELECT * FROM original_table;` 3. **性能优化** - 在循环内添加分批提交逻辑: ```sql IF @count % 100 = 0 THEN COMMIT; END IF; SET @count = @count + 1; ``` 4. **替代方案** 简单条件可直接批量删除: ```sql DELETE FROM user_log WHERE log_time < '2024-01-01'; -- 避免循环 ``` --- ### 四、典型应用场景 1. 分批次清理历史数据(如日志表) 2. 需要动态拼接条件的复杂删除操作 3. 数据迁移前的有选择清理 > **提示**:实际业务中优先尝试批量删除,仅在处理复杂逻辑时使用循环方案[^1][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值