Главная » SQL, Базы данных » СРЕДСТВА SQL и отношения

0

Строки

В языке SQL вообще не поддерживаются кортежи как таковые; вместо этого  в  нем поддерживаются строки, которые характеризуются упорядочением своих  компонентов слева направо. Поэтому в каждой конкретной строке значения  компонентов (которые называются значениями столбцов, если строка непосредственно содержится в таблице, или значениями полей в противном случае) идентифицируются прежде всего по своей порядковой позиции (даже если они имеют также и имена, что не всегда бывает на практике). Типы строк не имеют  явных имен типа строки. Значение строки может быть "выбрано" (в языке SQL для обозначения этой операции используется термин сконструировано—  constructed) с помощью некоторого выражения (фактически являющегося конструктором значения строки <row value constructor>) в следующей форме.

[  ROW  ]   (  <ехр commalist>  )

Круглые скобки могут быть опущены, если разделенный запятыми список commalist содержит только одно выражение <ехр>; в таком случае должно быть  также опущено ключевое слово ROW, которое в ином случае является  необязательным. Список, разделенный запятыми, не должен быть пустым  (язык  SQL не поддерживает "нуль-арные строки"). Ниже приведен пример применения конструктора строки.

ROW    (    Р #(‘ Р 2 ‘ ),                                        Р #(‘ Р 4 ‘ ),    QTY(7)                                        )

В этом выражении создается строка степени три.

Как было показано в главе 5, в языке SQL поддерживается также конструктор типа ROW (в языке Tutorial D ему соответствует генератор типа TUPLE), который может быть вызван, например, в определении некоторого столбца таблицы или некоторой переменной10. Ниже приведен пример определения переменной.

DECLARE ADDR ROW ( STREET CHAR(50), CITY CHAR(25), STATE CHAR(2), ZIP CHAR(5) ) ;

Поддерживаются операции присваивания и сравнения строк с учетом того, что  используются лишь те правила строгой типизации в ограниченной форме, которые описаны в разделе 5.7 главы 5. Поэтому следует обратить особое внимание на то, что если выражение

10  Следует учитывать, что "конструктор значения строки языка SQL" является фактически  селектором кортежа, а "конструктор типа строки", предусмотренный в этом языке, является по сути генератором типа TUPLE (выражаясь весьма неформально!).

r1 = г2 является истинным, это отнюдь не означает, что строки rl и г2  одинаковы. Более того, в языке SQL операторы сравнения строк "<" и ">" являются допустимыми! Но подробные сведения об этих операторах сравнения являются весьма объемными и здесь не приведены; дополнительную информацию по этой теме можно найти в [4.20].

В языке SQL не поддерживаются строковые аналоги любой из обычных реляционных операций (такие как "проекция строки", "соединение строки" и т.д.), а также не предусмотрены непосредственные аналоги для операций WRAP и UNWRAP. Кроме того, в нем не

поддерживаются какие-либо операции "формирования ссылок на тип строки",  но  это последнее свойство языка, по-видимому, не имеет особого значения,  поскольку SQL почти вообще не поддерживает какие-либо строковые операции.

Типы таблиц

Язык SQL вообще не поддерживает отношения как таковые; вместо этого он поддерживает таблицы. В языке SQL тело таблицы является не множеством кортежей, а мультимножеством строк (мультимножество — multiset — представляет собой коллекцию, которая, как и множество, не имеет упорядочения, но в отличие от множества, допускает наличие дубликатов элементов); поэтому столбцы такой таблицы имеют упорядочение слева направо и в ней могут присутствовать дубликаты строк. (Но в настоящей книге мы придерживаемся определенных требований, гарантирующих то, что дубликаты строк никогда не появятся, даже в контексте SQL.) В языке SQL не используются такие термины, как заголовок или тело.

Типы таблиц не имеют явного имени типа таблицы. Значение таблицы может быть "выбрано" (еще раз отметим, что в языке SQL применяется термин сконструировано — constructed) с помощью некоторого выражения (фактически конструктора значения таблицы <table value constructor>) в следующей форме.

VALUES <row value  constructor commalist>

Здесь разделенный запятыми список commalist не должен быть пустым. Поэтому,

например, следующее выражение

VALUES   (                                                                                                                        Р# ( ‘ Р1′ ) ,                                                                                  Р# ( ‘ Р2 ‘ ) ,                                                                                 QTY ( 5 )                                                                                 )

,

( Р #( ‘ Р 1′ ) , Р#(‘РЗ ‘ ),  QTY(3) )  ,

( Р #(‘ Р 2′ ), Р #(‘ РЗ ‘ ) ,                                                                                   QTY(2)                                        )                                                                                ,

( Р #(‘ Р 2′ ), Р #(‘ Р 4′ ),                                                                                   QTY(7)                                        )                                                                                ,

( Р #( ‘ РЗ ‘ ) ,  Р #(‘Р 5 ‘ ) ,  QTY(4) )  ,

( Р #(‘ Р 4 ‘ ) , Р #(‘ Р 6 ‘ ) , QTY(8) )

имеет  своим  результатом  таблицу,  которая  внешне  немного  напоминает  отношение, приведенное в разделе 6.3, за исключением того, что в ней нет  явно  заданных имен столбцов.

В языке SQL фактически вообще не поддерживаются явные аналоги генератора типа RELATION. В нем также явно не поддерживается оператор присваивания таблицы (но явно поддерживаются операторы INSERT, DELETE И UPDATE). Кроме того, в этом языке

не поддерживаются какие-либо операторы сравнения таблиц (даже оператор "="). Но в

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

<row value constructor> IN <table exp>

Кроме того, в этом языке предусмотрен следующий аналог оператора TUPLE FROM.

(   <table exp>    )

Если подобное выражение появляется там, где требуется отдельная строка, и если выражение таблицы <table exp> обозначает таблицу, содержащую одну и  только одну строку, то возвращается эта строка; в противном случае активизируется исключение.

Примечание. Кстати, следует отметить, что имя таблицы < table name> не является допустимым выражением таблицы < table exp> (!?).

Значения и переменные таблицы

К сожалению, в языке SQL применительно к значению таблицы и к переменной таблицы используется один и тот же термин — таблица. Поэтому в данном разделе термин таблица следует рассматривать как относящийся либо к значению таблицы, либо к переменной таблицы, в зависимости от того, что требует контекст. Поэтому здесь вначале приведен синтаксис SQL для определения базовой таблицы.

CREATE TABLE   <base  table name>

(   <base   table element   cornmalxst>   )   ;

Каждое выражение с обозначение элемента базовой таблицы <base table element>

представляет  собой  определение  столбца  <column  definition>  или  ограничение

<constraint>, как описано ниже11.

■     Выражения <constraint> определяют некоторые ограничения целостности, которые относятся к рассматриваемой базовой таблице. Отложим подробное об суждение таких ограничений до главы 9 и отметим лишь то, что таблицы SQL не обязательно должны иметь первичный ключ (или, что еще более важно, вообще какие-либо потенциальные ключи), поскольку в них допускается наличие дубли катов строк.

■     Выражения <column   definition> (должно быть предусмотрено по меньшей мере одно такое выражение) имеют следующую общую форму.

<column name>  <type name>   [   <default  speo    ]

Необязательное выражение «defaul t speo определяет заданное по  умолчанию значение (или просто значение по умолчанию), которое должно быть помещено в соответствующий столбец, если пользователь явно не задаст никакого значения в операторе INSERT (подходящий пример приведен в главе 4, раздел 4.6, подраздел "Операции,  в  которых  не  используются  курсоры").  Оно  принимает  форму DEFAULT <default>,  где <default> — литерал, имя встроенного безоперандного оператора12   или ключевое слово NULL (см. главу 19). Если для некоторого столбца явно не предусмотрено значение по умолчанию, то неявно предполагается,

11Выражение <base table element> может также принимать форму LIKE T, которая позволяет копировать часть или все объявления столбцов для определяемой базовой таблицы из некоторой существующей именованной таблицы Т.

12Безоперандным оператором называется такой оператор, который не имеет явно заданных операндов. В качестве примера можно указать CURRENT_DATE.

что он по умолчанию должен иметь неопределенное значение (NULL-значение); т.е. неопределенное значение "применяется по умолчанию в качестве заданного по умолчанию значения" (фактически это  правило всегда соблюдается в языке SQL).

Примечание. По причинам, описание которых выходит за рамки этой книги, применяемое по умолчанию значение обязательно должно быть неопределенным, если данный столбец имеет тип, определяемый пользователем (как уже было указано в главе 4). Оно должно быть также неопределенным, если столбец относится к некоторому строковому типу, и должно представлять собой либо неопределенное значение, либо пустой массив (определяемый как ARRAY [ ]), если столбец относится к типу массива.

Для ознакомления с некоторыми примерами применения операции CREATE  TABLE можно обратиться к рис. 4.1 в главе 4. Следует отметить, что (как уже было сказано) язык SQL не поддерживает столбцы со значениями в виде таблицы, а также не поддерживает таблицы вообще без столбцов. Кроме того, в нем предусмотрена возможность использовать оператор ORDER BY наряду с  аналогами большинства операторов реляционной алгебры (см. главы 7 и 8). Но применяемые в нем правила для "формирования ссылок на тип таблицы" (хотя они,  безусловно, существуют) заданы неявно, по крайней мере, частично; кроме того, они являются довольно сложными и в этом разделе более подробные сведения по этой теме не будут приведены.

Предусмотрена возможность уничтожения существующей базовой таблицы.  Синтаксис соответствующей операции приведен далее.

‘DROP TABLE <base table name> <behavior> ;

Здесь (как и  в  случае оператора DROP TYPE, описанного в  главе 5)  выражение

<behavior> может принимать значение RESTRICT или CASCADE. Неформально говоря, ключевое слово RESTRICT означает, что операция DROP должна  окончиться неудачей, если таблица в настоящее время где-либо используется, а  ключевое слово CASCADE означает, что операция DROP всегда завершается успешно и вызывает неявное применение оператора DROP. . .CASCADE КО всем  объектам, в которых в настоящее время используется эта таблица. Кроме того,  с  помощью оператора ALTER TABLE может быть изменено определение любой  существующей базовой таблицы. Поддерживаются  описанные ниже разновидности такого изменения.

■     Добавление нового столбца.

■      Определение нового значения, применяемого по умолчанию, для существующего столбца (или замена предыдущего, если оно было задано).

■     Удаление существующего значения, применяемого по умолчанию для столбца.

■   Удаление существующего столбца.

■      Определение нового ограничения целостности.

■      Удаление существующего ограничения целостности.

Ниже приведен пример применения только первой разновидности такой операции.

ALTER TABLE S ADD COLUMN DISCOUNT INTEGER DEFAULT -1 ;

В этом операторе происходит добавление столбца DISCOUNT (типа INTEGER) к базовой таблице поставщиков. Все существующие строки в этой таблице расширяются с четырех столбцов до пяти; во всех случаях первоначальное значение нового, пятого столбца становится равным -1.

Наконец отметим, что операторы INSERT, DELETE и UPDATE языка SQL уже были описаны в главе 4.

Структурированные типы

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

Поэтому, прежде всего, в этом разделе повторно приведен следующий пример определения структурированного типа из главы 5 (раздел 5.7).

CREATE TYPE POINT AS ( X FLOAT, Y FLOAT ) NOT FINAL ;

Теперь тип POINT может использоваться в определениях переменных и столбцов, например, как показано ниже.

CREATE TABLE NADDR ( NAME … , ADDR …

, LOCATION POINT

… ,

Кроме того, хотя об этом не было достаточно ясно сказано в главе 5, но, по меньшей мере, подразумевалось, что структурированные типы SQL являются именно скалярными типами, точно так же, как скалярным типом является  аналог  указанного выше типа POINT на языке Tutorial D. Но в некоторых отношениях структурированные типы SQL ближе13 к типам кортежей языка Tutorial D. Безусловно, это верно, что мы так же можем иметь доступ к компонентам ("атрибутам") любого конкретного значения POINT, как если бы это был кортеж. Для такой цели используется синтаксис с уточнителями, разделенными точками, как показано в следующих примерах (следует учитывать, что требуются явно заданные имена упоминаемых компонентов).

SELECT NT.LOCATION.X, NT.LOCATION.Y FROM NADDR AS NT WHERE NAME = … ;

UPDATE NADDR AS NT

SET NT.LOCATION.X = 5 . 0

WHERE NAME = … ;

При таком его использовании, как это показано в приведенном выше примере, структурированный тип SQL фактически действует так, как если бы он был простым строковым типом (рекомендуем еще раз обратиться к разделу 5.7 главы 5), за исключением перечисленных ниже особенностей.

13 Если не считать того, что структурированные типы характеризуются упорядочением своих атрибу-тов слева направо, а типы кортежей — нет.

■     Его компоненты именуются атрибутами, а не полями.

■     Что еще более важно, структурированные типы, в отличие от строковых типов,

имеют имена (мы еще раз вернемся к этой теме в самом конце данного раздела).

Поэтому до сих пор структурированные типы SQL на первый взгляд выглядели так, как будто в них нет ничего слишком сложного для понимания. Но (и это очень важно!) на этом относящиеся к ним сведения не заканчиваются14. В дополнение к изложенному выше, в языке SQL разрешено также определять базовую таблицу как принадлежащую к некоторому структурированному типу, с использованием ключевого слова "OF", и в этом случае необходимо учитывать целый ряд дополнительных соображений. Для того чтобы было проще анализировать некоторые из этих соображений, вначале расширим определение типа POINT следующим образом.

CREATE TYPE POINT AS ( X FLOAT, Y FLOAT ) NOT FINAL REF IS SYSTEM GENERATED ;

Теперь можно определить базовую таблицу как относящуюся к этому типу с помощью ключевого слова "OF", например, следующим образом.

CREATE TABLE POINTS OF POINT

( REF IS POINT # SYSTEM GENERATED … ) ;

Пояснения

1.           При определении структурированного типа т система автоматически определяет связанный с ним ссылочный тип (тип REF) с именем REF{T). Значения типа REF(T) являются ссылками на строки в той же базовой таблице15, которая была определена как относящаяся к типу т с помощью ключевого слова "OF" (см. п. 3). Поэтому в данном примере система автоматически определяет тип с именем REF (POINT), значениями которого являются ссылки на строки в базовой табли це. А эта таблица, в свою очередь, определена как относящаяся к типу POINT с помощью ключевого слова "OF".

2.           Спецификация REF  IS  SYSTEM GENERATED В операторе CREATE  TYPE означа ет, что фактические значения соответствующего типа REF ДОЛЖНЫ быть преду смотрены системой (возможны и другие варианты, например, REF   IS   USER GENERATED, но в этом разделе они не рассматриваются).

Примечание. В действительности конструкция REF IS SYSTEM GENERATED применяется по умолчанию, поэтому в данном примере при желании можно было бы оставить неизменным первоначальное определение типаРОINТ.

3.           Базовая таблица POINTS определена как относящаяся к структурированному типу POINT с помощью ключевого слова "OF". Но фактически ключевое слово OF здесь не очень хорошо подходит, поскольку таблица в действительности не состоит из

14 То же самое относится и к приведенному ниже обсуждению! Дополнительная информация по этой теме приведена в главах 20 и 26.

15 Или, возможно, некоторого представления. Изложение подробных сведений о том варианте при менения этой конструкции, который относится к представлениям, выходит за рамки этой книги.

(что буквально означает слово "of) рассматриваемого типа и тем более из него не состоят ее строки! Дополнительные сведения по этой теме приведены ниже16.

■  Прежде всего, если бы таблица имела только один столбец и этот столбец относился к рассматриваемому структурированному типу, скажем, ST,  то можно было бы утверждать (но не применительно к конструкциям языка SQL!) нечто вроде того, что таблица относится к типу TABLE (ST), а ее строки — к типу ROW(ST).

■     Однако в общем таблица не имеет только один столбец; вместо этого в ней пре дусмотрено по одному столбцу для каждого атрибута ST. Поэтому в данном примере базовая таблица POINTS имеет два столбца, х и Y; но она явно не име ет столбца типа POINT.

■     Более того, данная таблица имеет также один дополнительный столбец, а именно столбец соответствующего типа REF. НО синтаксис определения этого столбца отличается от обычного синтаксиса определения столбца и выглядит примерно следующим образом.

REF IS <column name> SYSTEM GENERATED

Этот дополнительный столбец <column name> называется столбцом, ссылающимся на самого себя; он используется для хранения уникальных идентификаторов или "ссылок" для строк рассматриваемой базовой таблицы. Идентификатор для некоторой строки присваивается при вставке этой строки и остается связанным с ней до момента ее удаления. Поэтому в данном примере базовая таблица POINTS фактически имеет три столбца (POINT#, X и Y, в указанном порядке), а не просто два столбца.

Примечание. Не совсем ясно, почему должно соблюдаться требование вначале определять с помощью ключевого слова "OF" таблицу как относящуюся к некоторому структурированному типу, а не просто обычным образом объявлять соответствующий столбец, чтобы иметь  возможность использовать это функциональное средство  "уникального  идентификатора", но  приведенное здесь  описание  построено в соответствии с теми принципами, которые заложены в языке SQL.

Кстати, следует отметить (хотя это может показаться удивительным), что столбец, созданный с помощью конструкции SYSTEM GENERATED, т.е.  сгенерированный системой, может быть целевым столбцом в операции INSERT или UPDATE, хотя и с учетом некоторых специальных оговорок. Здесь подробные сведения об этом не приведены.

4.     Таблица POINTS может служить примером того, что в стандарте SQL именуется (не очень удачно) и типизированной таблицей (typed table), и таблицей, на которую может быть сделана ссылка (referenceable table). Приведем цитату из стандарта, в

16 Поэтому следует, в частности, отметить, что если объявленный тип некоторого формального  параметра Р некоторого оператора Ор  относится к определенному структурированному типу ST, то строка из базовой таблицы, которая была определена как относящаяся к типу ST с помощью ключевого слова "OF", не может быть передана в качестве соответствующего фактического параметра при вызове этого оператора Ор.

которой упоминается таблица такого типа: "Таблица …, тип строки которой происходит от структурированного типа, называется типизированной таблицей. Типизированной таблицей может быть только базовая таблица или представление". И еще одна цитата: "Таблица, на которую может быть сделана ссылка, обязательно является также типизированной таблицей… . Типизированной таблицей называется таблица, на которую может быть сделана ссылка".

На данный момент складывается впечатление, что описанные выше средства  были введены в стандарте SQL: 1999 в основном для использования в качестве основы для внедрения в язык SQL своего рода "объектных функциональных средств"17, которые будут подробно рассматриваться в главе 26. Но в стандарте ничего не сказано о том, что рассматриваемые средства могут использоваться только в сочетании с этими функциональными возможностями, и поэтому автор решил привести их описание именно в данной главе.

Приведем еще одно заключительное замечание. Как было указано в главе 5, в языке Tutorial D нет никакого явного оператора "определения типа кортежа"; вместо этого в указанном  языке  предусмотрен  генератор  типа  TUPLE,  который  может  быть  вызван (например) в определении переменной кортежа. Вследствие этого, единственными именами, которые могут иметь в языке Tutorial D типы кортежей, являются имена в следующей форме.

TUPLE   {   А1   Т1,   А2   Т2,    . . . ,   An  Тп   }

Из этого следует важный вывод, что можно сразу же проверить, являются ли два типа кортежа фактически одинаковыми и относятся ли два кортежа к одному и тому же типу.

Итак, типы строк в языке SQL аналогичны типам кортежей в языке Tutorial  D в указанном отношении. Но структурированные типы являются иными; предусмотрена явная операция "определения структурированного типа", а структурированные типы к

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

CREATE TYPE P0INT1 AS ( X FLOAT, Y FLOAT ) NOT FINAL ; CREATE TYPE P0INT2 AS ( X FLOAT, Y FLOAT

) NOT FINAL ; DECLARE V1 P0INT1 ; DECLARE V2

P0INT2 ;

Здесь заслуживает особого внимания то, что переменные V1 и V2 относятся к разным типам. Поэтому они не могут сравниваться друг с другом, а значения одной переменной не могут присваиваться другой переменной.

6.5.  РЕЗЮМЕ

В данной главе приведено подробное описание отношений и других связанных с ними объектов. Вначале было приведено точное определение понятия кортежей и особенно отмечены те их свойства, что каждый кортеж содержит одно и только одно значение каждого

17   Этот вывод автора полностью подтверждается тем фактом, что структурированные типы  SQL всегда имеют связанный с ними тип REF, даже если этот тип REF не выполняет никаких  функций, за исключением того, что рассматриваемый структурированный тип используется в  качестве основы для определения так называемой "типизированной таблицы".

из своих атриоутов, атриоуты не характеризуются упорядочением слева направо, каждое подмножество кортежа является кортежем, а каждое подмножество заголовка — заголовком. В ней также описаны генератор типа TUPLE, селекторы кортежей, операции присваивании и проверки кортежей на равенство, а также другие общие операции с кортежами.

Затем изложение перешло к отношениям (точнее, под этим подразумевались значения

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

Примечание. Целесообразно кратко остановиться на этом последнем пункте,  поскольку в области информационной индустрии, связанной с использованием баз данных, его сопровождает слишком много путаницы. Читателю, вероятно,  приходилось часто сталкиваться с такими утверждениями, что реляционные  атрибуты могут иметь только очень простые типы (числа, строки и т.д.). Но истина заключается в том, что в реляционной модели нет абсолютно ничего, что могло бы свидетельствовать в пользу таких утверждений. В действительности, как было отмечено в главе 5, типы могут быть сколь угодно простыми или сложными и поэтому вполне допустимо применение таких атрибутов, значениями которых являются числа, строки, даты, отметки времени, звукозаписи, географические карты, видеозаписи, геометрические точки и т.д.

Приведенное выше сообщение является настолько важным (и настолько неправильно трактуемым в широких кругах), что повторим его еще раз в другой формулировке.

Вернемся к данному резюме. Теперь необходимо рассмотреть определенные свойства,

которым удовлетворяют все отношения.

1.          Они всегда нормализованы.

2.          Они не характеризуются упорядочением своих атрибутов слева направо.

3.          Они не характеризуются упорядочением своих кортежей сверху вниз.

4.          Они никогда не содержат каких-либо дубликатов кортежей.

В этой главе были также указаны некоторые основные различия между отношениями и таблицами; в ней описаны атрибуты со значениями в виде  отношений и кратко рассмотрены отношения TABLE_DEE и TABLE_DUM, которые являются единственными возможными отношениями вообще без  атрибутов. Кроме того, достаточно подробно были  представлены  реляционные   операции  сравнения  и  приведен  краткий  обзор некоторых других операций с отношениями (включая, в частности,ORDER BY).

Кстати, если речь идет об операциях с отношениями, то читатель мог заметить, что в главе 5 в определенной степени обсуждался вопрос об определяемых пользователем операторах для скалярных типов, но этого не было сделано для типов отношений. Причина состоит в том, что большинство необходимых реляционных операций (сокращение, проекция, соединение, реляционные сравнения и т.д.) фактически встроены в саму реляционную модель и не требуют каких-либо "пользовательских определений". (Мало того,

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

Напомним, что заголовок любого конкретного отношения может  рассматриваться как предикат, а кортежи этого отношения — как истинные высказывания, полученные на основе этого предиката путем подстановки значений фактических параметров соответствующих типов вместо формальных параметров предиката.

После этого мы перешли к рассмотрению базовых переменных отношения и отметили, что переменные отношения, как и сами отношения, имеют предикаты. Согласно предположению о замкнутости мира, можно считать, что если  действительный по всем иным признакам кортеж не присутствует в теле переменной отношения, то соответствующее ему высказывание является ложным.

Затем были более подробно описаны реляционные операции присваивания (и их сокращения INSERT, DELETE и UPDATE). Кроме того, был подчеркнут тот пункт, что реляционные операции присваивания являются операциями уровня множества, а также отмечено, что фактически выражения "обновление кортежей" или  "обновление атрибутов" являются неправильными.

Наконец, были кратко описаны аналоги перечисленных выше понятий в языке SQL,

если есть такие аналоги. Таблица SQL — это не множество кортежей, а мультимножество строк (кроме того, в языке SQL для указания на значение таблицы и переменную таблицы используется один и тот же термин — таблица). Определения базовых таблиц можно "изменить" с помощью операции ALTER  TABLE. Кроме того, таблицы SQL могут быть определены в терминах  структурированных типов; такая возможность рассматривается более подробно далее в этой книге (в главе 26).

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

По теме:

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