Скачиваний:
147
Добавлен:
02.05.2014
Размер:
2.66 Mб
Скачать

7.7.2. Для всех деталей указать номер и вес в граммах

SELECT P.Pt, P.WEIGHT * 454 AS GMWT FROM P ;

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

7.7.3. Выбрать информацию обо всех парах поставщиков и деталей, находящихся в одном городе

В языке SQL существует несколько способов формулирования этого запроса. Приве- дем три самых простых.

1. SELECT S.*, P.Pt, P.PNAME, P.COLOR, P.WEIGHT FROM S, P

WHERE S.CITY = P.CITY ;

  1. S JOIN P USING CITY ;

  2. S NATURAL JOIN P ;

Результатом в каждом случае будет естественное соединение таблиц S и Р (по атри- буту города CITY).

Первая формулировка заслуживает более подробного обсуждения. Именно она одна из трех предложенных вариантов является допустимой в первоначальной версии языка SQL (явная операция JOIN была добавлена в стандарт SQL/92). Концептуально можно рассматривать реализацию этой версии запроса следующим образом.

  • Во-первых, после выполнения предложения FROM мы получаем декартово произ- ведение S TIMES Р. (Строго говоря, перед вычислением произведения следовало бы позаботиться о переименовании столбцов. Для простоты мы этого не делаем. Напоминаем также, что, как следует из упр. 6.12 главы 6, "декартово произведе- ние" для единственной таблицы Т можно рассматривать как саму таблицу Т.)

  • Во-вторых, после выполнения предложения WHERE мы получаем выборку из этого произведения, в которой два значения атрибута CITY в каждой строке равны (иначе говоря, выполнено соединение таблиц поставщиков и деталей по эквива- лентности их атрибутов городов).

  • В-третьих, после выполнения предложения SELECT мы получаем проекцию вы- борки по столбцам, указанным в предложении SELECT. Конечным результатом бу- дет естественное соединение указанных таблиц.

Следовательно, нестрого говоря, предложение FROM в языке SQL соответствует декар- тову произведению, предложение WHERE — операции выборки, а совместное применение предложений SELECT-FROM-WHERE — проекции выборки произведения. Продолжение об- суждения можно найти в приложении А.

7.7.4. Найти все пары названий городов, таких, что поставщик из первого города поставляет деталь, находящуюся во втором городе

SELECT DISTINCT S.CITY AS SCITY, P.CITY AS PCITY FROM S JOIN SP USING St JOIN P USING P# ;

Обратите внимание, что приведенный ниже оператор будет некорректным (поскольку он включает столбец CITY как присоединяемый столбец во втором соединении).

SELECT DISTINCT S.CITY AS SCITY, P.CITY AS PCITY FROM S NATURAL JOIN SP NATURAL JOIN P ;

7.7.5. Выбрать все пары номеров поставщиков, таких, что оба поставщика в каждой паре находятся

в одном городе

SELECT A.Si AS SA, В.Si AS SB FROM S AS A, S AS В

WHERE A.CITY = B.CITY AND A.Si < B.Si ;

В этом примере требуется явно указывать переменные кортежей. Также следует от- метить, что вводимые имена столбцов SA и SB относятся к столбцам результирующей таблицы, и потому не могут использоваться в предложении WHERE.

1' Отметим, что данный аспект алгебры, как правило, недооценивается в литературе (и, как это ни печально, в языке SQL, а значит, и в SQL-продуктах). Это не относится к двум заметным работам —Холла и др. [6.10] иДарвена [6.2]. Представленная в данной главе версия реляционной алгебры была выбрана в значительной мере под влиянием этих двух работ.

2 Исторически сложилось так, что в большинстве публикаций по базам данных (в том числе в предыдущих изданиях этой книги) для обозначения совместимых по типу отношений использу- ется термин совместимость относительно объединения. Однако по ряду причин этот термин не совсем удачен. Наиболее очевидной причиной является то, что данное обозначение в действи- тельности применяется не только к операции объединения.

3 Действительно, операция деления задумывалась Коддом как алгебраический аналог кванто- ра всеобщности (глава 7), а проекция — как алгебраический аналог квантора существования.

4 Поскольку произведение является специальным видом соединения, в этом перечне прими- тивных операторов его можно заменить соединением. Более того, в перечень необходимо так- же добавить оператор RENAME, поскольку наша алгебра отличие от алгебры, определенной в [6.1]) опирается на имена атрибутов, а не на их порядковые номера.

5 В этом примере предполагается корректность операции умножения "*" веса детали на це- лое число. А каков тип результата этой операции?

6 Выражение RELATION { TUPLE { } } в предложении PER этого примера обозначает от- ношение (в действительности единственное в своем роде отношение), которое не имеет атри- бутов, но имеет один кортеж (а именно 0-кортеж). Это выражение можно сокращенно на- зывать TABLE DEE[3.3], [5.5], [6.2].

7 Как и в главе б, мы не приводим здесь подробного описания параметра <выражение кортежа>, надеясь, что общая идея его построения будет понятна из примеров

8В действительности алгоритм, представленный в [6.1], содержит небольшую ошибку [7.2]. Более того, определенная в этой статье версия реляционного исчисления не включала аналога опе- ратора объединения, следовательно, исчисление Кодда значительно менее мощное, чем его алгебра. Как бы там ни было, утверждение о том, что алгебра и исчисление, включающее аналог операции объединения, эквивалентны, является истиной, что доказано многими авторами [6.12].

9 Вследствие этого, как отмечается в аннотации к [4.18], конструкцию Ш <подзапрос> можно полностью удалить из языка без потери его функциональности! В этом есть некоторая ирония, по- скольку благодаря именно такой конструкции в названии данного языка, в переводе означающего "язык структурированных запросов" (Structured Query Language), появилось слово "структурированных" (Structured). В действительности именно эта конструкция способствовала тому, что язык SQL ока- зался на первом месте, оставив позади и реляционную алгебру, и реляционное исчисление.

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]