Подозреваю что на выходе , после цикла
while($row = mysqli_fetch_array($res))
Result set - $res становится ПУСТЫМ! поэтому второй while его не отрабывает.
и либо
- его необходимо наполнить заново, повторно выполнив запрос
$res = mysqli_query($dbc, $query);
либо, что более корректно:
1) заполнить из result set некий массив, далее по коду уже работать с массивом.
2) на каждом номере класса выполнять запрос
SELECT * FROM `pupils` WHERE class = 'НОМЕРКЛАССА' -- я допустил что колонка у вас называется class
и далее делать вывод анологично.
3) что еще более правильное:
получить из базы список классов, например
SELECT DISTINCT class FROM `pupils` -- я допустил что колонка у вас называется class
далее цикл по резалтсету
выводим
<div class="cl">
<h3>НОМЕРКЛАССА</h3>
делаем запрос вида
SELECT * FROM `pupils` WHERE class = 'НОМЕРКЛАССА' -- я допустил что колонка у вас называется class
далее цикл по резалтсету
выводим
<h4>ФИО</h4>
конец вложенного цикла
выводим закрывающий тэг
</div>
конец первого цикла.
как-то так... ну код сами напишете ;)