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

4. Запити на об’єднання

Деколи буває потрібно об’єднати результати кількох операторів SELECT в одну таблицю. Це забезпечується операцією UNION.

Приклад 1. Вивести список всіх товарів, ціна яких більше 200 грн. або тих, яких було замовлено більше ніж на 3000 грн. за один раз.

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

SELECT Kod_Vyrobn, Kod_Tovaru

FROM Tovary

WHERE Cina > 200

Kod_Vyrobn

Kod_Tovaru

101

204

101

204

4100

2844

4101

2845

Другу частину запиту можна сформулювати так: вивести список всіх товарів, яких було замовлено більш ніж на 3000 грн. за один раз.

SELECT DISTINCT Vyrobnyk, Tovar

FROM Zamovlennia

WHERE Vartist > 3000

Vyrobnyk

Tovar

204

204

355

2844

2845

7755

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

SELECT Kod_Vyrobn, Kod_Tovaru

FROM Tovary

WHERE Cina > 200

UNION

SELECT DISTINCT Vyrobnyk, Tovar

FROM Zamovlennia

WHERE Vartist > 3000

101

204

101

204

355

4100

2844

4101

2845

7755

Зауваження:

Імена стовпчиків в двох запитах, які об’єднуються за допомогою операції UNION не обов’язково повинні співпадати:

1-ша таблиця: Kod_Vyrobnyka, Kod_Tovaru

2-га таблиця: Vyrobnyk, Tovar.

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

Щоб таблиці результатів запитів можна було об’єднати за допомогою операції UNION треба, щоб виконувалися такі умови:

  1. результуючі таблиці повинні мати однакову кількість стовпчиків;

  2. тип даних кожного стовпчика першої таблиці повинен точно співпадати із типом даних відповідного стовпчика другої таблиці. Якщо це не так, то необхідно виконати приведення типу за допомогою функції CAST;

  3. жодна із двох таблиць не може бути відсортована за допомогою секції ORDER BY, але об’єднані результати запиту можна буде відсортувати.

Стандарт SQL1 накладає такі обмеження: ті запити, які допускається використовувати як операнди об’єднання UNION в SELECT повинні мати лише імена стовпчиків або вказівку виводити всі стовпчики і забороняється використовувати вираз.

Дуже багато СУБД забороняють використовувати в таких операторах SELECT секції GROUP BY та HAVING, крім того, є такі СУБД (SQL Server), які взагалі не підтримують самої операції UNION.

При об’єднанні існує велика ймовірність того, що таблиці які об’єднуються будуть мати рядки, що повторюються.

За замовчуванням операція UNION відкидає рядки дублікати, тому в результуючій таблиці буде лише по одному рядку із цих товарів (попередній приклад).

Якщо в результуючій таблиці необхідно залишити всі рядки-дублікати, то потрібно виконати операцію UNION ALL.

Секцію ORDER BY не можна використовувати в жодній вибірці, яка входить до складу запиту на об’єднання, але результат об’єднання можна відсортувати за допомогою секції ORDER BY, яка вказується тільки після останнього оператора SELECT, причому в секції ORDER BY потрібно вказувати номери стовпчиків.

Приклад 2.

SELECT *

FROM A

UNION

(SELECT *

FROM B

UNION

SELECT *

FROM C)

Порядок виконання операції UNION, якщо вони однаково опрацьовують рядки-дублікати, немає значення:

(A UNION B) UNION C 

A UNION (B UNION C) 

(A UNION C) UNION B

Якщо в одному виразі комбінуються операції UNION та UNION ALL, то порядок виконання цих операцій має суттєве значення.

Приклад 3. A UNION ALL B UNION C

1) A UNION ALL (B UNION C)

Результат: 6 рядків з В і С плюс 4 рядки з А і (В і С), загалом дорівнює 10 рядків.

2) (A UNION ALL B) UNION C

Результат: 7 рядків.

Виконання запитів на об’єднання здійснюється за наступною схемою:

  1. Якщо це запит на об’єднання кількох інструкцій SELECT, то для кожної з цих інструкцій виконати дії 27 і отримати окрему таблицю результатів.

  2. Сформувати декартовий добуток таблиць вказаних у секції FROM.

  3. Якщо є секції WHERE, то застосувати умову відбору до кожного рядка таблиці результатів декартового добутку. Залишаться лише ті рядки, для яких умова має значення TRUE, а рядки, для яких умова має значення FALSE або NULL, відкидаються. Якщо в секції WHERE міститься підлеглий запит, то він виконується для кожного рядка, що перевіряється в даний момент.

  4. Якщо є секція GROUP BY, то розділити рядки, які залишилися, на групи так, щоб в кожній групі рядки мали однакові значення в усіх стовпчиках групування.

  5. Якщо є секція HAVING, то застосувати задану в ній умову відбору до кожної групи. Залишаться лише ті групи, для яких умова має значення TRUE. Якщо ж умова має значення FALSE або NULL, то така група відкидається. Якщо секція HAVING містить підлеглий запит, то він виконується для кожної групи, що перевіряється в даний момент.

  6. Обчислити значення кожного елемента списку SELECT і створити один рядок таблиці результатів запиту. Якщо є групування, то кожна група буде представлена одним результуючим рядком. Якщо групування немає, то результуючий рядок утвориться в результаті одного рядка в результаті третьої дії.

  7. Якщо є слово DISTINCT, то вилучити всі рядки-дублікати.

  8. Якщо це запит на об’єднання, то об’єднати результати окремих інструкцій SELECT в одну таблицю. При цьому, якщо використовується UNION то відкидаються рядки-дублікати, якщо ж використовується операція UNION ALL, то рядки-дублікати залишаються.

  9. Якщо є секція ORDER BY, то відсортувати результати запиту.

Контрольні питання:

  1. Що таке псевдонім таблиці, для чого його використовують?

  2. Для чого створюють з’єднання таблиці з собою?

  3. Що називається з’єднанням таблиць?

  4. В якій секції вказується з’єднання?

  5. Який тип відношення створюється при зв’язуванні первинного ключа із зовнішнім ключем?

  6. Що таке - з’єднання?

  7. Що створюється операцією UNION?

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