|
Программирование >> Хронологические базы данных
будут совершенно идентичны. Язык 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. Например, одно из следствий состоит в том, что обобщающие функции не могут быть вложенными, в ре- Ортогональность здесь означает независимость. Язык является ортогональным, если независимые понятия сохраняют в нем свою независимость и не смешиваются между собой непонятным образом. Ортогональность весьма желательна, поскольку чем менее ортогонален язык, тем он более сложен и, как это ни парадоксально, менее мощен.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |