Вложенные запросы в условиях отбора (WHERE и HAVING)
Эти запросы по своей логике ничем не отличаются от запросов, приведенных выше, поэтому просто приведем примеры.
Пусть требуется вывести фамилии самых молодых студентов (т.е. тех, у которых самая поздняя дата рождения). Этот запрос состоит из двух этапов: сначала нужно найти самую позднюю дату рождения (эту задачу решит вложенный запрос), а затем всех студентов, которые имеют найденную дату рождения.
SELECT name_st FROM students WHERE born=
(SELECT MAX(born) FROM students)
Здесь знак равенства в условии WHERE уместен, поскольку вложенный запрос гарантированно возвратит одно непустое значение, если в таблице students имеется хотя бы одна строка (на пустой таблице этот запрос также корректно работает, возвращая сообщение «строки не выбраны»).
Следующий пример несколько объемнее, но использует ту же логику разбиения задачи на несколько этапов.
Пусть требуется найти студентов, которые имеют максимальный (или минимальный) средний балл. Запрос, который находит максимальный средний балл студента, приводился выше, осталось только продолжить логику рассуждений. Зная максимальный средний балл, по таблице оценок можно найти коды студентов, имеющих такой средний балл (здесь потребуется использование фразы HAVING), а по кодам студентов в самом внешнем запросе можно отыскать в таблице студентов их фамилии.
В результате получили «многоэтажный», но довольно простой по логике, запрос:
SELECT name_st FROM students WHERE cod_st IN
(SELECT cod_st FROM marks GROUP BY cod_st HAVING AVG(mark)=
(Select MAX(avg_mark) max_avg_mark from
(select avg (mark) avg_mark from marks group by cod_st
)
)
)
Дата добавления: 2015-08-26; просмотров: 928;