
Konspekt_lektsiy_BD_amp_amp_SD
.pdf
М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних |
61 |
|
|
множини однакових значень того чи іншого атрибута. Для того, щоб уникнути або заборонити дублювання значень атрибута, обраного як потенційний ключ, ще на етапі побудови БД використовується таке визначення потенційного ключа:
UNIQUE [(список_атрибутів)]
Причому це визначення може використовуватися і як обмеження на стовпець, і як обмеження на таблицю. Наприклад, у таблиці Student
… SNum SMALLINT UNIQUE, …
Тут є дві некоректності. Перша полягає в тому, що, як було відзначено раніше, потенційний ключ не може містити атрибутів, що допускають відсутність значень. Отже, необхідно додати NOT NULL. Але це не скасовує другу некоректність: номер студента за списком унікальний для даної групи, але може повторюватися в іншій групі і, тим більше, на іншій спеціальності. Тому номер залікової книжки складається із шифру спеціальності, номера групи і номера студента:
… SNum SMALLINT |
NOT NULL, |
Spec CHAR(2) |
NOT NULL CHECK(Spec IN(‘ОІ’, ‘ОМ’, ‘ОП’, ‘ОС’)), |
GNum INT |
NOT NULL, |
UNIQUE(Spec, GNum, SNum));
Первинний ключ
Ми з вами відзначали, що один і тільки один з потенційних ключів може використовуватися в якості первинного. Обговорювали ми це в теоретичному плані. Залишається тільки сповістити про це сервер БД. Для цього в SQL існує оператор PRIMARY KEY:
PRIMARY KEY [(список_атрибутів)]
Змінимо попередній приклад:
…PRIMARY KEY (Spec, GNum, SNum));
Це приклад використання первинного ключа як обмеження на таблицю. Іноді більш доцільно використовувати одноатрибутний привілейований ідентифікатор, тобто використовувати первинний ключ як обмеження на стовпець. Наприклад, у таблицю Student можна додати поле
… Kod INT NOT NULL |
PRIMARY KEY, … |
яке забезпечує наскрізну нумерацію по університету або містить, наприклад, податковий індекс (унікальність у межах держави).
Зовнішні ключі
Поняття зовнішніх і батьківських ключів були введені для формалізації зв’язків між відношеннями (таблицями). У SQL зовнішній ключ є обмеженням, тобто його мета — обмежити дані, що вводяться, так, щоб він і його батьківський ключ відповідали принципам посилальної цілісності, сформульованої у визначенні зовнішнього ключа (див. стор. 36).
Як обмеження на таблицю SQL становить такий синтаксис для зовнішнього ключа:
FOREIGN KEY список_атрибутів
REFERENCES базова_таблиця [список_атрибутів]
Наприклад. |
|
CREATE TABLE |
Student |
(Kod |
INT NOT NULL PRIMARY KEY CHECK(Kod>0), |
SecondName |
CHAR(30) NOT NULL, |
Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

62 |
М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних |
|
|
FirstName |
CHAR(20) |
NOT NULL, |
|
Patronymic |
CHAR(30), |
|
|
SNum |
SMALLINT |
NOT NULL, |
|
Spec |
CHAR(2) |
NOT NULL CHECK (Spec IN('ОІ','ОМ','ОС','ОП')), |
|
GNum |
INT NOT NULL, |
|
|
Address |
CHAR(30), |
|
|
CHAR(30), |
|
|
|
FOREIGN KEY (Spec, GNum) |
REFERENCES Decanat (Spec, GNum)); |
Якщо в зовнішньому ключі присутній тільки один атрибут, то синтаксис буде трохи інший. Створимо ще одну таблицю для прикладу:
CREATE TABLE Speciality |
|
|
|
(SpKod |
CHAR(11) |
NOT NULL |
CHECK(SpKod LIKE ‘_ . _ _ _ _ _ _ _ _’), |
ScDirect |
CHAR(20) |
NOT NULL, |
|
SpName |
CHAR(40) |
NOT NULL |
UNIQUE, |
Spec |
CHAR(2) |
NOT NULL |
UNIQUE |
CHECK(Spec IN(‘ОІ’, …, ‘ОС’))); |
|
||
Тоді в таблиці Student можна змінити інструкцію |
|||
… Spec |
CHAR(2) |
REFERENCES Speciality (Spec), … |
Якщо батьківським є первинний ключ, наприклад, у таблиці Speciality замість SpKod — Spec, то у визначенні зовнішнього ключа можна обійтися без імен атрибутів:
… Spec CHAR(2) REFERENCES Speciality, …
Тепер розберемося, чому зовнішні ключі є обмеженнями. Зокрема, як вони впливають на виконання команд введення (INSERT) і відновлення (UPDATE).
Для деталізованої таблиці, яка містить зовнішній ключ, можливі два варіанти змін залежно від того, дозволені чи ні для зовнішнього ключа NULL-значення. Якщо
NULL-значення заборонені, то додавати в таку таблицю новий кортеж можна тільки в
тому випадку, якщо в базовій таблиці існує батьківський ключ, що збігається з зовніш-
нім ключем нового кортежу. Якщо ж NULL-значення в зовнішньому ключі дозволені, то
ключ набуває таке значення при відсутності відповідного йому батьківського ключа. У
такому випадку вводити нові кортежі можна завжди. Видаляти кортежі з деталізованої таблиці також можна в будь-якому випадку, незалежно від значення зовнішнього ключа
(DELETE).
Використання NULL-значень у зовнішніх ключах для дотримання принципу посилальної цілісності є не тільки бажаним, але й необхідним у тому випадку, якщо зовнішній ключ посилається на первинний ключ власної таблиці: SQL допускає і такий варіант. Практично в будь-якій літературі з мови наводиться такий приклад цієї ситуації: інформація про службовців деякої фірми зведена в таблицю, в якій один з атрибутів службовця містить посилання на його керівника, котрий у свою чергу, також є службовцем:
CREATE TABLE Employees |
|
|
|
(EmpNo |
INT |
NOT NULL |
PRIMARY KEY, |
Name |
CHAR(30) |
NOT NULL |
UNIQUE, |
Manager |
INT |
REFERENCES Employees); |
Для базових таблиць, що містять батьківські ключі, ситуація з додаванням і з видаленням або модифікацією кортежів цілком зворотна: додавати нові записи можна необмежено, а видаляти і модифікувати необхідно так, щоб дотримувати визначення зовнішнього ключа. Зокрема, зовнішній ключ повинен або містити NULL-значення, або збігатися з батьківським.
У SQL для зміни або видалення кортежів з батьківським ключем існує три можливості:
Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних |
63 |
|
|
1.Можна обмежити або заборонити модифікацію батьківського ключа. Це означає, що його зміна обмежена в тім значенні, що припустима, якщо на батьківський ключ немає посилань з деталізованих таблиць.
2.Можна при зміні батьківського ключа автоматично змінювати і зовнішні ключі, що посилаються на нього. У цьому випадку говорять, що зміни виконуються каскадно.
3.Можна змінювати або видаляти кортеж з батьківським ключем, а значення відповідних йому зовнішніх ключів автоматично встановлюються (і тут цей випадок поділяється ще на два):
у NULL;
у значення за замовчуванням.
Для реалізації цих трьох випадків використовуються такі оператори:
1.RESTRICTED (обмеження) або NO ACTION (у SQL\92);
2.CASCADE[S] (каскадно), (без S у SQL\92);
3.NULLS або SET NULL (SQL\92); SET DEFAULT.
Наприклад, внесемо зміни в таблицю Student.
CREATE TABLE |
Student |
|
|
(Kod |
INT |
NOT NULL PRIMARY KEY CHECK(Kod>0), |
|
SecondName |
CHAR(30) |
NOT NULL, |
|
FirstName |
CHAR(20) |
NOT NULL, |
|
Patronymic |
CHAR(30), |
|
|
SNum |
SMALLINT |
NOT NULL, |
|
Spec |
CHAR(2) |
REFERENCES Speciality (Spec) NOT NULL, |
|
GNum |
INT |
NOT NULL, |
|
Address |
CHAR(30), |
|
|
CHAR(30), |
|
||
UNIQUE(Spec, GNum, SNum), |
|
||
FOREIGN KEY (Spec, GNum) |
REFERENCES Decanat (Spec, GNum) |
||
ON UPDATE CASCADE |
|
ON DELETE CASCADE,
UPDATE OF Speciality CASCADES, DELETE OF Speciality RESTRICTED);
В діалекті PostgreSQL обмеження на стовпці типу UPDATE OF, DELETE OF тощо відсутні. Проте їхню роль відіграють інструкції ON UPDATE або ON DELETE, які вказуються в якості обмежень на відповідні стовпці разом з інструкцією REFERENCES.
І нарешті, якщо ви є власником або творцем таблиці (що це означає, ми розглянемо трохи пізніше), то ви маєте можливість модифікувати і видаляти таблицю.
Для модифікації в SQL існує команда
ALTER TABLE |
таблиця |
операція |
об’єкт[, |
|
таблиця |
операція |
об’єкт[, …]]; |
де таблиця — |
ім’я таблиці, |
операція — ADD (додати) або DROP (видалити), |
об’єкт — стовпець (при додаванні указуються всі необхідні параметри) або обмеження типу
UNIQUE, PRIMARY KEY, CHECK і т.д.
Наприклад: |
|
|
ALTER TABLE Rating |
|
|
DROP |
Mark, |
|
ADD |
MarkECTS CHAR(2) |
|
|
CHECK(MarkECTS |
IN(‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘FX’, ‘F’)) |
|
DEFAULT ‘F’; |
|
Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

