如何遍历MySQL中表的所有行?

要遍历表的所有行,请使用MySQL中的存储过程。语法如下-

delimiter //
CREATE PROCEDURE yourProcedureName()BEGIN
DECLARE anyVariableName1 INT DEFAULT 0;
DECLARE anyVariableName2 INT DEFAULT 0;
SELECT COUNT(*) FROM yourTableName1 INTO anyVariableName1;
SET anyVariableName2 =0;
WHILE anyVariableName2 < anyVariableName1 DO
   INSERT INTO yourTableName2(yourColumnName,...N) SELECT (yourColumnName1,...N)
FROM yourTableName1 LIMIT anyVariableName2,1;
   SET anyVariableName2 = anyVariableName2+1;
END WHILE;
End;
//

为了理解上述语法,让我们创建两个表,即一个表具有记录,第二个表将使用存储过程从循环中获取记录。

以下是创建第一个表的查询-

mysql> create table AllRows
   -> (
   -> Id int,
   -> Name varchar(100)
   -> );

使用insert命令在第一个表中插入一些记录。查询如下-

mysql> insert into AllRows values(1,'John');

mysql> insert into AllRows values(100,'Carol');

mysql> insert into AllRows values(300,'Sam');

mysql> insert into AllRows values(400,'Mike');

使用select语句显示表中的所有记录。查询如下-

mysql> select *from AllRows;

输出结果

+------+-------+
| Id   | Name  |
+------+-------+
|    1 | John  |
|  100 | Carol |
|  300 | Sam   |
|  400 | Mike  | 
+------+-------+
4 rows in set (0.00 sec)

这是创建第二个表的查询。创建表的查询如下-

mysql> create table SecondTableRows
   -> (
   -> StudentId int,
   -> StudentName varchar(100)
   -> );

现在,您可以使用存储过程遍历表的所有行。存储过程如下-

mysql> delimiter //
mysql> CREATE PROCEDURE Sp_AllRowsOfATable()
   -> BEGIN
   -> DECLARE lastRows INT DEFAULT 0;
   -> DECLARE startRows INT DEFAULT 0;
   -> SELECT COUNT(*) FROM AllRows INTO lastRows;
   -> SET startRows=0;
   -> WHILE startRows <lastRows DO
   -> INSERT INTO SecondTableRows(StudentId) SELECT (Id) FROM AllRows LIMIT
startRows ,1;
   -> SET startRows= startRows+1;
   -> END WHILE;
   -> End;
   -> //
mysql> delimiter ;

使用CALL命令调用存储过程。语法如下-

CALL yourStoredProcedureName;

调用上面的存储过程来循环遍历第一个表的所有行。查询如下-

mysql> call Sp_AllRowsOfATable();

调用存储过程之后,让我们检查第二个表发生了什么。查询如下-

mysql> select StudentId from SecondTableRows;

输出结果

+-----------+
| StudentId |
+-----------+
|         1 |
|       100 |
|       300 |
|       400 |
+-----------+
4 rows in set (0.00 sec)