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

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 P.COLOR, P.CITY

FROM Р

WHERE P.CITY <> 'Paris'

AND P.WEIGHT > 10.0 ;

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

сокращенную запись предложения FROM Р AS Р. Другими словами, необходимо четко понимать, что Р в выражении P.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. (Более важная информация по сравнению с приведенной в предыдущих пунктах!) Обратите внимание, что для используемого нами в примерах набора данных этот запрос будет возвращать четыре строки, а не две, несмотря на то что три из них

будут совершенно идентичны. Язык 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 издание]