64 |
М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних |
|
|
Відповідно, завдяки цій команді, можна:
додавати нові стовпці;
визначати для існуючого стовпця нове або замінити старе значення за замовчуванням;
видаляти для існуючого стовпця значення за замовчуванням;
задавати нове обмеження цілісності для таблиці;
видаляти існуюче обмеження цілісності для таблиці.
Щодо додавання та видалення обмежень необхідно звернути увагу на те, що для виконання цих дій обмеження повинні мати імена (назви). Приклад пойменування обмежень наведений в п. „Домени“ цього розділу (див. стор. 46). Проте необхідно відзначити, що всі розвинуті СУБД, в тому числі PostgreSQL, всім непойменованим користувачем обмеженням надає автоматичні імена, які можна подивитись засобами додатку PgAdmin.
Знищується таблиця командою
DROP TABLE таблиця опція;
Опціями може бути RESTRICT або CASCADE. Якщо при видаленні таблиці встановлюється опція RESTRICT, а сама таблиця містить батьківські ключі, на які існують посилання, то команда буде відкинута. Якщо ж у такій ситуації встановлена опція CASCADE, то команда буде виконана, а всі посилання на неї будуть знищені (замінені NULL або DEFAULT).
Створення об’єктно-реляційних зв'язків в PostgreSQL
В розділі „Ошибка! Источник ссылки не найден.“ відмічалось, що ця модель має підтримувати основні елементи об’єктного підходу.
Так, зокрема, у PostgreSQL підтримується такий елемент, як успадкування, завдяки механізму створення відповідних об'єктно-реляційних зв'язків. Тобто таблиця може успадковувати деякі атрибути від однієї або декількох таблиць, що призводить до створення відносин типу „предок-нащадок“. В результаті таблиці-нащадки мають ті ж атрибути і обмеження, що і їх таблиці-предки, а також доповнюються власними атрибутами.
При складанні запиту до таблиці-предка можна вимагати, щоб запит справив вибірку або тільки з самої таблиці, або ж переглянув таблицю з її таблицями-нащадками. При запиті до таблиці-нащадка у результат не включаються рядки з таблиці-предка.
При створенні таблиці-нащадка на основі таблиці-предка використовується оператор
INHERITS:
CREATE TABLE таблиця-нащадок (…)
INHERITS (таблиця-предок [атрибут_1, атрибут_2, … ] )
Розглянемо приклад. Нехай існує таблиця Student.
Таблиця Master з даними про студентів-дипломників може успадковувати всі атрибути таблиці Student, доповнюючи назвою дипломної роботи:
CREATE TABLE |
Master |
(Diploma |
VARCHAR) |
INHERITS (Student);
Індекси
Досить тривіальною є задача, в якій необхідно знайти і вивести вміст кортежу за значенням первинного ключа. Простота розв’язання є наслідком властивості унікальності первинного ключа. Однак записи в таблиці не упорядковані відповідно до значення цього ключа (тобто атрибута або підмножини атрибутів).
При цьому досить часто виникає необхідність знайти кортеж або групу кортежів з конкретним значенням зовсім іншої підмножини атрибутів. Наприклад:
SELECT * |
FROM Speciality |
WHERE |
ScDirect = ‘Комп’’ютерні науки’; |
Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних |
65 |
|
|
Результат виконання даного запиту буде отриманий досить швидко, тому що перша ж цифра значення атрибута SpKod, що є первинним ключем, відповідає науковому напрямку. Якби це було не так, а втім, і в даному випадку, такий пошук зажадав би повного перебору рядків таблиці Speciality.
Для прискорення розв’язання цієї задачі в SQL підтримуються індекси.
Індекс — це упорядкований (в алфавітному або числовому порядку) список вмісту стовпців або групи стовпців у таблиці.
Управління індексами істотно сповільнює виконання операцій відновлення (INSERT, DELETE), і, крім того, індекс займає додаткове місце в пам’яті. Тому цей засіб SQL не було внесено в стандарт ANSI, хоча підтримується всіма СУБД, і існував ще до введення цього стандарту. Синтаксис команди створення індексу виглядає так:
CREATE INDEX індекс ON таблиця (стовпець[, стовпець[, …]]);
Якщо вказано більш одного атрибута для створення одного індексу, то дані упорядковуються за значенням першого поля, усередині груп, що вийшли, здійснюється упорядкуван-
ня за значенням другого поля, усередині отриманих груп — за значенням третього і т.д.
Суттєвий нюанс: будучи один раз створеним, індекс є невидимим для користувача. Сервер БД „сам вирішить“, коли є сенс скористатися індексом, і зробить це автоматично.
Інструкція
CREATE UNIQUE INDEX індекс ON таблиця(поле[, поле[, …]]);
фактично дублює первинний ключ. При цьому, якщо таким чином індексується таблиця з вже існуючими кортежами, що містять однакові значення атрибутів указаних в інструкції, то ця команда буде відхилена.
Залежно від СУБД для таблиці може бути створено до 250 індексів. Знищити індекс можна командою
DROP INDEX індекс;
яка не змінює вмісту полів.
Представлення
Представлення (VIEW) — об’єкт, що не містить власних даних. Це іменована похід-
на віртуальна таблиця, що не може існувати сама по собі, а визначається в термінах однієї або декількох іменованих таблиць (базових таблиць або інших представлень).
У загальному випадку термін похідна таблиця позначає таблицю, що визначається в термінах інших таблиць і, в остаточному підсумку, у термінах базових таблиць, тобто є результатом виконання яких-небудь реляційних виразів над ними. Базова таблиця — це така таблиця, що не є похідною.
Розходження ж між базовою таблицею і представленням характеризується так:
базові таблиці „реально існують“ у тім змісті, що вони представляють дані, дійсно збережені в БД;
представлення ж „реально не існують“, а просто представляють різні схеми перегляду „реальних“ даних. Іншими словами, представлення подібні вікнам, через які проглядається інформація, що міститься в базових таблицях.
Більш того, будь-які зміни в основній таблиці будуть автоматично і негайно видані через таке „вікно“. І навпаки, зміни в представленні будуть автоматично і негайно застосовані до його базової таблиці.
У дійсності ж представлення — це запити, які виконуються щоразу, коли представлення є об’єктом команди SQL.
Створення і знищення представлення здійснюється командами CREATE VIEW і DROP VIEW.
Формат команди знищення досить простий: DROP VIEW представлення;
Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

