Delphi | Сети | ПК | Маршрутизаторы | Моделирование | Протоколы | Экспертные системы | Удаленный доступ | Доменные имена
Аплеты | SQL | Надежность | Задачи | Информационные процессы | JAVA | Отказы изделия | Расчет надежности показателей | Инфсис

Основные понятия и способы применения SQL - в примерах и задачах

SQL язык запросов к реляционным базам данных Учебник

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

При использовании подзапросов во внутреннем запросе можно ссылаться на таблицу, имя которой указано в предложе­нии 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). Следует иметь в виду, что реальное время выполнения запроса в большой степени зависит от оптимизатора запросов конкретной СУБД.

 

Математический анализ, лекции по физике Компьютерные сети