Теория и практика построения баз данных (1088289), страница 67
Текст из файла (страница 67)
Однако это может привести к неоднозначности. Рассмотрим выражение Результат будет зависеть от того, когда будет применяться условие в предложении ХУНЕКŠ— до или после условия в предложении НАУ1М6. Чтобы устранить зту неопределенность, стандарт 5О) устанавливает правило, согласно которому прелложения УХНЕКЕ должны применяться в первую очередь. Соответственно, и приведенном операторе порядок выполнения операций таков: выбираются студенты четвертого курса; формируются группы; нз групп выбираются те, которые удовлетворяют условию предложения НАУ1М6; выводятся результаты. В данном случае результат выглядит так: (Этот запрос допустим не во всех реализациях 5О1.. В некоторых реализациях единственные атрибуты, которые могут фигурировать во фразе 5ЕЕЕСТ запроса с прелложением 6КООР ВУ, — это атрибуты из фразы 6КООР ВУ и встроенные функции от этих атрибутов.
Таким образом, в данном запросе допустимыми будут только атрибут Специальность и встроенные функции от этого атрибута.) Запрос нескольких таблиц В этом разделе мы распространим наше обсуждение языка БОЕ на операции с дву- мя и более таблицами. Для иллюстрации этих команд будут использоваться таб- лицы СТУДЕНТ, ЗАНЯТИЯ и ЗАПИСЬ. Г)редположим, мы хотим знать имена студентов, записанных на предмет под шифром ВО445. Если нам известно, что на этот предмет записаны студенты с но- мерами 100 и 200, то правильные результаты выдаст следующий запрос: Обычно мы не знаем номеров студентов, записанных на какой-то предмет, по у нас есть возможность их определить.
Рассмотрим выражение 316 Глава 9. Язык 80С Запрос нескольких таблиц 317 ГРОМ ЗАПИСЬ ННЕРЕ НазваннеПреднета = 'В0445' Результатом операции будет таблица: Н Это даст результат: ДЖОНС БЕЙКЕР Результатом будет: БЕИКЕР 5ЕЕЕСТ ЗАНЯТИЯ,НазваниеПреднета ГРОМ ЗАНЯТИЯ ЯНЕКЕ Вреня = 'ПСЯЗ' Вот те номера студентов, которые нам требовались. Комбинируя последние два запроса, мы получаем следующее: 5ЕСЕСТ Иня ГРОМ СТУДЕНТ ННЕРЕ ЛнчнийНонер 1Н (5ЕЕЕСТ НонерСтудента ГРОМ ЗАПИСЬ ИНЕРЕ НазваннеПреднета = 'В0445') Второе предложение 5ЕЕЕСТ, которое называется вложенным запросам (вцЬт)негу), заключено в круглые скобки.
Эти выражения оказывается проще понять, если читать их снизу вверх. Последние три оператора выдают номера студентов, записанных на предмет ВП445, а первые три оператора выдают имена выбранных студентов. Результат запроса таков: Чтобы данная операция была семантически корректной, СТУДЕНТ.ЛичныйНомер и ЗАПИСЬ.НомерСтудента должны иметь один и тот же домен. Вложенные запросы могут состоять из трех или даже большего количества таблиц.
Предположим, например, что мы хотим узнать имена студентов, в расписании у которых стоят занятия по понедельникам, средам и пятницам с 3 часов (они обозначены в наших данных как 'ПСЯЗ'). Прежде всего 4нам нужны названия предметов, занятия по которым начинаются в это время: (Поскольку мы имеем дело с тремя различными таблицами, мы указываем имена столбцов вместе с именами таблиц, чтобы избежать недоразумений и неоднозначности.
Так, ЗАНЯТИЯ,НазваниеПредмета обозначает столбец НазваниеПредмета в отношении ЗАНЯТИЯ.) Далее мы определяем личные номера студентов, записанных на эти предметы, с помощью следующего выражения. 5ЕСЕСТ ЗАПИСЬ.НонерСтудента ГРОМ ЗАПИСЬ ННЕРЕ ЗАПИСЬ.НазваниеПреднета 1Н (5ЕЕЕСТ ЗАНЯТИЯ.НазваннеПреднета ГРОМ ЗАНЯТИЯ ЯНЕКЕ Вреня = 'ПСЯЗ') то есть номера студентов, занимающихся в указанное нами время. Чтобы полу- чить имена этих студентов, мы используем следующее выражение: 5ЕЕЕСТ СТУДЕНТ.Иня ГРОМ СТУДЕНТ ЯНЕКЕ СТУДЕНТ.ЛнчнийНонер !Н 5ЕЕЕСТ ЗАПИСЬ.НонерСтудента ГРОМ ЗАПИСЬ ННЕРЕ ЗАПИСЬ.НазваниеПреднета !Н (5ЕЕЕСТ ЗАНЯТИЯ.НазваннеПреднета ГРОМ ЗАНЯТИЯ ННЕРЕ ЗАНЯТИЯ.
Время = 'ПСЯЗ') Эта стратегия работает хорошо, пока атрибуты, входящие в ответ, происходят из одной и той же таблицы. Если же результат содержит информацию из двух или более таблиц, перед нами встает проблема. Предположим, к примеру, что мы хотим узнать имена студентов и названия предметов, на которые они записаны.
То есть нам нужны атрибуты ЛичныйНомер, ИмяСтудента и НазваниеПредмета. В этом случае результаты происходят из двух различных таблиц (СТУДЕНТ и ЗАПИСЬ), и стратегия вложенных запросов не работает. Соединение с помощью ЗСИ Чтобы получить атрибуты ЛичныйНомер, Имя и НазваниеПредмета для каждого сту- дента, мы должны соединить таблицу СТУДЕНТ с таблицей ЗАПИСЬ. Это делается следующими операторами: 318 Глава 9. Язык ВСй. Запрос нескольких таблиц 31Э БЕСЕСТ СТУДЕНТ.ЛнчныйНонер, СТУДЕНТ.Иня. ЗАПИСЬ.НазваннеПреднета ГКОМ СТУДЕНТ.
ЗАПИСЬ ЫНЕКЕ СТУДЕНТ.ЛичныйНонер = ЗАПИСЬ.НонерСтудента Вспомните, что соелинение — это комбинация трех операций: умножения, затем выборки и наконец (обычно) — проекции. В этом выражении оператор ГКОМ произволит перемножение отношений СТУДЕНТ и ЗАПИСЬ, а оператор тУНЕКЕ производит выборку. Значение выражения звучит так: «Выбрать из произведения отношений СТУДЕНТ и ЗАПИСЬ те строки, в которых значение атрибута ЛмчныйНомер из отношения СТУДЕНТ равно значению атрибута НомерСтудента в отношении ЗАПИСЬ». Наконец, после выборки берется проекция на номер студента, имя и название предмета. Результат имеет следующий вид: Предложение тУНЕКЕ может содержать и другие квалификаторы помимо тех, которые непосредственно требуются для соединения.
Например, 5ЕСЕСТ СТУДЕНТ,ЛнчныйНонер, ЗАПИСЬ.НазваниеПреднета ГКОМ СТУДЕНТ. ЗАПИСЬ ЫНЕКЕ СТУДЕНТ,ЛнчныйНонер = ЗАПИСЬ.НонерСтудента АНО СТУДЕНТ.Иня - 'РАЙ' АМО ЗАПИСЬ.ПорядковыйНонер - 1 Здесь дополнительные квалификаторы — это условия СТУДЕНТ.Имя = 'РАЙ' и ЗАПИСЬ,ПорядковыйНомер = 1. Это выражение будет иметь своим результатом список учетных номеров всех студентов по имени Рай, кто записался первым на какой-либо предмет, и список соответствующих предметов. Когда требуются данные более чем из двух таблиц, мы можем использовать аналогичную стратегию. В следующем примере соединяются три таблицы: 5ЕСЕСТ СТУДЕНТ.ЛнчныйНонер.
ЗАНЯТИЯ.НазваннеПреднета, ЗАНЯТИЯ.Вреня, ЗАПИСЬ.ПорядковыйНонер ГКОМ СТУДЕНТ, ЗАПИСЬ. ПРЕДМЕТ ЫНЕКЕ СТУДЕНТ.ЛичныйНонер = ЗАПИСЬ.НонерСтудента АЧО ЗАПИСЬ.НазваннеПреднета = ЗАНЯТИЯ.НазваниеПреднета АМО СТУДЕНТ.Имя - 'БЕЙКЕР' Результатом этой операции будет: Сравнение вложенного запроса и соединения Соединение может использоваться в качестве альтернативы множеству вложенных запросов.
Например, мы использовали вложенный запрос для нахождения студентов, записанных на предмет В0445. Для представления этого запроса мы также можем использовать соединение: 5ЕЕЕСТ СТУДЕНТ.Иня ГКОМ СТУДЕНТ, ЗАПИСЬ ИНЕКЕ СТУДЕНТ.ЛнчныйНонер = ЗАПИСЬ.НонерСтудента АМО ЗАПИСЬ.НазваннеПреднета = 'В0445' Подобным же образом вопрос «Каковы имена студентов, занимающихся по понедельникам, средам и пятнипам в 3 часа?» может быть представлен в виде запроса 5ЕЕЕСТ СТУДЕНТ.Иня ГНОМ СТУДЕНТ. ЗАПИСЬ. ЗАНЯТИЯ ИНЕке сТуДент.лнчныйНонер = ЗАПИСЬ.НонерСтудента АМО ЗАПИСЬ.НазваннеПреднета = ЗАНЯТИЯ.НазваннеПреднета АМО ЗАНЯТИЯ.Вреня = 'ПСЯЗ' Хотя выражения с соединением во многих случаях могут составить альтернативу вложенным запросам, они не способны заменить их в любой ситуации.
Например, вложенные запросы со служебными словами ЕХ15Т5 и МОТ ЕХ15Т5 (обсуждаются ниже) нельзя представить с помощью соелинений. Не все соелинения можно заменить вложенным запросом. Когда используется соединение, отображаемые столбцы могут относиться к любой из соединяемых таблиц, а вложенный запрос способен отобразить столбцы только той таблицы, которая указана в выражении ГКОМ первого оператора 5ЕЕЕСТ. Предположим, например, что мы хотим определить названия курсов, на которые записаны студенты. Мы можем выразить это в виде вложенного запроса; 5ЕСЕСТ 015Т1МСТ НазваниеПреднета ГКОМ ЗАПИСЬ 320 Глава 9.
Язык 8ОС Результатом будет: ННЕЙЕ НомерСтудента 1Н 15ЕСЕСТ ЛнчныйНомер ЕЙОМ СТУДЕНТ ЫНЕЙЕ Курс НОТ = 'АС') или в виде соединения: Результат имеет следующий вид: Внешнее соединение 5Е1.ЕСТ Имя. НазваннеПредмета ЕЙОМ СТУДЕНТ СЕЕТ 001Н ЗАПИСЬ ОН ЛнчныйНомер - НомерСтудента: 5ЕСЕСТ 015Т!НСТ НазваннеПредмета ЕЙОМ ЗАПИСЬ. СТУДЕНТ ННЕЙЕ ЗАПИСЬ.НонерСтудента = СТУДЕНТ.ЛичныйНомер АНО Курс НОТ = 'АС' Но если мы хотим знать и названия предметов, и номера курсов, на которых учатся студенты, мы должньв использовать соединение.