Главная » SQL, Базы данных » Типы DISTINCT

0

Язык SQL поддерживает две разновидности определяемых пользователем типов — типы DISTINCT и структурированные типы; оба эти типа  определяются13  с помощью оператора CREATE TYPE. рассматриваются в этом подразделе, а структурированные типы — в  следующем  (ключевое слово "DISTINCT" записано здесь прописными буквами, чтобы подчеркнуть, что данное слово не используется в этом контексте в своем обычном естественном языковом смысле — как "различный"). Ниже приведено определение SQL для типа WEIGHT типа DISTINCT (сравните и сопоставьте всевозможные определения для этого типа на языке Tutorial D в разделе 5.4).

CREATE TYPE WEIGHT AS DECIMAL (5,1) FINAL ;

В своей простейшей форме (т.е. если не рассматриваются различные необязательные спецификации) это определение имеет следующий синтаксис.

12 Здесь предполагается, что к одному из сравниваемых операндов применяется операция дополне ния пробелами PAD SPACE [4.20].

13 Этот оператор поддерживает также некие конструкции, называемые в данном контексте доменами, но домены SQL не имеют ничего общего с доменами в реляционном смысле. Домены SQL подробно рассматриваются в [4.20].

CREATE TYPE <type name> AS <representation> FINAL ;

Ниже приведены дополнительные сведения по этой теме.

1.  Обязательная спецификация FINAL рассматривается в главе 20.

2.  Параметр <representation> представляет собой имя другого типа (и этот рас сматриваемый тип не должен быть определен пользователем или сгенерирован). В частности, следует отметить, что с учетом этих правил, касающихся применения параметра <representation>, мы не могли бы определить тип POINT из раздела

5.3 как тип DISTINCT языка SQL.

3.  Следует также учитывать, что параметр <representation> задает не возможное представление, как было описано выше в этой главе, а скорее фактическое физи ческое представление рассматриваемого типа DISTINCT.  В действительности, язык SQL вообще не поддерживает понятие "возможного представления possrep". Одним из следствий такого упущения является то, что невозможно определить тип DISTINCT (или структурированный тип, когда речь пойдет о нем) с помощью двух или нескольких отдельных возможных представлений.

4.  В языке SQL нет никаких конструкций, аналогичных спецификации CONSTRAINT языка Tutorial D. Например, в случае типа WEIGHT не существует способа, позво ляющего указать, что для каждого значения WEIGHT соответствующее значение DECIMAL (5, 1) должно быть больше нуля (чтобы вес не мог стать отрицатель ным!) или, скажем, меньше 5000.

5.  Применимые к типу DISTINCT операторы сравнения определяются именно как такие операторы, которые могут применяться к соответствующему физическому представлению.

Примечание. Если не считать оператора присваивания (см. пункт 8), другие операторы, применимые к физическому представлению, не могут  применяться к типу DISTINCT. Например, ни одно из следующих  выражений не является допустимым, даже если WT относится к типу WEIGHT.

WT   +

14 .7 WT   *

2 WT   + WT

6.  Селекторы  и  операторы  ТНЕ_  поддерживаются.  Например,  если   NW— переменная базового языка типа DECIMAL (5 ,1), то выражение  WEIGHT ( : NW) возвращает соответствующее значение веса, а если WT  — столбец типа WEIGHT,    то    выражение    DECIMAL(WT)    возвращает14                                         соответствующее значение  DECIMAL(5,1 ) .   Поэтому   следующие  операции  SQL  являются допустимыми.

14  Фактически в синтаксисе, который определен в спецификации SQL: 1999, выражение DECIMAL (WT) не является допустимым, но предполагается, что оно станет допустимым в спецификации  SQL:2003. Однако следует отметить, что (в отличие от операторов ТНЕ_ языка Tutorial D) его нельзя будет использовать в качестве псевдопеременной.

DELETE FROM P WHERE WEIGHT = WEIGHT ( 14.7 ) ;

EXEC SQL DELETE FROM P WHERE WEIGHT

= WEIGHT ( :NW ) ;