66 |
М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних |
|
|
Команда створення представлення має формат:
CREATE VIEW |
представлення[(імена_стовпців)] |
AS запит; |
|||||
Наприклад: |
|
|
|
|
|
|
|
CREATE VIEW |
Rating_D |
AS |
|
|
|||
SELECT |
Kod, Mark, MDate |
FROM Rating |
|
|
|||
WHERE |
DKod=1 AND Mark >= 30; |
|
|
||||
Це представлення буде містити коди, рейтинг та дати проведення модулю по першій |
|||||||
дисципліні тих студентів, у яких цей рейтинг не менший 30 балів: |
|||||||
|
|
KOD |
|
MARK |
|
MDATE |
|
|
|
1 |
|
82 |
|
2011-10-10 |
|
|
|
2 |
|
90 |
|
2011-10-10 |
|
|
|
3 |
|
46 |
|
2011-10-11 |
|
|
|
4 |
|
54 |
|
2011-10-10 |
|
Значення фрази |
|
5 |
|
86 |
|
2011-10-10 |
видний при звертанні |
про те, що представлення — це запит, найбільш |
|||||||
до представлень, як до таблиць. Таким чином, команда |
|
|
|||||
SELECT * |
FROM Rating_D |
|
|
|
|
||
WHERE |
Mark < 60; |
|
|
|
|
|
на практиці конвертується і оптимізується в команду:
SELECT Kod, Mark, MDate FROM Rating WHERE DKod=1 AND Mark >= 30 AND Mark < 60;
У цьому досить простому представленні як імена полів використовувалися безпосередньо імена полів таблиці, що лежить в основі представлення. Іноді, як у наведеному прикладі, цього досить. Але іноді бажано дати нові імена стовпцям представлення. А іноді — це просто необхідно. Наприклад, у тих випадках коли:
а) деякі стовпці є вихідними і, отже, не пойменовані. Така ситуація часто виникає при об’єднанні відношень з різними іменами однотипних атрибутів;
б) два або більше стовпців мають однакові імена в таблицях, що беруть участь у з’єднанні. Імена, що стануть іменами стовпців представлення, вказуються в круглих дужках після
його імені. Типи даних і розміри автоматично виводяться з полів запиту. Наприклад:
CREATE VIEW Rating_D(Student_Number, Discipline_Number, Rating, Date_of_Mark) AS
SELECT Kod, DKod, Mark, MDate FROM Rating WHERE Mark >= 30;
При цьому приклад з вибіркою значень трансформується в такий:
SELECT * |
FROM Rating_D |
WHERE |
Rating < 60; |
Вдеяких системах інтенсивність запитів на вибірку даних з представлень настільки велика, що зводить нанівець переваги цього елементу МВД. В таких випадках, коли до того ж інтенсивність незрівнянно менша за інтенсивність вибірки або періодичність модифікації значно більше за вибірку, доцільним стає зберігання даних, які відображаються через представлення. Для розв’язання зазначеної проблеми в деяких СУБД (зокрема, Oracle та
PostgreSQL) введено додатковий елемент МВД SQL — матеріалізоване представлення.
ВСУБД Oracle найпростіший варіант синтаксису команд його створення та видалення збігається з синтаксисом відповідних команд для звичайного представлення:
CREATE MATERIALIZED VIEW представлення[(імена_стовпців)] AS |
запит; |
Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних |
67 |
|
|
В СУБД PostgreSQL матеріалізоване представлення — це поєднання таблиці і звичайного (віртуального) представлення:
CREATE TABLE таблиця [(імена_стовпців)] AS запит;
Тобто в PostgreSQL матеріалізоване представлення — це реальна таблиця, але яка створюється на підставі запиту.
До представлень ми ще повернемося при введенні і відновленні інформації.
Пізніше повернемося і до DDL і розглянемо такі елементи як курсори, тригери, збере-
жені процедури і пакети.
Демонстраційний приклад
Запишіть SQL-запити для створення таблиць, що спроектовані у завданні „Демонстраційний приклад“ розд. „Формалізація зв’язків між відношеннями“.
П.1. Обґрунтуйте задані типи полів.
П.2. Запишіть SQL-запити для створення домену операцій з квитками. П.3. Задайте та обґрунтуйте обмеження значень всіх полів. Зокрема:
―обмеження на поля створюйте з використанням спеціальних логічних операторів;
―реалізуйте зв’язки між таблицями через обмеження зовнішніх ключів.
Розв’язання.
Зверніть увагу, що в цьому прикладі SQL-запити, які створено згідно завданню, включені до SQL-сценарію (SQL-script). Його структуру буде розглянуто у розд. „Сценарії“ (стор. 119). Зараз відмітимо тільки, що це текстовий файл, з SQL-запитами, які будуть послідовно виконані. Тому їхня позиція дуже важлива саме при створені БД: спочатку прописуються команди створення користувальницьких типів даних, далі — доменів, потім — базових таблиць з батьківськими ключами і лише за ними — команди створення деталізованих таблиць із зовнішніми ключами.
Отже, приклад сценарію для побудови таблиць:
CONNECT c:\work\sql\lectures USER MEV PASSWORD <password>; CREATE SEQUENCE s_aircompany;
CREATE SEQUENCE s_voyage;
CREATE SEQUENCE s_class; CREATE SEQUENCE s_passenger; CREATE SEQUENCE s_employee; CREATE SEQUENCE s_ticket;
/* Domain: operation, Owner: MEV */
CREATE DOMAIN operation CHAR(7) DEFAULT ‘покупка’
CHECK (VALUE IN (‘покупка’, ‘бронь’));
/* Table: aircompany, Owner: MEV */
CREATE TABLE aircompany
(id_aircompany INT PRIMARY KEY DEFAULT NEXTVAL(‘s_aircompany’), name CHAR (50),
country CHAR (30));
/* Table: voyage, Owner: MEV */ CREATE TABLE voyage
Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

68 |
М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних |
|
|
(id_voyage INT PRIMARY KEY DEFAULT NEXTVAL(‘s_voyage’), number CHAR(20),
destination CHAR (30), date_departure DATE, time_departure TIME, date_arrival DATE, time_arrival TIME, type_aircraft CHAR(30),
aircompany INT REFERENCES aircompany(id_aircompany));
/* Table: class, Owner: MEV */
CREATE TABLE class
(id_class INT PRIMARY KEY DEFAULT NEXTVAL(‘s_class’), name CHAR (30),
voyage INT REFERENCES voyage(id_voyage), price DECIMAL(50,2),
quantity_place INT);
/* Table: passenger, Owner: MEV */
CREATE TABLE passenger
(id_passenger INT PRIMARY KEY DEFAULT NEXTVAL(‘s_passenger’), full_name CHAR (30),
sex CHAR (1) CHECK(sex IN(‘м’,’ж’)), passport CHAR (30));
/* Table: employee, Owner: MEV */
CREATE TABLE employee
(id_employee INT PRIMARY KEY DEFAULT NEXTVAL(‘s_employee’), full_name CHAR(30),
position CHAR(30), date_birth DATE, passport CHAR(10),
identification_code FLOAT, adress CHAR(55),
telefon CHAR(15));
/* Table: ticket, Owner: MEV */
CREATE TABLE ticket
(id_ticket INT PRIMARY KEY DEFAULT NEXTVAL(‘s_ticket’), passenger INT REFERENCES passenger(id_passenger),
class INT REFERENCES class(id_class), place INT,
employee INT REFERENCES employee(id_employee), operation operation);
EXIT;
Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних |
69 |
|
|
Мова маніпулювання даними (ММД, DML) SQL
Основні команди ММД SQL
ММД SQL реалізує чи дозволяє реалізувати практично всі основні операції реляційної алгебри. Основні оператори ММД — це SELECT, INSERT, UPDATE і DELETE. Перший на-
зивають оператором вибірки, а інші — операторами відновлення. Спочатку розглянемо найпростіші варіанти відновлення, а потім вибірку і наприкінці повернемося до відновлення.
Усі нові кортежі в SQL вводяться в таблиці за допомогою команди INSERT: INSERT INTO таблиця VALUES(значення, значення, …);
У такому варіанті команди число значень повинне відповідати числу атрибутів таблиці. Значення при цьому мають позиційне значення і не можуть містити вирази. Наприклад:
INSERT INTO Rating |
VALUES(111, 5, 85, ‘19.11.2011’); |
Якщо ж необхідно „пропустити“ значення якого-небудь поля при введенні, це можна реалізувати двома способами:
уставити NULL-значення у відповідну позицію:
INSERT INTO Student
VALUES(111, ‘Малахов’, ‘Євгеній’, NULL, 12, ‘АМ’, 823, NULL, NULL);
Це можливо тільки в тому випадку, якщо в даному полі припустимі такі значення;
явно вказати імена стовпців, до котрих будуть уведені нові значення. Пропущеним атрибутам будуть надані або NULL-значення, якщо вони припустимі, або значення за замовчуванням, якщо вони існують (задані). Приклад:
INSERT INTO |
Rating(MDate, Kod, DKod) VALUES (‘21.11.2011’, 222, 3); |
||
Рядки з таблиці можна виключити за допомогою команди |
|||
DELETE FROM |
таблиця |
[умова]; |
|
Якщо не вказана умова, то команда виконує „очищення“ таблиці: |
|||
DELETE FROM |
Rating; |
|
|
Використання умови дозволяє видаляти кілька кортежів таблиці: |
|||
DELETE FROM |
Student |
WHERE |
GNum < 941; |
Якщо в умові вказане ім’я первинного ключа, то це забезпечить видалення одного єдиного кортежу.
!ніше, видно, що цей оператор фактично реалізує в SQL реляційну операцію вибірки (се- лекції).Зверніть увагу на оператор WHERE. З цього і ряду інших прикладів, наведених ра-
Очевидним є питання: чи можна видаляти „поточний рядок“? Можна, але для цього буде потрібно ще один елемент МВД SQL — курсор, який ми розглянемо трохи пізніше.
Наступна команда МВД SQL дозволяє змінювати значення вже існуючих полів табли-
ці:
UPDATE таблиця SET поле = значення[, поле = значення[, …]] [умова];
Це найпростіший формат команди, причому ключове слово SET забезпечує реалізацію реляційної операції проекції на підмножину схеми відношення, представленої таблицею. Наприклад:
UPDATE Rating |
SET Mark = 30; |
Ця команда забезпечує запис значення 30 до поля Mark усіх кортежів таблиці. Більш того, на відміну від інструкції VALUES команди INSERT, в інструкції SET припустиме ви-
Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет

