- •Модуль 1 Тема 1. Вступ до sql. Синтаксис sql. Типи даних.
- •1. Вступ до sql.
- •Функції sql:
- •Роль sql
- •Переваги sql:
- •Синтаксис sql.
- •Типи даних.
- •1.3.1. Команди
- •1.3.2. Імена
- •1.3.3. Типи даних
- •1.3.4. Константи
- •1.3.4.1. Числові константи
- •1 .3.4.2. Літерні рядки
- •1.3.4.3. Константи дати і часу
- •1.3.4.4. Іменовані константи
- •1.3.5. Вирази
- •1.3.6. Вбудовані функції
- •Тема 2. Створення баз даних
- •Мова визначення даних
- •2. Створення бази даних
- •Тема 3. Створення таблиць
- •1. Команда створення таблиці.
- •2. Заборона значення null за допомогою обмеження not null
- •Тема 4. Вставка стрічок з допомогою оператора insert. Вилучення стрічок з допомогою оператора delete, редагування стрічки з допомогою команди update.
- •Вставка рядків за допомогою команди insert.
- •Додавання рядка за допомогою положення стовпця
- •Додавання рядка за допомогою назв стовпців
- •Додавання рядків з однієї таблиці в іншу
- •Зміна рядків за допомогою команди update.
- •Зміна рядків
- •Видалення рядків за допомогою команди delete
- •Видалення рядків
- •Тема 5. Оператор select
- •Оператор select.
- •Обчислювальні стовпчики. Альтернативне ім’я стовпчику.
- •Порівняння значення стовпчика із константою
- •Правила виконання однотабличних запитів на вибірку
- •Тема 6. Комбінування умов з допомогою операторів and, or, not. Порівняння по шаблону. Порівняння з діапазоном. Сортування стрічок з допомогою речення order by.
- •Порівняння значень виразів має наступну синтаксичну діаграму:
- •Тема 7. Створення псевдонімів. З’єднання таблиці із собою. Вибір даних з кількох таблиць
- •1. Створення псевдонімів.
- •2. З’єднання таблиці із собою.
- •3. Просте з’єднання таблиць (з’єднання за рівністю)
- •Запити з використанням відношення „головна – підлегла” таблиці (предок – нащадок)
- •3. Запити на вибірку до трьох і більше таблиць
- •4. Запити на об’єднання
- •Тема 8. Введення обмежень в базах даних
- •1. Види обмежень в базі даних.
- •Основні принципи роботи з обмеженнями
- •Присвоєння назви обмеженню
- •2. Первинний і унікальний ключі.
- •3. Зовнішні ключі.
- •4. Обмеження check
- •5. Вилучення обмежень.
- •Тема 9. Використання збережуваних процедур в базах даних. Використання генераторів ключів у базах даних в InterBase. Використання тригерів у базах даних.
- •1. Визначення збережуваної процедури.
- •1.2. Цикли й оператори розгалуження.
- •2. Створення генераторів.
- •2.1. Індекси.
- •2.2. Обробка виключень і помилок.
- •3. 1.Означення тригера.
- •3.2. Приклад тригера.
- •3.3. Контекстні змінні.
- •Тема 10. Безпека в базах даних
- •1. Користувач InterBase.
- •3. Організація користувачі у групи за допомогою ролей.
- •4. Права. Роздача прав.
- •5. Анулювання прав.
- •Модуль 2 Тема 11. Оператор exists. Сумування і групування даних.
- •1.1. Оператор exists.
- •1.2. Використання exists з співвіднесеними підзапитами.
- •1.3. Комбінація оператора exists і з’єднання.
- •1.4. Використання not exists.
- •1.5. Використання складних підзаписів з оператором exists.
- •2.1. Агрегатні (статистичні) функції
- •2.2. Правила опрацювання значення null агрегатними функціями:
- •2.3.Опрацювання унікальних записів агрегатними функціями
- •2.4. Агрегатні функції і значення null
- •3.1. Групування записів
- •3.2. Секція having – умова відбору груп
- •3.3. Обмеження на умову відбору груп
- •3.4. Значення null і умова відбору груп
- •3.5. Секція having без секції group by
- •Тема 12. З’єднання з базою даних. Використання збережуваних процедур в Delphi
- •1. З’єднання з сервером
- •2. Використання збережуваних процедур в Delphi.
- •Компонент tStoredProc.
- •Тема 13. Використання механізму транзакцій компонента Database. Керування транзакціями
- •Тема 14. Сервер баз даних InterBase і компоненти InterBase Express.
- •1. Сервер баз даних InterBase і компоненти InterBase Express
- •2. Механізм доступу до даних InterBase Express
- •3. Компонент tibDatabase.
- •Тема 15. Виконання запитів за допомогою компонента tibDataSet
- •1. Вибірка даних з таблиці.
- •2. Редагування даних за допомогою візуальних компонентів.
- •3. Програмне редагування даних.
- •Тема 16. Підпорядковані запити в таблицях Механізм master-detail
- •Література
2. Первинний і унікальний ключі.
Первинні ключі є одним з основних видів обмежень в базі даних. Вони використовуються для однозначної ідентифікації записів у таблиці. Первинний ключ являє собою одне або декілька полів в таблиці, комбінація яких унікальна для кожного запису. Для однієї таблиці не існують повторювані значення первинного ключа.
Унікальні ключі несуть аналогічне навантаження – вони також використовуються для однозначної ідентифікації записів у таблиці. Відмінність первинних ключів від унікальних полягає в тому, що первинний ключ може бути в таблиці лише один, а унікальних ключів – декілька. Слід зауважити, що і первинний і унікальний ключ можуть використовуватися як основа для посилання для зовнішніх ключів. Синтаксис створення первинного і унікального ключів на основі декількох полів: <PkUktconstraint> = [CONSTRAINT constraint] {PRIMARY KEY|UNIQUE) (col [, col ...])
CREATE TABLE PkUk2( Number1 INTEGER NOT NULL, Namel VARCHAR(5O) NOT NULL, Kol INTEGER NOT NULL, Stoim NUMERIC(15,4) NOT NULL, CONSTRAINT Pkt PRIMARY KEY (Numberl, Namel),
/* первинний ключ Pkt на основі двох полів */ CONSTRAINT Uktl UNIQUE (kol, Stoim) );
/* унікальний ключ Uktl на основі двох полів */
Всі поля, які входять в склад первинного і унікального ключів, повинні декларуватися як NOT NULL, так як ці ключі не можуть мати невизначеного значення.
Окрім створення обмежень первинних і унікальних ключів в момент створення таблиці існує можливість додавати обмеження в уже існуючу таблицю. Для цього використовується команда ALTER TABLE:
ALTER TABLE tablename ADD [CONSTRAINT constraint] {PRIMARY KEY | UNIQUE)( col [, col ...] ) Давайте розглянемо приклад створення первинного і унікального ключа за допомогою ALTER TABLE. Спочатку створимо таблицю: CREATE TABLE PkAlter( ID1 INTEGER NOT NULL, ID2 INTEGER NOT NULL, UID VARCHAR(24)); Потім добавимо ключі. Спочатку первинний: ALTER TABLE PkAlter ADD CONSTRAINT Pkall PRIMARY KEY (idl, id2); потім унікальний ключ: ALTER TABLE PkAlter ADD CONSTRAINT Ukal UNIQUE (uid) ;
Важливо відмітити, що додавання (а також вилучання) обмежень первинних і унікальних ключів до таблиці може здійснювати лише власник цієї таблиці або системний адміністратор SYSDBA.
3. Зовнішні ключі.
Наступним обмеженням, яке часто використовується в базах даних InterBase, є обмеження зовнішнього ключа. Це дуже потужний засіб для підтримання цілістності за посиланнями в базі даних, яке дозволяє не лише контролювати наявність правильних посилань в базі даних, але й автоматично керувати цими посиланнями!
Смисл створення зовнішнього ключа такий: якщо дві таблиці використовуються для збереження взаємопов’язаної інформації, то необхідно гарантувати, щоб цей взаємозв’язок був завжди коректний. Приклад — документ "накладна", що містить спільний заголовок (дата, номер накладної і т. п.) і множина детальних записів (найменування товару, кількість і т. п.).
Для збереження такого документа в базі даних створюються дві таблиці – одна для збереження заголовків накладних, а друга – для збереження вмісту накладної – записів про товари і їх кількість. Такі таблиці називаються головною і підпорядкованою або таблицею-майстером і деталь-таблицею.
Згідно із здоровим глуздом неможливе існування вмісту накладної без наявності її заголовка. Іншими словами, ми не можемо вставляти записи про товари, не створивши заголовок накладної, а також не можемо вилучати запис заголовка, якщо існують записи про товари.
Для реалізації такої поведінки таблиця заголовка з’єднується з таблицею подробиць за допомогою обмежень зовнішнього ключа.
Давайте розглянемо смисл накладених обмежень зовнішнього ключа на прикладі таблиць, що містять інформацію про накладні.
Для цього створимо дві таблиці для збереження накладної – таблицю SALES для збереження заголовку і таблицю ITEMS для збереження інформації про товари, що входять до накладної.
CREATE TABLE SALES (
SALE_NUMBER INTEGER NOT NULL,
CUSTOMER_ID INTEGER,
SALE_DATE TIMESTAMP,
TOTAL_PRICE DOUBLE PRECISION,
CONSTRAINT "PSALE_NUMBER" PRIMARY KEY (SALE_NUMBER) );
Зверніть увагу на те, що ми відразу задали первинний ключ в таблиці заголовка на основі поля SALE_NUMBER – номер покупки. Решта полів таблиці SALES містять інформацію про заголовок накладної – ідентифікаційний номер покупця, дату закупки, суму, заплачену покупцем по всім накладним даної купівельної операції. Тепер визначимо таблицю для збереження інформації про товарах, що входять до накладної:
CREATE TABLE ITEMS (
SALE_NUMBER INTEGER,
ITEM_NO INTEGER,
PART_NO VARCHAR(10),
QTY SMALLINT
);
Давайте розглянемо поля таблиці ITEMS. По перше, ще поле ITEM_NO, яким ідентифікується номер накладної. По-друге – це SALE_NUMBER – цілочисельне поле, яке використовується для посилання на ідентифікатор заголовка SALE_NUMBER в таблиці заголовків накладних SALES. Далі іде поле PART_NO – поле, яке використовується для посилання на ідентифікатор PART_NUMBER (номер товару) в таблиці PART, і QTY – що описує сумарну вартість купленого товару.
В принципі, ніщо не заважає нам заповнити таблицю ITEMS записами, що посилаються на неіснуючі записи в таблиці SALES. Також нічого не заважає вилученню заголовка вже існуючої накладної, в результаті чого записи про товари можуть стати "нічиїми". Це ж саме можна сказати і про поле PART_NO.
Сервер не буде перешкоджати всім цим вставкам і вилученням. Таким чином, контроль за цілістністтю даних в базі даних повністю покладається на клієнтську програму. А оскільки з однією базою даних можуть працювати декілька прикладних програм, що розробляються різними програмістами, то це може призвести до різної інтерпретації даних і до помилок.
Тому необхідно явно накласти обмеження на те, що в таблицю ITEMS можуть вміщуватися лише такі записи про товари, які мають коректне ПОСИЛАННЯ на заголовок накладної. Власне це і є обмеження зовнішнього ключа, яке дозволяє вставляти в поля, що входять в обмеження, лише ті значення, які є в іншій таблиці.
Таке обмеження можна організувати за допомогою зовнішнього ключа. Для даного прикладу необхідно накласти обмеження зовнішнього ключа на поле SALE_NUMBER і пов’язати його з первинним ключем SALE_NUMBER в SALES. Додати зовнішні ключі в уже існуючу таблицю можна такими командами:
ALTER TABLE ITEMS ADD FOREIGN KEY (PART_NO) REFERENCES PART (PART_NUMBER);
ALTER TABLE ITEMS ADD FOREIGN KEY (SALE_NUMBER) REFERENCES SALES (SALE_NUMBER);
Тут ITEMS – ім’я таблиці, на яку накладається обмеження зовнішнього ключа; PART та SALES – імена таблиць, що надають значення (ОСНОВУ посилання) для зовнішнього ключа. В дужках наводяться імена полів, по яким встановлюється зв’язок.
В наведених прикладах перед параметром FOREIGN KEY може розміщуватися CONSTRAINT foreign_name для того, щоб задати прямо ім’я обмеження. Якщо іде зв’язок по групі полів, всі вони перелічуються в дужках через кому.