Здавалка
Главная | Обратная связь

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



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, але можуть бути використані й в інших підзапитах.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.