П`ятниця, 29.11.2024, 02:30
Головна Реєстрація RSS
Вітаю Вас, Гість
Меню сайту
Реклама
Категорії розділу
Архітектура ПК [1]
Архітектура та експлуатація персонального комп'ютера
СПЗ [12]
Системне програмне забезпечення та операційні системи
Комп'ютерна графіка [25]
КСМ [28]
Комп'ютерні системи та мережі
ІСІТО [1]
Інформаційні системи і технології обліку
Бухгалтерський облік [0]
АМтП [10]
Алгоритмічні мови та програмування
Копирайт рерайт [1]
СУБД [18]
Системи управління базами даних
ОКТ практикум [2]
Основи комп'ютерних технологій практикум
Інформатика (практ) [1]
інформатика практикум, практичні заняття
ТіОБВ [61]
Технологія і організація будівельного виробництва
ОСАПр [6]
Основи систем автоматизованого проектування, AutoCAD, ArchiCAD
ТіОБВ (заочники) [1]
Пошук
Статистика


Яндекс.Метрика
Онлайн всього: 3
Гостей: 3
Користувачів: 0
Форма входу
Календар
«  Вересень 2013  »
ПнВтСрЧтПтСбНд
      1
2345678
9101112131415
16171819202122
23242526272829
30
Головна » 2013 » Вересень » 5 » SQL урок 11 Розширене об'єднання таблиць (OUTER JOIN)
15:56
SQL урок 11 Розширене об'єднання таблиць (OUTER JOIN)

У попередньому розділі ми розглянули найпростіші способи об'єднання таблиць - за допомогою пропозицій WHERE і INNER JOIN. Ці об'єднання називаються внутрішніми об'єднаннями або об'єднаннями з еквівалентності. Однак SQL має у своєму арсеналі набагато більше можливостей об'єднати таблиці, а саме існують також і інші види об'єднань: зовнішні об'єднання, природні об'єднання і самооб'єднання. Але для початку розглянемо, яким чином ми можемо привласнювати таблицями псевдоніми, оскільки надалі, ми будемо змушені використовувати повні назви полів (Табліця.Поле), якими без скорочень буде дуже важко оперувати через їх великої довжини.

1. Використання псевдонімів таблиць

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

SELECT Seller_name, SUM(Amount) AS Sum1
FROM Sellers AS S, Sumproduct AS SP
WHERE S.City = SP.City
GROUP BY Seller_name

Ми відобразили загальну суму реалізованого товару по кожному продавцеві. У нашому SQL запиті ми використовували такі псевдоніми: для розрахункового поля SUM (Amount) псевдонім Sum1 для таблиці Sellers псевдонім S і для Sumproduct псевдонім SP. Зауважимо, що псевдоніми таблиць можуть бути застосовані і в інших пропозиціях, як ORDER BY, GROUP BY та інших.

2. Самооб'єднання

Розглянемо приклад. Припустимо, нам потрібно дізнатися адресу продавців, які торгують в тій же країні, що і John Smith. Для цього створимо такий запит:

SELECT City, Country, Seller_name
FROM Sellers
WHERE Country = (SELECT Country FROM Sellers WHERE Seller_name = 'John Smith')

Також, це завдання ми можемо вирішити і через самооб'єднання, прописавши наступний код :

SELECT S1.Address, S1.City, S1.Country, S1.Seller_name
FROM Sellers AS S1, Sellers AS S2
WHERE S1.Country = S2.Country AND S2.Seller_name = 'John Smith'

Для вирішення цього завдання використовувалися псевдоніми. Перший раз для таблиці Sellers привласнили псевдонім S1, другий раз - псевдонім S2. Після цього ці псевдоніми можна застосовувати в якості імен таблиць. У операторі WHERE ми з назвою кожного поля додаємо префікс S1, для того, щоб СУБД розуміла поля якої таблиці потрібно виводити (оскільки ми з однієї таблиці зробили дві віртуальні). Конструкція WHERE спочатку об'єднує таблиці, а потім фільтрує дані другої таблиці по полю Seller_name, щоб повернути тільки необхідні значення.

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

3. Звичайне об'єднання

Звичайне об'єднання - це об'єднання, в якому ви вибираєте тільки ті стовпці, які не повторюються. Зазвичай це робиться за допомогою запису (SELECT *) для однієї таблиці і зазначенням переліку полів - для решти таблиць. наприклад:

SELECT SP.*, S.Country
FROM Sumproduct AS SP, Sellers AS S
WHERE SP.City = S.City

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

4. Зовнішнє об'єднання (OUTER JOIN)

Зазвичай при об'єднанні пов'язують рядки однієї таблиці з відповідними рядками в інший, проте в деяких випадках може знадобитися включення в результат рядків, які не мають пов'язаних рядків в іншій таблиці (тобто вибираються абсолютно всі рядки з однієї таблиці і додаються тільки пов'язані рядки з іншої) . Об'єднання такого типу називається зовнішнім. Для цього використовуються ключові слова OUTER JOIN ... ON ... з приставкою LEFT або RIGHT. Розглянемо приклад, попередньо додавши в таблицю Sellers нового продавця - Semuel Piter, який не має продажів:

SELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers LEFT OUTER JOIN Sumproduct ON Sellers.City=Sumproduct.City
GROUP BY Seller_name

Даним запитом ми витягли перелік всіх продавців у базі і підрахували для них загальна кількість проданого товару за всі місяці. Бачимо що за новим продавцеві Semuel Piter відсутні продажу. Якби ми використовували внутрішнє об'єднання, то нового продавця ми б не побачили, оскільки він не має записів в таблиці Sumproduct. Ми можемо змінювати напрямок об'єднання не тільки прописуючи LEFT або RIGHT, а й просто міняючи порядок таблиць (тобто два записи будуть давати однаковий результат: Sellers LEFT OUTER JOIN Sumproduct та Sumproduct RIGHT OUTER JOIN Sellers).

Також деякі СУБД дозволяють здійснювати зовнішнє об'єднання за спрощеною запису, використовуючи знаки * = і = *, що відповідає LEFT OUTER JOIN і RIGHT OUTER JOIN відповідно. Таким чином попередній запит можна було б переписати

SELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers, Sumproduct
WHERE Sellers.City *= Sumproduct.City

На жаль Access не підтримує скорочений запис для зовнішнього об'єднання.

5. Повн зовнішнє об'єднання (FULL OUTER JOIN)

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

SELECT Seller_name, Product
FROM Sellers FULL OUTER JOIN Sumproduct ON Sellers.City=Sumproduct.City

Знову ж, повне зовнішнє об'єднання не підтримують такі СУБД: Access, MySQL, SQL Server і Sybase. Як обійти цю несправедливість, ми розглянемо в наступному розділі.

Категорія: СУБД | Переглядів: 1261 | Додав: Gryzley | Рейтинг: 0.0/0
Всього коментарів: 0
Ім`я *:
Email *:
Код *: