Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Fondovi-lekcii.doc
Скачиваний:
20
Добавлен:
10.11.2018
Размер:
4.09 Mб
Скачать

3. Запити на вибірку до трьох і більше таблиць

SQL дозволяє з’єднувати дані із трьох і більше таблиць, використовуючи ту саму методику, що і для з’єднання даних із двох таблиць.

Ось приклад з’єднання даних із трьох таблиць:

5). Вивести номер замовлення, прізвище клієнта, який його зробив, назву і ціну замовленого товару, для замовлень вартістю понад 100 грн.

5). SELECT No_Zamovl, Prizv, Nazva, Cina

FROM Zamovlennia, Clients, Tovary

WHERE Client = Kod_Clienta

AND Tovar = Kod_Tovaru

AND Vyrobnyk = Kod_Vyrobnyka

AND Cina >100

Як видно із нарисованої схеми, в цьому запиті використовуються два зовнішні ключі таблиці Zamovlennia: в ній стовпчик Client – це зовнішній ключ для таблиці Clients, він зв’язує кожне замовлення з клієнтом, який його зробив.

Стовпчики (Tovar, Vyrobnyk) – це складений зовнішній ключ для таблиці Tovary, вони зв’язують замовлення із замовленим товаром.

Інші з’єднання таблиць за рівністю

Переважна більшість багатотабличних запитів основана на відношеннях предок/нащадок, але в SQL це зовсім не обов’язково; тобто, не вимагається, щоб зв’язані стовпчики являли собою пару: „зовнішній ключ – первинний ключ” у зв’язку „підлегла – головна таблиці”.

Будь-які два стовпчика із двох таблиць можуть бути зв’язані, якщо вони мають сумісні типи даних.

6). Вивести всі замовлення, отримані в той день, коли на роботу був прийнятий будь-який новий працівник.

6). SELECT Zamovlennia . * , Prizv

FROM Zamovlennia, Pracivnyky

WHERE Data_Otrym = Data_Pryjomu

  • у цьому запиті зв’язаними є стовпчик Data_Otrym таблиці Zamovlennia та стовпчик Data_Pryjomu таблиці Pracivnyky:

Data_Otrym = Data_Pryjomu

Ці стовпчики не входять ні у зовнішній ключ, ні у первинний ключ; та й взагалі, відношення між рядками у цих парах – в достатній мірі дивне: спільне у цих замовленнях і працівниках лише те, що вони з’явилися у фірмі один і той самий день.

Незважаючи на це, СУБД з готовністю сполучає таблиці так, як це визначено в запиті.

Зв’язані стовпчики, подібні до тих, що наведені в нашому прикладі, створюють між таблицями відношення „багато – до – багатьох” (N : M) :може поступити багато замовлень в день прийому на роботу якогось працівника; також – в день отримання якогось замовлення на роботу може бути прийнято декілька працівників.

Відношення „багато – до – багатьох” відрізняється від відношення „один – до – багатьох”, яке створюється коли в якості зв’язаних стовпчиків використовується первинний і зовнішній ключі.

Більш типова ситуація, коли в таблиці Zamovlennia реєструється працівник, який прийняв це замовлення:

Підведемо підсумки:

1) в з’єднанні, створеному за допомогою зв’язування головного (первинного) ключа із зовнішнім ключем завжди існує відношення „один – до – багатьох” (предок/нащадок).

2) в інших з’єднаннях також можуть існувати відношення „один – до – багатьох”, якщо по крайній мірі в одній таблиці зв’язаний стовпчик містить унікальні значення в усіх рядках (якщо в обидвох таблицях зв’язані стовпчики містять в усіх рядках унікальні значення - то в з’єднанні буде відношення „ один – до – одного” ).

3) в загальному випадку в з’єднаннях, створених на основі довільних зв’язаних стовпчиків, існує відношення „багато – до – багатьох”.

Зауважимо, що відмінності цих трьох випадків не впливають на форму запису оператора SELECT, який визначає з’єднання. З’єднання всіх трьох видів записуються одним і тим самим способом: в секції WHERE записується порівняння зв’язаних стовпчиків.

- з’єднання. З’єднання таблиць за нерівністю

 (тета) - з’єднання відношення А по атрибуту Х з відношенням В по атрибуту Y – це результат обчислення виразу.

(A B)

WHERE X Y

де A B – декартовий добуток відношень А і В.

X Y – результат порівняння значень атрибутів Х та Y, який може приймати значення TRUE, FALSE, NULL.

- одна із операцій відношення: =, <>, >, >=, <, <=

Іншими словами, - з’єднання таблиці А по стовпчику Х з таблицею В по стовпчику Y, - це результат вибірки з декартового добутку A B тих типів рядків, для яких умова

X Y

має значення TRUE.

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

7). Вивести дані про працівників (та відповідні філії), які перевищили план продаж по своїй філії.

- фірма має в різних містах свої філії, в кожній встановлено свій план продаж на одного працівника. Потрібно преміювати кращих працівників

7). SELECT Prizv,Misto,(Prodav - Plan_Prod) AS Perev

FROM Pracivnyky,Filii

WHERE Filia = Kod_Filii

AND Prodav > Plan_Prod

В цьому прикладі використовується > - з’єднання таблиць Pracivnyky та Filii – відбираються лише ті рядки, для яких умова Prodav > Plan_Prod

набуває значення TRUE.

Додаткова умова Filia = Kod_Filii

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

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

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