Введение в системы БД (542480), страница 65
Текст из файла (страница 65)
4. Между прочим, в этом примере можно было бы прекрасно обойтись и без спецификаторов (Р.). ЯЕЬЕСТ СОЬОВ, С1ТТ РВОМ Р ИНЕВЕ С1ТТ <> 'Рагфв' АМО ИЕ16НТ > 10.0 Согласно общему правилу языка ЯО(. неуточненные имена допускаются во всех случаях, когда это не вызывает неоднозначности. Однако в наших примерах спецификаторы будут использоваться и в тех случаях, когда формально они будут излишни.
К сожалению, в определенных контекстах явно требуется, чтобы имена столбцов были не уточнены! Например, это требуется в предложении ОВОЕВ ВУ (см. следующий пример). 5, В интерактивных Я;Н.-запросах может также использоваться предложение ОВОЕВ ВТ, уже упоминавшееся в главе 4 в связи с объявлением ОЕСЕАВЕ СОВЯОВ. ЯЕЬЕСТ Р.СОЬОВ, Р.С1ТТ РВОМ Р ИНЕВЕ Р.С1ТХ <> 'Рагфв' АМО Р.ИЕТОНТ > 10.0 у ОВОЕВ ВТ СТТУ ОЕЯС у 6.
Напоминаем, что допускается использование сокрашения ЯЕЬЕСТ *, о котором упоминалось в главе 4. ЯЕЬЕСТ * РВОМ Р ИНЕВЕ Р.С1ТТ <> 'Раг(в' АМО Р.ИЕ16НТ > 10.0 > Символ "*" в выражении ЯЕЬЕСТ * заменяет список имен всех столбцов таблицы (или таблиц), указанной в предложении РВОМ.
В этом списке имена столбцов идут а том порядке, в котором они расположены в соответствующей таблице (или таблицах). Следует отметить, что такую сокращенную запись особенно удобно использовать в интерактивных запросах, поскольку при этом уменьшается количество нажатий клавиш.
Однако существует скрытая опасность при использовании этой конструкции во внедренных ЯО(.-операторах (т.е. в операторах языка ЯОЬ, внедренных в программу на другом языке), поскольку в подобных случаях символ "*'* может иметь совсем другое значение (например, когда столбец добавляется в таблицу или удаляется из нее с помощью оператора АНТЕЕ ТАВОТЕ). 7. (Более важная ингрориаиия по сравнению с привеоенной в предыдуиГих пунктаг)) Обратите внимание, что для используемого нами в примерах набора данных этот запрос будет возвращать четыре строки, а не две, несмотря на то что три из них 268 Часть 11.
Реляционная модель будут совершенно идентичны. Язык Я )Ь не предполагает удаления излишних дублируюшихся строк из результата оператора БЕЬЕСТ, пока пользователь явно не потребует этого с помошью ключевого слова 01 БТ1МСТ, как показано ниже. ЯЕЬЕСТ 01ЯТТМСТ Р.СОЬОК, Р.С1ТУ ГНОМ Р ИНЕКЕ Р.С1ТТ <> 'Раг1в' АМО Р.ИЕ16НТ > 10.0 Данный вариант запроса будет возвращать уже две строки, а не четыре.
Из всего вышесказанного следует, что фундаиентаяьныи объектом данных в языке оЬ)Ь является не отношение, а, скорее, таблица. Б >Ь-таблицы содержат не множества, а мульткинажества строк (в мультимножествах допускаются повторения элементов). Таким образом, в языке Я)Ь нарушается информационный принцип (см. раздел 3.2 главы 3). Одно из следствий этого факта состоит в том, что основные БОЬ-операторы являются не истинными реляционными операторами, а их мультимножественными аналогами. Другим следствием является то, что следствия и теоремы, выполняюшиеся в реляционной модели (например, о преобразовании выражений (5.6)), необязательно выполняются в языке Я;Н . 7.7.2. Для всех деталей указать номер и вес в граммах ЯЕЬЕСТ Р.Р4, Р.ИЕ16НТ Я 454 АЯ 6ИИТ ГКОМ Р ; Спецификация АЯ СМИТ вводит соответствуюшее имя результируюшего столбца.
Таким образом, два столбца результируюшей таблицы будут называться Р4 и 6ИИТ. Если бы спецификация АБ 6ИИТ была опущена, то соответствуюший столбец был бы фактически безымянным. Отметим, что хотя в подобных случаях правила языка БОЬ в действительности не требуют от пользователя указания имени результируюшего столбца, в наших примерах будем их задавать всегда.
7.7.3. Выбрать информацию обо всех парах поставщиков и деталей, находящихся в одном городе В языке БОЬ существует несколько способов формулирования этого запроса. Приведем три самых простых. 1. ЯЕ1 ЕСТ Я.*, Р.Р4, Р.РИАИЕ, Р.СОЬОК, Р ИЕ16НТ ГНОМ Я, Р ИНЕКЕ Я.С1ТУ = Р.С1ТУ ) 2. Б 101М Р ОЯ1М6 СХТУ 3. Я МАТНКАЬ 001И Р Результатом в каждом случае будет естественное соединение таблиц Я и Р (по атрибуту города С1ТТ). 269 Глава 7. Реляционное исчисление Первая формулировка заслуживает более подробного обсуждения.
Именно она одна из трех предложенных вариантов являешься допустимой в первоначальной версии языка ЯОЬ (явная операция Л01М была добавлена в стандарт Я.>Е!92). Концептуально можно рассматривать реализацию этой версии запроса следующим образом. ° Во-первых, после выполнения предложения ГНОМ мы получаем декартово произведение Б Т1МЕЯ Р. (Строго говоря, перед вычислением произведения следовало бы позаботиться о переименовании столбцов.
Для простоты мы этого не делаем. Напоминаем также, что, как следует из упр. 6.12 главы 6, "декартово произведение" для единственной таблицы Т можно рассматривать как саму таблицу Т.) ° Во-вторых, после выполнения предложения ЯНЕКЕ мы получаем выборку из этого произведения, в которой два значения атрибута С1ТХ в каждой строке равны (иначе говоря, выполнено соединение таблиц поставщиков и деталей по эквивалентности их атрибутов городов). ° В-третьих, после выполнения предложения БЕЬЕСТ мы получаем проекцию выборки по столбцам, указанным в предложении ЯЕЬЕСТ. Конечным результатом будет естественное соединение указанных таблиц.
Следовательно, нестрого говоря, предложение ГНОМ в языке ЯОЬ соответствует декартову произведению, предложение ЯНЕКŠ— операции выборки, а совместное применение предложений ЯЕЬЕСТ-ГНОМ-ННЕКŠ— проекции выборки произведения. Продолжение обсуждения можно найти в приложении А. 7.7.4. Найти все пары названий городов, таких, что поставщик из первого города поставляет деталь, находящуюся во втором городе ЯЕЬЕСТ 01ЯТ1МСТ Я.С1ТХ АЯ ЯС1ТХ, Р.С1ТХ АЯ РС1ТХ ГНОМ Б 101М ЯР ОБ1МБ ЯФ 001М Р ОБ1МБ РМ Обратите внимание, что приведенный ниже оператор будет некорректным (поскольку он включает столбец С1ТХ как присоединяемый столбец во втором соединении).
ЯЕЬЕСТ 01ЯТ1МСТ Я.С1ТХ АЯ ЯС1ТХ, Р.С1ТХ АЯ РС1ТХ ГКОМ Я МАТОКАЬ 001М ЯР МАТНКАЬ 001М Р 7.7.5. Выбрать все пары номеров поставщиков, таких, что оба поставщика в каждой паре находятся в одном городе ЯЕЬЕСТ А.Я$ АЯ ЯА, В.Ят АЯ БВ ГНОМ Я АЯ А, Я АЯ В ИНЕКЕ А.С1ТХ в В.С1ТХ АМО А.БХ < В.Я4 3 В этом примере требуется явно указывать переменные кортежей. Также следует оз.- метить, что вводимые имена столбцов БА и ЯВ относятся к столбцам резулынирующей гваблицы, и потому не могут использоваться в предложении ИНЕКЕ. 270 Часть 11. Реляционная модель 7.7.6. Определить общее количество поставщиков ЯЕЬЕСТ СООНТ(е) АЯ Н РЕОМ Результатом будет таблица с одним столбцом, которому присвоено имя Н, и одной строкой, содержашей значение 5.
Язык ЯОЬ поддерживает типичный набор обобшаюших функций: СОНЕТ, ЯОИ, АЧО, ИАХ и М1Н. Однако имеется несколько специфических для языка Я()Ь особенностей, которые пользователю необходимо знать. ° В общем случае аргументу обобшаюшей функции может предшествовать необязательное ключевое слово О1ЯТ1НСТ (например, ЯОМ(О1ЯТ1НСТ ОТУ)), указываюшее, что перед применением этой функции дублируюшиеся строки должны быть удалены.
Для функций ИАХ и М1Н ключевое слово О1ЯТ1НСТ является излишним и не вызывает никакого действия. ° Специальная обобшаюшая функция СОНЕТ(*) не допускает использования ключевого слова О1ЯТ1НСТ и предназначена для подсчета всех строк в таблице без предварительного удаления дублируюшихся строк.
° Любые НОЬЬ-значения в столбце-аргументе (глава !8) удаляются перед применением обобщающей функции в зависимости от того, указано ли ключевое слово О1ЯТ1НСТ, кроме случая использования обобщающей функции СОЛТ('), когда НОЬЬ-значения обрабатываются так же, как обычные значения. ° Если аргумент представляет собой пустое множество, обобшаюшая функция СОНЕТ возвращает значение нуль, а все другие операторы возвращают НОЬЬ- значение (неопределенное значение). (В 13.3) показано, что подобное поведение операторов некорректно, однако язык БОЬ определяет их именно таким образом.) 7.7.7.