Сопротивление материалов выполнение курсовой Инженерная графика выполнение сборочного чертежа История искусства Курс лекций по физике Примеры решения задач Реляционные базы данных
Искусство эпохи Средневековья Западная Европа Архитектура Скульптура Живопись Франция Италия Англия Германия Россия Искусство Этрусков древнеегипетская цивилизация Проторенессансом Романское искусство Готическое искусство Византия

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

 

Древнерусское искусство Зодчество.