Программирование >>  Хронологические базы данных 

1 ... 77 78 79 [ 80 ] 81 82 83 ... 348


будут совершенно идентичны. Язык SQL не предполагает удаления излишних дуб-лируюшихся строк из результата оператора SELECT, пока пользователь явно не потребует этого с помошью ключевого слова DISTINCT, как показано ниже.

SELECT DISTINCT P.COLOR, P.CITY FROM P

WHERE P.CITY О Paris AND P.WEIGHT > 10.0 ;

Данный вариант запроса будет возврашать уже две строки, а не четыре.

Из всего вышесказанного следует, что фундаментальным объектом данных в языке SQL является не отношение, а, скорее, таблица. SQL-таблицы содержат не множества, а мультимножества строк (в мультимножествах допускаются повторения элементов). Таким образом, в языке SQL нарушается информационный принцип (см. раздел 3.2 главы 3). Одно из следствий этого факта состоит в том, что основные SQL-операторы являются не истинными реляционными операторами, а их мультимножественными аналогами. Другим следствием является то, что следствия и теоремы, выполняющиеся в реляционной модели (например, о преобразовании выражений [5.6]), необязательно выполняются в языке SQL.

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

SELECT Р.Pi, Р.WEIGHT * 454 AS GMWT FROM P ;

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

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

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

1. SELECT S.*, Р.Pi, Р.PNAME, Р.COLOR, Р.WEIGHT FROM S, Р

WHERE S.CITY = P.CITY ;

2. S JOIN P USING CITY ;

3. 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 Si JOIN P USING Pi ;

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

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

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

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

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

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

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



7.7.6. Определить общее количество поставщиков

SELECT COUNT(*) AS N FROM S ;

Результатом будет таблица с одним столбцом, которому присвоено имя N, и одной строкой, содержащей значение 5. Язык SQL поддерживает типичный набор обобщающих функций: COUNT, SUM, AVG, MAX и MIN. Однако имеется несколько специфических для языка SQL особенностей, которые пользователю необходимо знать.

В общем случае аргументу обобщающей функции может предшествовать необязательное ключевое слово DISTINCT (например, SUM (DISTINCT QTY)), указывающее, что перед применением этой функции дублирующиеся строки должны быть удалены. Для функций МАХ и MIN ключевое слово DISTINCT является излишним и не вызывает никакого действия.

Специальная обобщающая функция COUNT(*) не допускает использования ключевого слова DISTINCT и предназначена для подсчета всех строк в таблице без предварительного удаления дублирующихся строк.

Любые NULL-значения в столбце-аргументе (глава 18) удаляются перед применением обобщающей функции в зависимости от того, указано ли ключевое слово DISTINCT, кроме случая использования обобщающей функции COUNT(*), когда NULL-значения обрабатываются так же, как обычные значения.

Если аргумент представляет собой пустое множество, обобщающая функция COUNT возвращает значение нуль, а все другие операторы возвращают NULL-значение (неопределенное значение). (В [3.3] показано, что подобное поведение операторов некорректно, однако язык SQL определяет их именно таким образом.)

7.7.7. Определить в поставках максимальное

и минимальное количество деталей с номером Р2

SELECT МАХ ( SP.QTY ) AS MAXQ, MIN ( SP.QTY ) AS MINQ FROM SP

WHERE SP.Pi = P2 ;

Здесь оба предложения, FROM и WHERE, фактически предоставляют часть аргументов для двух обобщающих функций. Следовательно, по логике вещей они должны были бы записываться в скобках, заключающих аргументы. Тем не менее данный запрос действительно должен записываться именно так, как показано выше. Этот неортодоксальный подход к синтаксису оказывает существенное отрицательное влияние на структуру, удобство использования и ортогональность языка SQL. Например, одно из следствий состоит в том, что обобщающие функции не могут быть вложенными, в ре-

Ортогональность здесь означает независимость. Язык является ортогональным, если независимые понятия сохраняют в нем свою независимость и не смешиваются между собой непонятным образом. Ортогональность весьма желательна, поскольку чем менее ортогонален язык, тем он более сложен и, как это ни парадоксально, менее мощен.



1 ... 77 78 79 [ 80 ] 81 82 83 ... 348

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика