Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
R_2-10.doc
Скачиваний:
5
Добавлен:
13.11.2019
Размер:
800 Кб
Скачать
☆

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 = ab = (a1, …, bm+n).

Обмеження відношень, тобто вибір (SELECTION), являє собою оператор для побудови підмножини відношення, тобто підмножини кортежів усередині відношення, які відповідають певному предикату (логічній умові).

Проекція відношень являє собою оператор для побудови «вертикальної» підмножини відношення, тобто підмножини, одержуваної через вибір одних та виключення інших атрибутів.

При з’єднанні двох відношень за певною логічною умовою утворюється результативне відношення, кортежі якого є конкатенацією кортежів першого та другого відношень і відповідають цій умові.

Поділ відношень розглядається як операція між бінарним відношенням (ділимим), унаслідок якої одержуємо унарне відношення (частку).

Операція перейменування продукує відношення, набір кортежів котрого збігається з набором кортежів операнда, але імена атрибутів змінені.

Операція присвоєння дає змогу зберегти результат обчислення реляційного виразу в існуючому відношенні бази даних.

9.1.10. Структурована мова запитів (sql)

Якщо після створення запиту виконати команду: Вид/ Режим SQL, то на екран буде виведено невелику програму мовою SQL. Оскільки приклади, які виконують користувачі, є невеликими, то можна спробувати розібратися в цих програмах.

Початкова версія мови SQL (Structured English Query Lan­guage) базувалася на раніше розробленій мові 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 більше не потрібне.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]