70 |
М. Г. Глава. Технологія проектування і адміністрування баз даних та сховищ даних |
|
|
користання скалярних виразів. Наприклад:
UPDATE Rating |
SET Mark = Mark +(70 - Mark)*0.2; |
Для модифікації неодиничної підмножини стовпців їх необхідно перелічити у вислові
SET:
UPDATE Rating |
SET Mark = NULL, DKod = 2; |
Цей приклад демонструє і можливість „очищення“ поля, тобто зміни його значення на
NULL без використання яких-небудь додаткових засобів.
І, нарешті, операція вибірки з проекції дозволяє змінити значення полів лише частини кортежів таблиці. Для цього в команду UPDATE додається умова. Наприклад:
UPDATE Student |
SET patronymic = ‘Валерійович’, GNum = 842 |
WHERE |
Kod = 111; |
Наступна команда, яку ми розглянемо і яку вже використовували в низці прикладів — це SELECT (вибірка). Цю команду можна, мабуть, назвати основною у ММД SQL, тому що вона використовується не тільки сама по собі, але і дозволяє значною мірою розширити інші команди маніпулювання даними. І, крім того, за її основою будується практично половина елементів SQL і, відповідно, запитів МВД SQL.
Незважаючи на назву цієї команди, вона не є, у чистому виді, реалізацією реляційної операції вибірки. Її найпростіший формат виконує операцію проекції:
SELECT |
список_стовпців |
FROM |
таблиця; |
Наприклад: |
|
|
|
SELECT |
Kod, DKod, Mark |
FROM |
Rating; |
Якщо необхідно вивести вміст усіх полів таблиці, то в команді замість список_стовпців указується шаблон *. Наприклад:
SELECT * FROM Student;
При цьому необхідно враховувати, що стовпці будуть виведені в тому порядку, в якому вони фізично зберігаються в таблиці чи перелічені в представленні.
Якщо ж стовпці при виводі, наприклад в інтерактивному режимі, необхідно переставити, то їх знов-таки перелічують у команді.
Необхідно відзначити, що за замовчуванням команда SELECT операцію проекції реалізує не цілком, не до кінця. Справа в тому, що проекція на підмножину схеми відношення має на увазі виключення з реляційної таблиці кортежів, що збігаються. Команда ж SELECT, наприклад:
SELECT SecondName FROM Student;
виведе прізвища всіх студентів (із усіх кортежів) у тому числі і ті, що повторюються. Це приклад, у якому, як і у всіх попередніх, за замовчуванням використовується параметр ALL. У загальному вигляді формат команди з даного прикладу такий:
SELECT ALL список_полів FROM таблиця;
Для того, щоб виключити однакові кортежі з результату, тобто цілком виконати операцію проекції, необхідно ключове слово ALL замінити на DISTINCT. Наприклад:
SELECT DISTINCT SecondName, FirstName FROM Student;
Необхідно відзначити, що за допомогою інструкції DISTINCT з результату проекції видаляються кортежі, які цілком збігаються. Відповідно в останньому прикладі повторюваними будуть вважатися рядки, у яких збігаються й ім’я, і прізвище.
Наступне розширення команди SELECT аналогічно команді відновлення (UPDATE) — це вибірка і проекція. І також, як у UPDATE, для цього використовується оператор
Кафедра економічної кібернетики та інформаційних технологій. Одеський національний політехнічний університет