EXEC SQL DECLARE Z CURSOR FOR

SELECT DECIMAL ( WEIGHT ) AS DWT FROM P

WHERE WEIGHT > WEIGHT ( :NW ) ;

7. За одним важным исключением (см. пункт 8), к типам DISTINCT  применяются правила строгой типизации. Необходимо обратить особое  внимание на то, что операции сравнения значений типа DISTINCT и значений типа, лежащего в основе представления  типа  DISTINCT,  ЯВЛЯЮТСЯ   недопустимыми.  Поэтому  следующие операторы SQL не считаются допустимыми, даже несмотря на то, что переменная NW (как и прежде)  относится  к типу DE CIMAL (5,1).

DELETE FROM P WHERE  WEIGHT   =     14.7                                        ;                                                                                   /*                                        Предостережение:

недопустимый  оператор!!!   */

EXEC SQL DELETE FROM P WHERE  WEIGHT  =    :NW  ;                                        /*    Предостережение:

недопустимый оператор!!!  */

EXEC  SQL DECLARE  Z  CURSOR FOR

SELECT DECIMAL  (  WEIGHT  )  AS  DWT FROM P

WHERE WEIGHT > :NW ; /* Предостережение: недопустимый оператор!!! */

8. Исключение, упомянутое в пункте 7, касается операций присваивания. Например, если требуется выполнить выборку некоторого значения WEIGHT  В определенную переменную типа DECIMAL( 5 , 1), то должно быть  выполнено преобразование типов. Безусловно, что такое преобразование  может быть выполнено явно, как показано ниже.

SELECT DECIMAL ( WEIGHT ) AS DWT INTO :NW

FROM P

WHERE P# = P# (‘P1′) ;

Но следующий оператор также является допустимым (и при его выполнении происходит соответствующее приведение типа).

SELECT WEIGHT INTO :NW

FROM P

WHERE P# = P# (‘P1′) ;

Аналогичные замечания относятся к операциям INSERT и UPDATE.

9. Для преобразования в типы, из типов или между типами DISTINCT могут  быть также явно определены операторы CAST. Подробные сведения об  этом  здесь не рассматриваются.

10.  В случае необходимости могут быть определены дополнительные операторы (а в последующем они могут быть уничтожены).

Примечание. В языке SQL операторы называются программными модулями и подразделяются на три типа: функции, процедуры и методы. (Функции и процедуры могут рассматриваться в определенной степени как аналогичные описанным выше операторам,  предназначенным  только  для  чтения,  и   операторам  обновления, соответственно; методы действуют подобно функциям, но вызываются15 с использованием другого синтаксического стиля.) Поэтому мы можем определить функцию  (по  сути  представляющую  собой  полиморфную  функцию),  называемую ADDWT  (сокращение от "add weight" — сложение весов), которая позволяет складывать два значения независимо от того, являются ли они значениями  типа WEIGHT, или значениями типа DECIMAL( 5 , 1), или сочетанием того и другого. В таком случае все приведенные ниже выражения становятся допустимыми.

ADDWT ( WT, 14.7 )

ADDWT ( 14.7, WT )

ADDWT ( WT, WT ) ADDWT ( 14.7, 3.0 )

Дополнительную информацию, касающуюся программных модулей SQL,  можно найти в [4.20] и [4.28]. Более подробные сведения о них выходят за рамки данной книги.

11.  Для уничтожения определяемого пользователем типа используется следующий оператор.

DROP TYPE  <type name>  <behavior>   ;

Здесь параметр <behavior> с обозначением способа выполнения может  иметь значение RESTRICT ИЛИ CASCADE; неформально RESTRICT означает, что операция DROP должна окончиться неудачей, если данный тип в настоящее время где-либо используется в базе данных, а ключевое слово  CASCADE означает, что операция DROP  всегда  оканчивается  успешно  и  вызывает  неявное  применение  операций DROP. . .CASCADE ко всем объектам, в которых в настоящее время используется этот тип (именно так!).

Источник: Дейт К. Дж., Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 1328 с.: ил. — Парал. тит. англ.

По теме:

  • Комментарии