Синтаксис самого простого об'єднання наступний:
SELECT імена_столбцов_табліци_1, імена_столбцов_табліци_2 FROM імя_табліци_1, імя_табліци_2;
Давайте створимо просте об'єднання:
Вийшло не зовсім те, що ми очікували. Таке об'єднання науково називається декартовим твором, коли кожному рядку першої таблиці ставиться у відповідність кожен рядок другої таблиці. Можливо, бувають випадки, коли таке об'єднання корисно, але це явно не наш випадок.
Зверніть увагу на дві речі:
· Якщо в одній з поєднуваних таблиць є рядок з ідентифікатором, якого немає в інший об'єднаній таблиці, то в результуючій таблиці рядки з таким ідентифікатором не буде. У нашому прикладі є користувач Oleg (id = 5), але він не створював теми, тому в результаті запиту його немає.
· При вказівці умови назву стовпця пишеться після назви таблиці, в якій цей стовпець знаходиться (через точку). Це зроблено, щоб уникнути плутанини, адже стовпці в різних таблицях можуть мати однакові назви, і MySQL може не зрозуміти, про які конкретно шпальтах йдеться.
Взагалі, коректний синтаксис об'єднання з умовою виглядає так:
Якщо ім'я стовпця унікально, то назва таблиці можна опустити (як ми робили в прикладі), але робити це не рекомендується.
Як ви розумієте, об'єднання дають можливість вибирати будь-яку інформацію з будь-яких таблиць, причому об'єднуються таблиць може бути і три, і чотири, та й умова для об'єднання може бути не одне.
Тому, якщо нам буде потрібно скласти дещо інший запит - вивести всіх користувачів і теми, які вони створювали, якщо такі є - то нам доведеться скористатися Зовнішнім об'єднанням. що дозволяє виводити всі рядки однієї таблиці і наявні пов'язані з ними рядки з іншої таблиці. Про таких об'єднаннях ми і будемо говорити в наступному уроці.
SQL - Урок 7. Об'єднання таблиць (зовнішнє об'єднання)
Отже, в продовження минулого уроку, нам треба вивести всіх користувачів і теми, які вони створювали, якщо такі є. Якщо ми скористаємося внутрішнім об'єднанням, розглянутим на минулому уроці, то отримаємо в підсумку наступне:
Тобто в результуючій таблиці є тільки ті користувачі, які створювали теми. А нам треба, щоб виводилися всі імена. Для цього ми трохи змінимо запит:
SELECT users.name, topics.topic_name
FROM users LEFT OUTER JOIN topics
І отримаємо бажаний результат - всі користувачі і теми, ними створені. Якщо користувач не створював тему, але у відповідному стовпці стоїть значення NULL.
Отже, ми додали в наш запит ключове слово - LEFT OUTER JOIN. вказавши тим самим, що з таблиці зліва треба взяти все рядки, і поміняли ключове слово WHERE на ON. Крім ключового слова LEFT OUTER JOIN може бути використано ключове слово RIGHT OUTER JOIN. Тоді будуть вибиратися всі рядки з правої таблиці і наявні пов'язані з ними з лівої таблиці. І нарешті, можливо повне зовнішнє об'єднання, яке отримає всі рядки з обох таблиць і зв'яже між собою ті, які можуть бути пов'язані. Ключове слово для повного зовнішнього об'єднання - FULL OUTER JOIN.
Давайте змінимо в нашому запиті лівосторонній об'єднання на правосторонній:
Як бачите, тепер у нас є всі теми (всі рядки з правої таблиці), а ось користувачі тільки ті, які теми створювали (тобто з лівої таблиці вибираються тільки ті рядки, які пов'язані з правого таблицею).
На жаль повне об'єднання СУБД MySQL не підтримує.
Підіб'ємо підсумок цього короткого уроку. Синтаксис для зовнішнього об'єднання наступний:
SELECT імя_табліци_1.імя_столбца, імя_табліци_2.імя_столбца
FROM імя_табліци_1 ТИП ОБ'ЄДНАННЯ імя_табліци_2
де ТИП ОБ'ЄДНАННЯ - або LEFT OUTER JOIN, або RIGHT OUTER JOIN