Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БД SQL(засоби ман_пулювання даними.Трив_альн_ запити).docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
62 Кб
Скачать
☆

7. Dмl: Запити з використанням кількох таблиць

7.1. Засоби одночасної роботи з множиною таблиць

SQL має чудовий механізм для одночасної чи послідовної обробки даних з кількох взаємозалежних таблиць. У ньому реалізовані можливості "з'єднувати" чи "поєднувати" кілька таблиць і так називані "вкладені підзапиты".

Дуже часто виникає ситуація, коли вибірку даних треба робити з відношення, що є результатом злиття (join) двох інших відносин. Для цього СУБД попередньо повинна виконати злиття таблиць, а тільки потім зробити вибірку з отриманого відношення. Для виконання операції такого роду в операторі SELECT після ключового слова FROM указується список таблиць, по яких провадиться пошук даних. Після ключового слова WHERE вказується умова, по якому виробляється злиття.

Наприклад, щоб одержати перелік постачальників продуктів, необхідних для готування Сирників, можливий запит

SELECT  Продукт, Ціна, Назва, Статус

FROM    Продукти, Склад, Блюда, Постачання, Постачальники

WHERE   Продукти.ПР = Склад.ПР

AND     Склад.БЛ = Блюда.БЛ

AND     Постачання.ПР = Склад.ПР

AND     Постачання.ПС = Постачальники.ПС

AND     Блюдо = 'Сирники'

AND     Ціна IS NOT NULL;

Він отриманий у такий спосіб: СУБД послідовно формує рядки декартова добутку таблиць, перерахованих у фразі FROM, перевіряє, чи задовольняють дані сформованого рядка умовам фрази WHERE, і якщо задовольняють, те включає у відповідь на запит ті її поля, що перераховані у фразі SELECT.

Варто підкреслити, що в SELECT і WHERE (щоб уникнути двозначності) посилання на всі (*) чи окремі стовпці можуть (а іноді і повинні) уточнюватися ім'ям відповідної таблиці, наприклад, Постачання.ПС, Постачальники.ПС, Меню.*, Склад.БЛ, Блюда.* і т.п.

Очевидно, що за допомогою з'єднання нескладно сформувати запит на обробку даних з кількох таблиць. Крім того, у такий запит можна включити будь-як частини речення SELECT. Отже, з'єднання дозволяють обробляти множину взаємозалежних таблиць як єдину таблицю, у якій перемішана інформація про багатьох типах сутностей.

Крім механізму з'єднань, у SQL є механізм вкладених підзапитов, що дозволяє об'єднати кілька простих запитів у єдиному реченні SELECT. Іншими словами, вкладений підзапит - це вже знайомий нам підзапит (з невеликими обмеженнями), що вкладений у WHERE фразу іншого вкладеного підзапиту чи WHERE фразу основного запиту.

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

SELECT Продукт, Ціна, Назва, Статус

    FROM Продукти, Склад, Блюда, Постачання, Постачальники

    WHERE Продукти.ПР = Склад.ПР

         AND Склад.БЛ = Блюда.БЛ

         AND Постачання.ПР = Склад.ПР

         AND Постачання.ПС = Постачальники.ПС

      AND Блюдо = 'Сирники'

      AND Ціна =

( SELECT MIN(Ціна)

      FROM Постачання X

      WHERE X.ПР = Постачання.ПР );

Тут за допомогою підзапиту, розміщеного в трьох останніх рядках запиту, описується процес визначення мінімальної ціни кожного продукту для Сирників і пошук постачальника, що пропонує цей продукт за таку ціну. Псевдонім X для імені таблиці Постачання вводиться для запобігання операцій з однойменними таблицями, докладніше – далі.

Приклад. Використання предиката EXIST. Одержати список постачальників, що поставляють деталь номер 2:

SELECT *

  FROM P

  WHERE EXIST

    (SELECT *

        FROM PD

        WHERE

            PD.PNUM = P.PNUM AND

            PD.DNUM = 2);

Результат виконання запиту буде еквівалентний результату наступної послідовності дій:

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

  2. У результат запиту включити тільки ті рядки з таблиці постачальників, для яких вкладений підзапит повернув непорожню множину рядків.

Цей вкладений підзапит містить параметр (зовнішнє посилання), переданий з основного запиту - номер постачальника P.PNUM. Такі підзапиты називаються коррельованими(correlated). Зовнішнє посилання може приймати різні значення для кожної рядка-кандидата, оцінюваного за допомогою підзапиту, тому підзапит повинен виконуватися заново для кожного рядка, що відбирається в основному запиті. Такі підзапити характерні для предиката EXIST, але можуть бути використані й в інших підзапитах.