- •Тема 9. Системи управління базами даних
- •9.1. Теоретичні відомості та методичні поради до вивчення теми
- •9.1.1. Основні концепції бази даних
- •9.1.2. Проектування бази даних
- •Варіант 1. Етапи проектування бази даних
- •6. Відновлення структури бази даних.
- •Варіант 2. Розробка проекту бази даних
- •9.1.3. Microsoft Access як реляційна субд
- •9.1.3.1. Визначення даних і їх збереження
- •9.1.3.2. Обробка даних
- •9.1.4. Архітектура Microsoft Access
- •9.1.5. Таблиці і поля
- •9.1.5.1. Стовпчики і рядки, поля та записи
- •9.1.5.2. Робота з вікном бази даних
- •9.1.5.3. Створення нової таблиці
- •9.1.5.4. Типи полів
- •9.1.5.5. Використання засобу «Описание»
- •9.1.5.6. Властивості поля
- •9.1.5.7. Формати полів (Format)
- •9.1.5.8. Маска введення (Input Mask)
- •9.1.5.9. Підпис поля (Caption)
- •9.1.5.10. Значення за замовчування (Default Value)
- •9.1.5.11. Умова на значення (Validation Rule) і повідомлення про помилку (Validation Text)
- •9.1.5.12. Обов’язкове поле (Required)
- •9.1.5.13. Порожні рядки (Allow Zero Lenght)
- •9.1.5.14. Індексоване поле
- •9.1.5.15. Установка індексів — первинних ключів
- •9.1.6. Модифікація структури таблиці, дії над таблицями
- •9.1.6.1. Зміна проекту бази даних
- •9.1.6.2. Дії з таблицями
- •9.1.6.3. Друк таблиці
- •9.1.6.4. Пошук даних
- •9.1.6.5. Встановлення зв’язків між таблицями
- •9.1.7. Прості запити
- •9.1.7.1. Створення та використання запиту
- •9.1.7.2. Задання умов у запитах
- •9.1.7.3. Створення запитів для проведення статистичних розрахунків
- •9.1.7.4. Узагальнюючі запити для груп записів
- •9.1.7.5. Обчислювальні (розрахункові) поля в запиті
- •9.1.8. Реляційна модель даних
- •9.1.8.1. Відношення
- •9.1.8.2. Домени та атрибути
- •9.1.8.3. Ключі
- •9.1.8.4. Реляційна модель даних «Постачальники-деталі»
- •9.1.9. Реляційна алгебра
- •9.1.10. Структурована мова запитів (sql)
- •9.1.11. Застосування форм
- •9.1.11.1. Стандартна панель інструментів вікна режиму форми
- •9.1.11.2. Заголовок, ділянка даних і ділянка приміток
- •9.1.11.3. Створення простої форми для введення даних
- •9.1.11.4. Розробка форм вручну
- •9.1.12. Створення звітів
- •9.1.12.1. Автоматичне створення звіту
- •9.1.12.2. Створення звітів за допомогою майстра звітів
- •9.2. Контрольні запитання та теми для обговорення
- •9.3. Завдання для самостійної роботи
- •9.3.1. Проектування баз даних та робота з ними
- •Завдання 2
- •Завдання 6
- •Завдання 7
- •Завдання 8
- •9.3.2. Використання структурованої мови запитів (sql)
- •9.4. Завдання для перевірки знань
- •9.5. Основні терміни та визначення
9.1.9. Реляційна алгебра
Основна ідея реляційної алгебри в тому, що засоби маніпулювання відношеннями можуть ґрунтуватися на теоретико-множинних операціях. Такими операціями можуть бути:
об’єднання відношень;
перетин відношень;
різниця відношень;
прямий добуток відношень.
Ці операції слід доповнити такими спеціальними операціями:
обмеження відношень;
проекція відношень;
з’єднання відношень;
поділ відношень.
Сюди також потрібно включити операцію присвоєння, яка дає змогу зберегти результати обчислення алгебраїчних виразів, та операцію перейменувань атрибутів, яка уможливлює коректне формування схеми результуючого відношення. Дамо коротко загальну інтерпретацію реляційних операцій.
Для операцій об’єднання, перетину та взяття два відношення, які беруть участь у цих теоретико-множинних операціях, повинні бути сумісними, тобто вони повинні мати один і той самий степінь, а також j-ті атрибути кожного з них повинні бути з одного домену.
Об’єднанням (UNION) двох відношень А і В або A UNION B називається множина всіх кортежів, які належать А чи В, або обом разом.
Перетином (INTERSECTION) двох відношень А і B, A INTERSECT В називається множина всіх кортежів, які однаково належать як А, так і В.
Різницею двох відношень А і В, A MINUS B називається множина всіх кортежів, що належать А, але не належать В.
Прямим декартовим добутком двох відношень А і В, A TIMES B, є множина всіх кортежів k таких, що k є конкатенація кортежів a A, b B. Тобто, якщо а = (а1, …, аm) i b = (bm+1, …, bm+n), то k = a b = (a1, …, bm+n).
Обмеження відношень, тобто вибір (SELECTION), являє собою оператор для побудови підмножини відношення, тобто підмножини кортежів усередині відношення, які відповідають певному предикату (логічній умові).
Проекція відношень являє собою оператор для побудови «вертикальної» підмножини відношення, тобто підмножини, одержуваної через вибір одних та виключення інших атрибутів.
При з’єднанні двох відношень за певною логічною умовою утворюється результативне відношення, кортежі якого є конкатенацією кортежів першого та другого відношень і відповідають цій умові.
Поділ відношень розглядається як операція між бінарним відношенням (ділимим), унаслідок якої одержуємо унарне відношення (частку).
Операція перейменування продукує відношення, набір кортежів котрого збігається з набором кортежів операнда, але імена атрибутів змінені.
Операція присвоєння дає змогу зберегти результат обчислення реляційного виразу в існуючому відношенні бази даних.
9.1.10. Структурована мова запитів (sql)
Якщо після створення запиту виконати команду: Вид/ Режим SQL, то на екран буде виведено невелику програму мовою SQL. Оскільки приклади, які виконують користувачі, є невеликими, то можна спробувати розібратися в цих програмах.
Початкова версія мови SQL (Structured English Query Language) базувалася на раніше розробленій мові square. Прототип цієї версії SQL був реалізований у науково-дослідній лаборато- рії фірми IBM у 1974 році (Chamberlin D., Boyce R. SEQUEL: A Structured English Query Language. Proc. 1974 ACM SIGMOND Workshop on Data Description, Access and Control).
Приклади, які ми далі розглянемо, можуть навести на думку, що SQL є просто мовою запитів. Попередимо, що SQL є дещо більше, ніж просто мова запитів. SQL забезпечує повний набір операцій запам’ятовування — Insert (Включить), Delete (Удалить), Update (Обновить), а також інші можливості.
Основною операцією у мові SQL є відображення, яке синтаксично є блоком SELECT-FROM-WHERE (вибрати-з-де). Наприклад, запит «Одержати номери та статуси постачальників, які перебувають у Парижі», можна виразити таким чином:
SELECT S#, STATUS
FROM S
WHERE CITY=«PARIS»
Тут спочатку ми створюємо горизонтальну підмножину з рядками, у яких CITY = «PARIS», а потім з одержаного результату створюємо вертикальну підмножину (вибираємо атрибути S# і STATUS). Далі можна за допомогою операції присвоювання визначити ім’я таблиці та імена стовпчиків, що утворилися в результаті виконання запиту. Наприклад:
REZULT (SNO, CODE) SELECT S#, STATUS
FROM S
WHERE CITY=«PARIS»
У мові SQL надається перевага термінам «таблиця», «стовпчик», «рядок» над термінами «відношення», «атрибут», «кортеж».
Проста вибірка. 1) Одержати всі номери деталей, що постачаються:
SELECT UNIQUE P#
FROM SP
Оператор UNIQUE дає змогу зробити вибірку без дублікатів.
2) Одержати повну інформацію про всіх постачальників:
SELECT *
FROM S
Будуть виведені всі стовпчики таблиці S.
Вибірка за умовою. Одержати номери постачальників, що перебувають у Парижі і мають статус >20:
SELECT S#
FROM S
WHERE CITY=«PARIS»
AND STATUS >20
Предикат, який іде за WHERE, може включати оператори порівняння =, >, >=, <, <=, <>, бульові оператори AND, OR та NOT, а також дужки для зазначування потрібного порядку обчислення.
Вибірка з упорядкуванням. Одержати номери та статуси постачальників, які перебувають у Парижі, у порядку зменшення їх статусів:
SELECT S#, STATUS
FROM S
WHERE CITY=«PARIS»
ORDER BY STATUS DESC
Оператор DESC означає сортування за зменшенням, а ASC — сортування за зростанням.
Вибірка з використанням вкладеного відображення. 1) Одержати імена постачальників, які постачають деталь Р2:
SELECT SNAME
FROM S
WHERE S# IS IN
(SELECT S#
FROM SP
WHERE P#=«P2»)
Тут оператор IS IN (можна просто IN) означає належність елемента множині. Оператор IS NOT IN (або просто NOT IN) інтерпретується як «не належить множині».
2) Одержати номери постачальників, які постачають хоча б одну червону (RED) деталь:
SELECT UNIQUE S#
FROM SP
WHERE P# IN
SELECT P#
FROM P
WHERE COLOR=«RED»
Якщо неоднозначність результату виключена, то дужки у внутрішньому блоці можуть бути опущені.
Вибірка з використанням кількох рівнів вкладеності. Одержати імена постачальників, які постачають хоча б одну червону (RED) деталь:
SELECT SNAME
FROM S
WHERE S# IN
SELECT S#
FROM SP
WHERE P# IN
SELECT P#
FROM P
WHERE COLOR=«RED»
Вибірка з використанням вкладеного відображення і міжблокового посилання. Одержати імена постачальників, які не постачають деталь Р1:
SELECT SNAME
FROM S
WHERE «P1» NOT IN
SELECT P#
FROM SP
WHERE S#=S.S#
Для посилання на S# з зовнішнього блоку у внутрішній потрібно використати очевидне уточнення (S).
Вибірка з використанням вкладеного відображення і з однією і тією самою таблицею в обох блоках. Одержати номери тих постачальників, які постачають хоча б одну деталь, що поставляється постачальником S2:
SELECT UNIQUE S#
FROM SP
WHERE P# IN
SELECT P#
FROM P
WHERE S#=«S2»
Вибірка з використанням синоніма. Одержати номери всіх деталей, що постачаються кількома постачальниками:
SELECT UNIQUE P#
FROM SP SPX
WHERE P# IN
SELECT P#
FROM SP
WHERE S#<>SPX.S
SPX є довільною позначкою, що використовується для зв’язку між SPX.S# у внутрішньому блоці і таблицею зовнішнього блоку. Виконання запиту можна пояснити так: «по черзі для кожного рядка, наприклад, SPX таблиці SP знайти значення P#, якщо це значення належить множині значень P#, для яких відповідне значення S# не дорівнює значенню S# у рядку SPX, тобто, якщо деталь постачається постачальником, відмінним від постачальника, ідентифікованим рядком SPX».
Вибірка більше ніж з однієї таблиці. Для кожної деталі, яка постачається, одержати номер деталі (P#) та назви всіх міст (CITY), з яких ця деталь постачається.
SELEKT UNIQUE P#, CITY
FROM SP, S
WHERE SP.S#=S.S#
Вибірка, що включає порівняння множин. 1) Одержати імена постачальників (SNAME), які постачають усі деталі.
SELECT SNAME
FROM S
WHERE (SELECT P#
FROM SP
WHERE S#=S.S#)
=
(SELECT P#
FROM P)
Нам потрібні імена таких постачальників, щоб множина деталей, які вони постачають (результат першого внутрішнього відображення), була еквівалентна множині всіх деталей (результат другого внутрішнього відображення). У даному випадку оператор «=» є оператором еквівалентності множин.
2) Одержати номери тих постачальників, які постачають щонайменше всі деталі, що й постачальник S2.
SELECT UNIQUE S#
FROM SP SPX
WHERE (SELECT P#
FROM SP
WHERE S#=SPX.S#)
CONTAINS
(SELECT P#
FROM SP
WHERE S#=«S2»)
Оператор CONTAINS означає «містить», «має».
Вибірка, що включає GROUP BY, HAVING i SET. Одержати номери тих постачальників, які постачають щонайменше всі деталі, що й постачальник S2.
SELECT S#
FROM SP
GROUP BY S#
HAVING SET (P#) CONTAINS
(SELECT P#
FROM SP
WHERE S#=«S2»)
Оператор GROUP BY ділить поточну таблицю на такі групи, в яких усередині будь-якої з цих груп усі рядки мають однакові значення в зазначеному стовпці (стовпчиках). Потім діє вираз HAVING, який є спеціальною формою виразу WHERE, але стосується не окремих рядків, а груп: предикат у виразі HAVING завжди посилається на властивості груп, а не рядків, і на основі цього предиката групи або відбираються, або відкидаються. Отже, спочатку таблиця поділяється на такі групи, що кожна містить певне значення S#. Потім по черзі для кожної групи множина всіх значень P# у групі порівнюється з множиною всіх значень P#, яка відповідає постачальнику S2. Коли перше з цих двох множин містить друге як підмножину (включаючи випадок рівності), дістаємо відповідне значення S#. Тепер, як бачимо, потреба в позначці SPX відпала і ключове слово UNIQUE більше не потрібне.
