ЗАСОБИ SQL і відносини

Рядки

У мові SQL взагалі не підтримуються кортежі як такі замість цього в ньому підтримуються рядки, які характеризуються впорядкуванням своїх компонентів зліва направо Тому в кожній конкретній рядку значення компонентів (які називаються значеннями стовпців, якщо рядок безпосередньо міститься в таблиці, або значеннями полів в іншому випадку) ідентифікуються насамперед за своєю порядкової позиції (навіть якщо вони мають також і імена, що не завжди буває на практиці) Типи рядків не мають явних імен типу рядка Значення рядка може бути вибрано (У мові SQL для позначення цієї операції використовується термін сконструйовано-constructed) за допомогою деякого виразу (фактично є конструктором значення рядка &ltrow value constructor&gt) У такій формі

[  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) )

Підтримуються операції привласнення і порівняння рядків з урахуванням того, що використовуються лише ті правила суворої типізації в обмеженій формі, які описані в розділі 57 глави 5 Тому слід звернути особливу увагу на те, що якщо вираз

10 Слід враховувати, що конструктор значення рядка мови SQL є фактично селектором кортежу, а конструктор типу рядка, передбачений у цій мові, є по суті генератором типу TUPLE (висловлюючись вельми неформально)

r1 = г2 є істинним, це аж ніяк не означає, що рядки rl і г2 однакові Більш того, в мові SQL оператори порівняння рядків <" і ">” є допустимими Але докладні відомості про ці операторах порівняння є вельми обємними і тут не наведено додаткову інформацію з цієї теми можна знайти в [420]

У мові SQL не підтримується рядкові аналоги будь-який з звичайних реляційних операцій (такі як проекція рядка, зєднання рядка і тд), а також не передбачені безпосередні аналоги для операцій WRAP і UNWRAP Крім того, в ньому не

підтримуються будь-які операції формування посилань на тип рядка, але це остання властивість мови, мабуть, не має особливого значення, оскільки SQL майже взагалі не підтримує будь рядкові операції

Типи таблиць

Мова SQL взагалі не підтримує відносини як такі замість цього він підтримує таблиці У мові SQL тіло таблиці є не безліччю кортежів, а мультімножество рядків (мультімножество – multiset – Являє собою колекцію, яка, як і безліч, не має впорядкування, але на відміну від безлічі, допускає наявність дублікатів елементів) тому стовпці такої таблиці мають впорядкування зліва направо і в ній можуть бути присутніми дублікати рядків (Але в справжній книзі ми дотримуємося певних вимог, що гарантують те, що дублікати рядків ніколи не зявляться, навіть у контексті SQL) У мові SQL не використовуються такі терміни, як заголовок або тіло

Типи таблиць не мають явного імені типу таблиці Значення таблиці може бути вибрано (Ще раз відзначимо, що в мові SQL застосовується термін сконструйовано – constructed) за допомогою деякого виразу (фактично конструктора значення таблиці &lttable value constructor&gt) в наступній формі

VALUES &ltrow value  constructor commalist&gt

Тут розділений комами список commalist не повинен бути порожнім Тому,

наприклад, наступний вираз

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

,

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

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

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

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

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

має своїм результатом таблицю, яка зовні трохи нагадує ставлення, наведене в розділі 63, за винятком того, що в ній немає явно заданих імен стовпців

У мові SQL фактично взагалі не підтримуються явні аналоги генератора типу RELATION У ньому також явно не підтримується оператор присвоювання таблиці (але явно підтримуються оператори INSERT, DELETE І UPDATE) Крім того, в цій мові

не підтримує будь оператори порівняння таблиць (навіть оператор =) Але в

SQL передбачений оператор, що дозволяє перевірити, чи присутній зазначена рядок у зазначеній таблиці, як показано нижче

&ltrow value constructor&gt IN &lttable exp&gt

Крім того, в цій мові передбачений наступний аналог оператора TUPLE FROM

(   &lttable exp&gt    )

Якщо подібний вираз зявляється там, де потрібна окрема рядок, і якщо вираз таблиці &lttable exp&gt позначає таблицю, що містить одну і тільки один рядок, то повертається цей рядок в іншому випадку активізується виняток

Примітка До речі, слід зазначити, що імя таблиці &lt table name&gt не є допустимим виразом таблиці < table exp&gt (?)

Значення і змінні таблиці

На жаль, в мові SQL стосовно до значенням таблиці і до змінної таблиці використовується один і той же термін – таблиця Тому в цьому розділі термін таблиця слід розглядати як відноситься або до значення таблиці, або до змінної таблиці, залежно від того, що вимагає контекст Тому тут спочатку наведено синтаксис SQL для визначення базової таблиці

