Формирование связанных подзапросов
При использовании подзапросов во внутреннем запросе можно ссылаться на таблицу, имя которой указано в предложении FROM внешнего запроса. В этом случае такой связанный подзапрос выполняется по одному разу для каждой строки таблицы основного запроса.
Пример: выбрать сведения обо всех предметах обучения, по которым проводился экзамен 20 января 1999 г.
SELECT *
FROM SUBJECT SU WHERE '20/01/1999' IN
(SELECT EXAM_DATE PROM EXAM_MARKS EX WHERE SU.SUBJ ID = EX.SUBJ ID);
В некоторых СУБД для выполнения этого запроса может потребоваться преобразование значения даты в символьный тип. В приведенном запросе su и ЕХ являются псевдонимами (алиасами), то есть специально вводимыми именами, которые могут быть использованы в данном запросе вместо настоящих имен. В приведенном примере они используются вместо имен таблиц SUBJECT и EXAM_MARKS.
Эту же задачу можно решить с помощью операции соединения таблиц:
SELECT DISTINCT SU.SUBJ_ID, SUBJJJAME, HOUR, SEMESTER PROM SUBJECT FIRST,EXAM_MARKS SECOND WHERE FIRST. SUBJ_ID = SECOND.SUBJ_ID AND SECOND.EXAM_DATE = '20/01/1999';
В этом выражении алиасами таблиц являются имена FIRST
И SECOND.
Можно использовать подзапросы, связывающие таблицу со своей собственной копией. Например, надо найти идентификаторы, фамилии и стипендии студентов, получающих стипендию выше средней на курсе, на котором они учатся.
SELECT DISTINCT STUDENT_ID , SURNAME , STIPEND FROM STUDENT El WHERE STIPEND >
(SELECT AVG ( STIPEND)
FROM STUDENT E2
WHERE El.KURS = E2.KURS);
Тот же результат можно получить с помощью следующего запроса:
SELECT DISTINCT STUDENT_ID , SURNAME , STI PEND
FROM STUDENT El,
(SELECT KURS, AVG (STIPENDj AS AVG_STIPEND
FROM STUDENT E2
GROUP BY E2 .KURS) E3 WHERE El. STIPEND > AVG_STIPEND AND El .KURS=E3 .KURS;
Обратите внимание — второй запрос будет выполнен гораздо быстрее. Дело в том, что в первом варианте запроса агрегирующая функция AVG выполняется над таблицей, указанной в подзапросе, для каждой строки внешнего запроса. В другом варианте вторая таблица (алиас Е2) обрабатывается агрегирующей функцией один раз, в результате чего формируется вспомогательная таблица (в запросе она имеет алиас ЕЗ), со строками которой затем соединяются строки первой таблицы (алиас Е1). Следует иметь в виду, что реальное время выполнения запроса в большой степени зависит от оптимизатора запросов конкретной СУБД.
| Maya 3D графика в кино и телевидении Воздействие испытаний ядерного оружия на здоровье населения Объектно-ориентированный язык программирования Java Объектно-ориентированное программирование Delphi Библиотека визуальных компонентов VCL и ее базовые классы Кроссплатформенное программирование для Linux Элементы управления Win32 Элементы управления Windows XP Файлы и устройства ввода/вывода Что такое экспертная система? Объектно-ориентированное программирование Инструментальные средства разработки экспертных систем Программирование на языке CLIPS Критерии и количественные характеристики надежности Расчет характеристик надежности невостанавливаемых резервированных изделий Расчет надежности системы с постоянным резервированием Интегрирование тригонометрических функций Brautkleider koennen Sie bei uns bis 22 Uhr aussuchen;Sie moechten noch kurzfristig eine Stretchlimo mieten? Kein Problem!; |