Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Особенности записи запросов на SQL



Общий вид записи SQL-запроса к базе данных рассмотрим в два этапа: без применения агрегативных функций, а затем с применением. Такое разделение обусловлено тем, что часто студенты забывают, что как только в запрос включены элементы агрегации, существенно изменяется схема результирующего отношения.

Сразу следует оговориться, что написание SQL-запроса хоть, и основано на правилах записи запроса в реляционной алгебре, имеет ряд особенностей, в силу которых он не может в полной мере считаться операцией над множествами в чистом виде.

Учитывая сказанное, мы будем рассматривать те же самые задачи, что и в разделе 3. Так как объяснения решения задач по большей части остаются теми же, то записывать решение мы будем только некоторых из задач, оставляя студенту возможность решить остальные задачи самостоятельно.

Общий вид SQL-запроса без использования агрегативных функций записывается следующим образом

SELECT <список атрибутов>

FROM <список отношений>

WHERE <условие>,

которое можно интерпретировать как

p<список атрибутов> (s<условие> (Í отношений из списка)).

В отличие от реляционной алгебры, в которой декартово произведение при написании запросов используется крайне редко, в условии команды WHERE собраны как условия селекции, так и условия соединения отношений[10]. На самом деле это различие не принципиально, а сказывается только на сложности написания оптимизатора к транслятору, ускоряющему процесс вычисления конечного результата.

Задачи первой серии очень простые, и написание запроса в SQL приведем только для 3 задачи.

Задача 3. Сформировать список студентов – мужчин старше 20 лет, получающих стипендию.

SELECT СТ.Фио

FROM СТ

WHERE СТ.Пол="муж" and СТ.Стип¹nil and СТ.Дрожд<date(day(dt),month(dt),year(dt)-20),

Не намного труднее задачи второй серии

Задача 6. Привести перечень групп с указанием названия специальности, по которой учатся студенты этих групп.

SELECT ГР.Nгр, ПТ.Спец

FROM ПТ, ГР

WHERE ГР.Nпт=ПТ.Nпт

Рассмотрим теперь задачу 9 и ее вариацию 9'.

Задача 9. Дать список названий кафедр и названий дисциплин из цикла "ЕН", за преподавание которых она отвечает.

Задача 9'. Дать список названий кафедр, отвечающих за дисциплины цикла "ЕН".

Первая из этих двух задач может быть решена аналогично предыдущим.

SELECT КФ.Назв, ДЦ.Назв

FROM КФ, ОТВ, ДЦ

WHERE КФ.Nкф=ОТВ.Nкф and ОТВ.Nдц=ДЦ.Nдц
and ДЦ.Цикл="ЕН"

Принципиальным отличием от реляционной алгебры является возможность использования подзапросов в рамках написания основного SQL-запроса. Подзапросы могут появиться как на уровне команды FROM, так и элементом команды WHERE. Если в первом случае вычисление подзапроса должно рассматриваться независимо от других отношений, находящихся в команде FROM, то, так как команда WHERE вычисляется для каждого потенциального кортежа декартова произведения отношений команды FROM, значения атрибутов этого кортежа могут быть использованы как константы при вычислении значения условия команды WHERE.

Учитывая сказанное, задачу 9 можно переписать в виде, приведенном ниже. Здесь на уровне команды FROM, используется подзапрос, уменьшающий мощность отношения ДЦ, и, как следствие, ускоряющий просмотр декартова произведения трех отношений. Отметимдополнительно, что, для того, чтобы в основном запросе выбрать название дисциплины, нам пришлось присвоить имя (ДЦ1) подзапросу и использовать это имя как префикс соответствующего атрибута.

SELECT КФ.Назв, ДЦ1.Назв

FROM КФ, ОТВ, (SELECT ДЦ.Nдц, ДЦ.Назв

FROM ДЦ

WHERE ДЦ.Цикл="ЕН") as ДЦ1

WHERE КФ.Nкф=ОТВ.Nкф and ОТВ.Nдц=ДЦ1.Nдц

Условие команды WHERE может содержать подзапрос (т.е. некоторое множество) в двух случаях: принадлежит ли некоторое значение множеству и существует ли множество.

Особенность задачи 9' состоит в том, что нам не существенны названия дисциплин, а важен только факт их существования. Можно написать подзапрос формирования множества номеров кафедр, отвечающих за дисциплины цикла "ЕН". Например, так

SELECT ОТВ. Nкф

FROM ОТВ, ДЦ

WHERE ДЦ.Цикл="ЕН" and ОТВ.Nдц=ДЦ.Nдц

(Так как отношение ОТВ реализует связь типа M:N между КФ и ДЦ, в полученном отношении номера одних и тех же кафедр могут встречаться несколько раз. Избавиться от повторения номеров кафедр очень просто. Достаточно после команды SELECT написать слово DISTINCT.)

Общее решение задачи 9' может быть записано следующим образом

SELECT КФ.Назв

FROM КФ, (SELECT DISTINCT ОТВ.Nкф

FROM ОТВ, ДЦ

WHERE ДЦ.Цикл="ЕН" and ОТВ.Nдц=ДЦ.Nдц) as КФ1

WHERE КФ.Nкф=КФ1.Nкф

Однако в данной ситуации выгоднее воспользоваться другим способом решения этой задачи, который состоит в перенесении подзапроса с уровня команды FROM в условие команды WHERE. Суть выгоды в том, что вместо анализа декартова произведения, транслятор может воспользоваться быстрыми методами проверки наличия элемента во множестве (например, за счет индексации (предварительного упорядочения) кортежей подзапроса).

SELECT КФ.Назв

FROM КФ





Дата публикования: 2015-10-09; Прочитано: 613 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...