Bueno, no entiendo cual es el problema. Con la función max podrias hallar el grado máximo en el que se encuentra sin necesidad de hacer nada mas.
¿Es necesario que generes x tablas por semestres? En caso afirmativo lo unico que deberias hacer es un ciclo donde hagas la creación y cierre de tablas de manera dinámica.
Se me ocurre algo asi como:
Código PHP:
for ($i=1,$i<$grado,$i++){
$sql=select * from tabla where grado=$i and alumno='zutanito';
$res=mysqli->query($sql);
while ($row = $res->fetch_assoc()) {
echo "<table>";
echo "<tr>";
///etc etc y al final cierras la tabla para poder crear la siguiente
echo "</table>";
}
}
Eso seria todo.