Использование ключевых слов ALL и ANY с вложенными запросами
Конструкции ALL(SELECT …) и ANY(SELECT…) применяются к вложенным запросам, возвращающим множество строк, употребляются, как правило, во фразах WHERE и HAVING, и означают буквально следующее:
all (Select…) – все строки вложенного SELECT
any (Select…) – хотя бы одна из строк вложенного SELECT
В некоторых случаях употребление этих слов позволяет сформулировать запрос просто и точно.
Проиллюстрируем это на примере. Пусть требуется вывести студентов, у которых все оценки – только четверки (никаких других оценок нет). Использование ключевого слова ALL позволяет решить эту задачу «в лоб»:
select cod_st,name_st from students
where 4=all(select mark from marks where cod_st=students.cod_st)
Если же требуется найти студентов, у которых имеется хотя бы одна четверка, можно прибегнуть к помощи ключевого слова ANY:
select cod_st,name_st from students
where 4=aNY(select mark from marks where cod_st=students.cod_st)
К сожалению, в данных примерах получились кореллированные вложенные запросы, так что прозрачность формулировок запроса идет в ущерб производительности.
Можно привести примеры более эффективных запросов, решающих те же самые задачи.
Например, чтобы найти студентов, у которых все оценки – четверки, достаточно сообразить, что у таких студентов и минимальная, и максимальная оценки равны 4:
select st.cod_st, st.name_st from students st, marks m
where st.cod_st= m.cod_st
group by m.cod_st
having min(m.marks)=4 and max(m.marks)=4
А найти студентов, у которых есть хотя бы одна четверка, можно, например, таким запросом:
select DISTINCT st.cod_st, st.name_st from students st, marks m
where st.cod_st= m.cod_st AND m.mark=4
Дата добавления: 2015-08-26; просмотров: 1085;