Величезна безліч багатотабличних запитів заснована на стосунках предок/потомок, але|та| в SQL| не потрібний, щоб|аби| зв'язані стовпці були парою "зовнішній ключ|джерело| – первинний ключ|джерело|". Будь-які два стовпці з|із| двох таблиць можуть бути зв'язаними стовпцями, якщо лише|тільки| вони мають порівнянних типів|типи| даних.
Об'єднання таблиць по нерівності. Термін "об'єднання" застосовується до будь-якого запиту, який об'єднує дані з|із| двох таблиць бази даних шляхом порівняння значень в двох стовпцях цих таблиць. Найпоширенішими є об'єднання, створені на основі рівності зв'язаних стовпців (об'єднання по рівності). Крім того, SQL| дозволяє об'єднувати таблиці за допомогою інших операцій порівняння. Наприклад, отримати|одержувати| всі коди дисциплін яким студентом з|із| кодом 1 була отримана|одержувати| оцінка більша, ніж по дисципліні з|із| кодом 1.
SELECT| Marks1|.SubjNo
FROM| Marks| AS| Marks1|, Marks| AS| Marks2|
WHERE| Marks1|.Mark > Marks2|.Mark
AND| Marks2|.SubjNo = 1 AND| Marks1|.StNo = 1
Слід визнати, що даний приклад|зразок| має декілька штучний характер і є ілюстрацією того, чому настільки|так| мало поширені об'єднання по нерівності. Проте|однак| вони можуть виявитися корисними в додатках|застосуваннях|, призначених для підтримки ухвалення рішень, і в інших застосуваннях, що досліджують складніші взаємозв'язки в базі даних.
Повні|цілковиті| імена стовпців. У учбовій базі даних є|наявний| декілька випадків, коли дві таблиці містять|утримують| стовпці з|із| однаковими іменами. Наприклад, стовпці з|із| ім'ям GrNo| є|наявний| в таблицях Groups| і Students|.
Щоб|аби| виключити різночитання, при вказівці стовпців необхідно використовувати їх повні|цілковиті| імена. Повне|цілковите| ім'я стовпця містить|утримує| ім'я стовпця і ім'я таблиці, в якій він знаходиться|перебуває|. Повні|цілковиті| імена двох стовпців GrNo| в учбовій базі даних будуть такими:
Groups|.GrNo Students|.GrNo
У операторові SELECT| замість простих імен стовпців завжди можна використовувати повні|цілковиті| імена. Таблиця, задана в повному|цілковитому| імені стовпця, повинна, звичайно, відповідати одній з таблиць, заданих в пропозиції|реченні| FROM|.
Читання всіх стовпців. Як вже говорилося|мовилося| раніше, оператор SELECT| * використовується для читання всіх стовпців таблиці, вказаної в пропозиції|реченні| FROM|. У багатотабличному запиті зірочка означає вибір всіх стовпців зі|із| всіх таблиць, вказаних в пропозиції|реченні| FROM|.
Самооб'едіненія. Деякі багатотабличні запити використовують стосунки, що існують|наявний| усередині|всередині| однієї з таблиць. Передбачимо|припускатимемо|, наприклад, що потрібно вивести список імен всіх викладачів і їх керівників. Кожному викладачеві відповідає один рядок в таблиці Teachers|, а стовпець ChiefNo| містить|утримує| ідентифікатор викладача, що є керівником. Стовпцю ChiefNo| слід було б бути зовнішнім ключем|джерелом| для таблиці, в якій зберігаються дані про керівників. І він ним, фактично, є|з'являється| – це зовнішній ключ|джерело| для самої таблиці Teachers|.
Для об'єднання таблиці з|із| самою собою в SQL| застосовується саме такий підхід: використання "віртуальної копії". Замість того щоб|аби| насправді зробити копію таблиці, SQL| дозволяє вам послатися на неї, використовуючи інше ім'я, яке називається псевдонімом таблиці.
Наприклад: вивести список всіх викладачів і їх керівників.
SELECT| Teachers|. TName|, Chiefs|.TName
FROM| Teachers|, Teachers| Chiefs|
WHERE| Teachers|. ChiefNo| = Chiefs|.TNo
Псевдоніми таблиць. Як вже було сказано в попередньому параграфі, псевдоніми таблиць необхідні в запитах, що включають самообъединения|. Проте|однак| псевдонім можна використовувати в будь-якому запиті (наприклад, якщо запит стосується таблиці іншого користувача або якщо ім'я таблиці дуже довге і використовувати його в повних|цілковитих| іменах стовпців утомливо|стомливий|).
Зовнішнє об'єднання таблиць. Операція об'єднання в SQL| сполучає|з'єднує| інформацію з|із| двох таблиць, формуючи пари зв'язаних рядків з|із| цих двох таблиць. Об'єднану|з'єднану| таблицю утворюють пари тих рядків з|із| різних таблиць, в|біля| яких в зв'язаних стовпцях містяться|утримуються| однакові значення. Якщо рядок однієї з таблиць не має пари, то такий вигляд|вид| об'єднання, званий внутрішнім об'єднанням, може привести до неочікуваних|несподіваних| результатів (втраті деяких даних в результаті|внаслідок| запиту). Для створення|створіння| об'єднань таблиць, що мають неоднакові значення в стовпцях, на основі яких здійснюється зв'язок, застосовують зовнішнє об'єднання таблиць найбільш повно представлене|уявляти| в стандарті SQL2|.
Література:
1. Джеймс Р. Грофф, Пів Н. Вайнберг. SQL|: повне|цілковите| керівництво: пер.с англ. –К|.: Видавнича група BHV|, 2000.–608с. Стор. 31–39,69–166.
1.2 Об'єднання і стандарт SQL2|
У стандарті SQL2| був визначений абсолютно|цілком| новий метод підтримки зовнішніх об'єднань, який не спирався|обпирався| ні на одну популярну СУБД. У специфікації стандарту SQL2| підтримка зовнішніх об'єднань здійснювалася в пропозиції|реченні| FROM| з|із| ретельно розробленим синтаксисом, що дозволяв користувачеві точно визначити, як вихідні|початкові| таблиці мають бути об'єднані|з'єднані| в запиті. Розширена пропозиція|речення| FROM| підтримує також операцію UNION| над таблицями і допускає складні комбінації запитів на об'єднання операторів SELECT| і об'єднань таблиць.
1.2.1 Внутрішні об'єднання в стандарті SQL2|
Дві об'єднувані таблиці з'єднуються явно за допомогою операції JOIN|, а умова пошуку, що описує об'єднання, знаходиться|перебуває| тепер в пропозиції|реченні| ON| усередині|всередині| пропозиції|речення| FROM| В умові пошуку, наступній|слідуючій| за ключовим|джерельним| словом ON|, можуть бути задані будь-які критерії порівняння рядків двох об'єднуваних таблиць.
Наприклад: вивести список прізвищ студентів, і назви груп, в яких вони вчаться|.
SELECT| StName|, GrName|
FROM| Students| INNER| JOIN| Groups|
ON| Students|.GrNo = Groups|.GrNo
(У цих простих двохтабличних об'єднаннях весь вміст пропозиції|речення| WHERE| просто перейшов в пропозицію|речення| ON|, і пропозиція|речення| ON| не додає|добавляє| нічого нового в мову|язик| SQL|.
Стандарт SQL2| допускає ще один варіант запиту на просте внутрішнє об'єднання таблиць Students| і Groups|. Оскільки|тому що| зв'язані стовпці цих таблиць мають однакові імена і порівнюються на предмет рівності (що робиться|чинить| досить часто), то можна використовувати альтернативну форму пропозиції|речення| ON|, в якій задається список імен зв'язаних стовпців:
Об'єднання двох таблиць, в якому зв'язані стовпці мають ідентичні імена, називається природним об'єднанням, оскільки|тому що| звичайно|звичний| це дійсно "найприродніший" спосіб об'єднання двох таблиць. Запит на вибірку пар прізвище студента/название групи, в якій він вчитися, можна виразити|виказувати| як природне об'єднання таким чином:
SELECT| StName|, GrName|
FROM| Students| NATURAL| INNER| JOIN| Groups|
1.2.2 Зовнішні об'єднання в стандарті SQL2|
Стандарт SQL2| забезпечує повну|цілковиту| підтримку зовнішніх об'єднань, розширюючи мовні конструкції, використовувані для внутрішніх об'єднань. Наприклад, для побудови|шикування| таблиці підлеглості викладачів можна застосувати наступний|слідуючий| запит:
Результат такого запиту (дані з|із| Додатка|застосування| А) приведений на мал. 10.1.
Chief.TName
SubOrdinate.TName
NULL
Іванов
Іванов
Петров
Петров
Стрільців
Петров
Сидоров
Сидоров
NULL
Стрільців
NULL
мал. 10.1 Результатом такого запиту на зовнішнє об'єднання.
Таблиця результатів запиту міститиме|утримуватиме| по одному рядку для кожної зв'язаної пари начальник/подчиненный, а також по одному рядку для кожного незв'язаного запису для начальника або підлеглого, розширеною значеннями NULL| в стовпцях іншої таблиці.
Ключове|джерельне| слово OUTER|, так само як і ключове|джерельне| слово INNER|, в стандарті SQL2| не є обов'язковим. Тому попередній запит можна, було б переписати таким чином:
По слову FULL| СУБД сама визначає, що запрошується зовнішнє об'єднання.
Цілком природно, що в стандарті SQL2| ліве і праве зовнішні об'єднання позначаються|значать| словами LEFT| і RIGHT| замість слова FULL|. Ось|от| варіант того ж запиту, що визначає ліве зовнішнє об'єднання:
В результаті|внаслідок| такого запиту (дані з|із| Додатка|застосування| А.) буде отримано|одержувати| наступне|таке| відношення|ставлення| (мал. 10.2).
Chief.TName
SubOrdinate.TName
Іванов
Петров
Петров
Стрільців
Петров
Сидоров
Сидоров
NULL
Стрільців
NULL
мал. 10.2 Результатом такого запиту на зовнішнє об'єднання
1.2.3 Перехресні об'єднання і запити на об'єднання в SQL2|
Розширена пропозиція|речення| FROM| в стандарті SQL2| підтримує також два інших способу з'єднання|сполуки| даних з|із| двох таблиць – декартовий твір|добуток| і запити на об'єднання. Строго|суворий| кажучи, жоден з них не є операцією "об'єднання", але|та| вони підтримуються в стандарті SQL2| за допомогою тих же самих пропозицій|речень|, що і внутрішні і зовнішні об'єднання. Ось|от| запит, що створює декартовий твір|добуток| таблиць Students| і Groups|:
SELECT| *
FROM| Students| CROSS| JOIN| Groups|
1.2.4 Багатотабличні об'єднання в стандарті SQL2|
Одна з крупних переваг розширеної пропозиції|речення| FROM| полягає в тому, що воно дає єдиний стандарт для визначення як внутрішніх і зовнішніх об'єднань, так і творів|добутків| і запитів на об'єднання. Іншим, навіть ще важливішою|поважною| перевагою цієї пропозиції|речення| є те, що воно забезпечує дуже ясну і чітку специфікацію об'єднань три і чотирьох таблиць, а також творів|добутків| і запитів на об'єднання. Для побудови|шикування| цих складних об'єднань будь-які вирази описані раніше, можуть бути поміщені|ув'язнені| в круглі дужки. Результуюче вираження|вираз|, у свою чергу|в свою чергу|, можна використовувати для створення|створіння| інших виразів об'єднання, неначебто|начебто| воно було простим таблицею. Точно так, як і SQL| дозволяє за допомогою круглих дужок комбінувати різні арифметичні операції (+, – * і /) і будувати складні вирази, стандарт SQL2| дає можливість|спроможність| створювати складні вирази для об'єднань.