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

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


7.6.6. Определить имена поставщиков, которые не поставляют деталь с номером Т2

NAMEX WHERE EXISTS SX ( S ( Si:SX, SNME:NAMEX )

AND NOT SP (S#:SX, P:Pi(P2) ) )

7.6.7. Определить номера поставщиков всех типов деталей, поставляемых поставщиком с номером S2

SX WHERE FORALL РХ ( IF SP ( Si:Si(S2), P#:PX )

THEN SP ( Si:SX, P:PX ) END IF )

7.6.8. Получить номера деталей, которые либо весят более 16 фунтов, либо поставляются поставщиком с номером S2, либо и то, и другое

РХ WHERE EXISTS WEIGHTX

{ Р ( Pi:PX, WEIGHT-.WEIGHTX )

AND WEIGHTX > WEIGHT ( 16.0 ) ) OR SP ( Si:Si(S2), Pi:PX )

Исчисление доменов, как и исчисление кортежей, формально эквивалентно реляционной алгебре (т.е. оно реляционно полно). Для доказательства можно сослаться, например, на статью Ульмана (UUman) [7.13].

7.7. Средства языка SQL

Как уже говорилось в разделе 7.4, в основу реляционного языка могут быть положены как реляционная алгебра, так и реляционное исчисление. Что же положено в основу языка SQL? К сожалению, ответом будет частично и то, и другое, а частично ни то, ни другое... . Когда язык SQL только разрабатывался, предполагалось что он будет отличаться как от реляционной алгебры, так и от реляционного исчисления [4.8]. Действительно, именно этим мотивировалось введение в язык конструкции IN <подзапрос> (см. пример 7.7.10, приведенный ниже). Однако со временем выяснилось, что язык SQL нуждается в определенных средствах как реляционной алгебры, так и исчисления, поэтому он был расширен для включения этих функций. На сегодняшний день ситуация складывается таким образом, что язык SQL в чем-то похож на реляционную алгебру, в чем-то на реляционное исчисление, а в чем-то отличается от них

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



обоих. Таким положением дел объясняется, почему в главе 6 мы отложили обсуждение средств обработки данных языка SQL до настоящей главы. (Мы предоставляем читателю в качестве упражнения определить, какая часть языка SQL основана на алгебре, какая на исчислении, а какая ни на том, ни на другом.)

Запросы в языке SQL формулируются в виде табличных выражений, которые потенциально могут иметь очень высокую степень сложности. Здесь мы не будем углубляться во все эти сложности, а просто рассмотрим несколько примеров, раскрывающих наиболее важные моменты. В качестве основы для примеров взяты определения SQL-таблиц для базы данных поставщиков и деталей, представленные в главе 4 (см. рис. 4.1). Напоминаем, что в SQL-версии этой базы данных нет типов данных, определяемых пользователем, и все столбцы определены в терминах встроенных типов языка SQL.

Замечание. Более полная и более формальная интерпретация всех SQL-выражений в целом и табличных выражений в частности приводится в приложении А.

7.7.1. Указать цвета деталей и названия городов, в которых находятся детали не из Парижа с весом, превышающим 10 фунтов

SELECT РХ.COLOR, PX.CITY FROM Р AS РХ WHERE PX.CITY О Paris AND PX.WEIGHT > 10.0;

Необходимо отметить следующее.

1. Прежде всего обратите внимание на использование в этом примере символа <> (не равно). Типичные скалярные операторы сравнения записываются в языке SQL следующим образом: =, о, <, >, <= и >=.

2. Обратите также внимание на спецификацию Р AS РХ в предложении WHERE. Этой спецификацией вводится новая переменная кортежа РХ (в стиле исчисления кортежей), областью значений которой является текущее значение таблицы Р. Областью применения такого определения, нестрого говоря, является выражение, в котором она появляется.

Замечание. В языке SQL обозначение РХ называется относительным именем.

3. В языке SQL также допускается неявное обращение к переменным кортежей, что позволяет переписать наш запрос в следующем виде.

SELECT Р.COLOR, Р.CITY

FROM Р

WHERE P.CITY О Paris

AND P.WEIGHT > 10.0 ;

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



сокращенную запись предложения FROM Р AS Р. Другими словами, необходимо четко понимать, что Р в выражении Р.COLOR в предложениях WHERE и SELECT обозначает не саму таблицу Р, а переменную кортежа Р, которая принимает свои значения из одноименной таблицы.

4. Между прочим, в этом примере можно было бы прекрасно обойтись и без спецификаторов (Р.).

SELECT COLOR, CITY FROM P

WHERE CITY <> Paris AND WEIGHT > 10.0 ;

Согласно общему правилу языка SQL неуточненные имена допускаются во всех случаях, когда это не вызывает неоднозначности. Однако в наших примерах спецификаторы будут использоваться и в тех случаях, когда формально они будут излишни. К сожалению, в определенных контекстах явно требуется, чтобы имена столбцов были не уточнены! Например, это требуется в предложении ORDER BY (см. следующий пример).

5. В интерактивных SQL-запросах может также использоваться предложение ORDER BY, уже упоминавшееся в главе 4 в связи с объявлением DECLARE CURSOR.

SELECT P.COLOR, P.CITY FROM P

WHERE P.CITY <> Paris AND P.WEIGHT > 10.0 ; ORDER BY CITY DESC ;

6. Напоминаем, что допускается использование сокращения SELECT *, о котором упоминалось в главе 4.

SELECT * FROM Р

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

Символ в выражении SELECT * заменяет список имен всех столбцов таблицы (или таблиц), указанной в предложении FROM. В этом списке имена столбцов идут в том порядке, в котором они расположены в соответствующей таблице (или таблицах). Следует отметить, что такую сокращенную запись особенно удобно использовать в интерактивных запросах, поскольку при этом уменьшается количество нажатий клавиш. Однако существует скрытая опасность при использовании этой конструкции во внедренных SQL-операторах (т.е. в операторах языка SQL, внедренных в профамму на другом языке), поскольку в подобных случаях символ может иметь совсем другое значение (например, когда столбец добавляется в таблицу или удаляется из нее с помощью оператора ALTER TABLE).

7. {Более важная информация по сравнению с приведенной в предыдущих пунктах!) Обратите внимание, что для используемого нами в примерах набора данных этот запрос будет возвращать четыре строки, а не две, несмотря на то что три из них



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

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