CREATE TABLE   &ltbase  table name&gt

(   &ltbase   table element   cornmalxst&gt   )   

Кожен вираз з позначення елемента базової таблиці &ltbase table element&gt

являє собою визначення стовпця&ltcolumn  definition&gt  або обмеження

&ltconstraint&gt, як описано ніже11

■ Вирази &ltconstraint&gt визначають деякі обмеження цілісності, які відносяться до розглянутої базовій таблиці Відкладемо докладний про судження таких обмежень до глави 9 і відзначимо лише те, що таблиці SQL не обовязково повинні мати первинний ключ (або, що ще більш важливо, взагалі будь-які потенційні ключі), оскільки в них допускається наявність дублі катів рядків

■ Вирази &ltcolumn   definition&gt (Повинно бути передбачено щонайменше одне таке вираз) мають таку загальну форму

&ltcolumn name&gt  &lttype name&gt   [   &ltdefault  speo    ]

Необовязкове вираз «defaul t speo визначає задане за замовчуванням значення (або просто значення за замовчуванням), яке має бути поміщено у відповідний стовпець, якщо користувач явно не здасть жодного значення в операторі INSERT (відповідний приклад наведено у розділі 4, розділ 46, підрозділ Операції, в яких не використовуються курсори ) Воно приймає форму DEFAULT &ltdefault&gt,  де &ltdefault&gt — літерал, імя вбудованого безоперандного оператора12 або ключове слово NULL (див главу 19) Якщо для деякого шпальти явно не передбачено значення за замовчуванням, то неявно передбачається,

11Вираженіе може також приймати форму LIKE T, яка дозволяє копіювати частину або всі оголошення стовпців для обумовленою базової таблиці з деякої існуючої іменованої таблиці Т

12Безоперандним оператором називається такий оператор, який не має явно заданих операндів Як приклад можна вказати CURRENT_DATE

що він за замовчуванням повинен мати невизначене значення (NULL-значення) тобто невизначене значення застосовується за умовчанням як заданого за замовчуванням значення (Фактично це правило завжди дотримується в мові SQL)

Примітка З причин, опис яких виходить за рамки цієї книги, що застосовується за умовчанням значення обовязково має бути невизначеним, якщо даний стовпець має тип, визначений користувачем (як уже було зазначено в розділі 4) Воно має бути також невизначеним, якщо стовпець відноситься до деякого строковому типу, і повинно являти собою або невизначене значення, або порожній масив (який визначається як ARRAY []), якщо стовпець відноситься до типу масиву

Для ознайомлення з деякими прикладами застосування операції CREATE TABLE можна звернутися до рис 41 в розділі 4 Слід зазначити, що (як уже було сказано) мова SQL не підтримує стовпці зі значеннями у вигляді таблиці, а також не підтримує таблиці взагалі без стовпців Крім того, в ньому передбачена можливість використовувати оператор ORDER BY поряд з аналогами більшості операторів реляційної алгебри (Див глави 7 і 8) Але застосовувані в ньому правила для формування посилань на тип таблиці (Хоча вони, безумовно, є) задані неявно, принаймні, частково крім того, вони є досить складними і в цьому розділі більш докладні відомості з цієї теми не будуть приведені

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

‘DROP TABLE &ltbase table name&gt &ltbehavior&gt

Тут (як і у випадку оператора DROP TYPE, описаного в розділі 5) вираз

&ltbehavior&gt може приймати значення 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 (розділ 57)

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 NTLOCATIONX, NTLOCATIONY FROM NADDR AS NT WHERE NAME = ..

UPDATE NADDR AS NT

SET NTLOCATIONX = 5 0

WHERE NAME = ..

При такому його використанні, як це показано в наведеному вище прикладі, структурований тип SQL фактично діє так, як якби він був простим строковим типом (рекомендуємо ще раз звернутися до розділу 57 глави 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 &ltcolumn name&gt SYSTEM GENERATED

Цей додатковий стовпець &ltcolumn name&gt називається стовпцем, що посилаються, на самого себе він використовується для зберігання унікальних ідентифікаторів або посилань для рядків розглянутої базової таблиці Ідентифікатор для деякою рядки присвоюється при вставці цього рядка і залишається повязаним з нею до моменту її видалення Тому в даному прикладі базова таблиця 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 відносяться до різних типів Тому вони не можуть порівнюватися один з одним, а значення однієї змінної не можуть присвоюватися іншої змінної

65 РЕЗЮМЕ

У даній главі наведено докладний опис відносин та інших повязаних з ними обєктів Спочатку було приведено точне визначення поняття кортежів і особливо відзначені ті їх властивості, що кожен кортеж містить одне і тільки одне значення кожного

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 с: Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*