2.9.     Формирование связанных подзапросов

При использовании подзапросов во внутреннем запросе можно ссылаться на таблицу, имя которой указано в предложе­нии FROM внешнего запроса. В этом случае такой связанный подзапрос выполняется по одному разу для каждой строки таб­лицы основного запроса.

Пример: выбрать сведения обо всех предметах обучения, по которым проводился экзамен 20 января 1999 г.

SELECT *

FROM SUBJECT SU WHERE '20/01/1999' IN

(SELECT EXAM_DATE PROM EXAMMARKS EX WHERE SU.SUBJ_ID = EX.SUBJ_ID);

В некоторых СУБД для выполнения этого запроса может потребоваться преобразование значения даты в символьный тип. В приведенном запросе su и ЕХ являются псевдонимами (алиасами), то есть специально вводимыми именами, которые могут быть использованы в данном запросе вместо настоящих имен. В приведенном примере они используются вместо имен таблиц SUBJECT и EXAM MARKS.

Эту же задачу можно решить с помощью операции соедине­ния таблиц:

SELECT DISTINCT SU.SUBJJD, SUBJJJAME, HOUR, SEMESTER PROM SUBJECT FIRST,EXAM MARKS SECOND WHERE  FIRST.SUBJJD  =   SECOND. SUBJJD AND SECOND.EXAM_DATE = '20/01/1999';

В этом выражении алиасами таблиц являются имена FIRST

И SECOND.

Можно использовать подзапросы, связывающие таблицу со своей собственной копией. Например, надо найти идентифи­каторы, фамилии и стипендии студентов, получающих стипен­дию выше средней на курсе, на котором они учатся.

SELECT DISTINCT STUDENT_ID , SURNAME, STIPEND FROM STUDENT El WHERE STIPEND >

(SELECTAVG ( STIPEND) FROM STUDENT E2 WHERE El.KURS = E2.KURS);

Тот же результат можно получить с помощью следующего запроса:

SELECT DISTINCT STUDENT_ID, SURNAME , STI PEND FROM STUDENT El,

(SELECT KURS,   AVG (STIPEND]   AS AVG_STIPEND FROM STUDENT E2 GROUP BY E2.KURS! E3 WHERE  El.STIPEND > AVG_S TIP END AND El. KURS=E3 . KURS;

Обратите внимание — второй запрос будет выполнен гораздо быстрее. Дело в том, что в первом варианте запроса агрегирую­щая функция AVG выполняется надтаблицей, указанной в под­запросе, для каждой строки внешнего запроса. В другом вари­анте вторая таблица (алиас Е2) обрабатывается агрегирующей функцией один раз, в результате чего формируется вспомогатель­ная таблица (в запросе она имеет алиас ЕЗ), со строками которой затем соединяются строки первой таблицы (алиас Е1). Следует иметь в виду, что реальное время выполнения запроса в большой степени зависит от оптимизатора запросов конкретной СУБД.