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