В цьому практичному уроці ми дізнаємось про різні варіанти об’єднання даних із двох (чи більше) таблиць у запиті SELECT
при роботі з MySQL, а саме: INNER JOIN, LEFT JOIN, RIGHT JOIN, SELF JOIN та CROSS JOIN.
Слово “Join” перекладається як «приєднувати, зв’язувати» тощо. Саме таке завдання цей оператор і виконує при роботі з базами даних MySQL: бере дані з кількох таблиць і об’єднує в один вихідний результат.
Приєднання відбувається за допомогою спільних для кількох таблиць стовпців. Ці стовпці називаються стовпцями зовнішнього ключа (Foreign Key). Приєднання корисне, коли інформація розкидана по різним таблицям і її потрібно зібрати докупи. Наприклад, у вас є таблиця users
з даними клієнтів, а в іншій таблиці orders
ви зберігаєте дані по замовленням клієнтів. Об’єднавши ці дві таблиці, ви будете бачити ширшу картину: і дані клієнта, і деталі замовлень цього клієнта в одному місці.
Об’єднання з допомогою оператора JOIN
— це метод зв’язування даних між однією (самооб’єднання – self-join) або кількома таблицями на основі значень спільного стовпця між таблицями. Це дозволяє отримувати дані за один SQL-запит і без створення тимчасових таблиць.
Використовуючи JOIN, можна об’єднувати як дві таблиці, так і набагато більше.
Оператор приєднання використовується в операторі SELECT
, який йде після запиту FROM
.
Після ключового слова ON
вказується умова з’єднання. Ця умова встановлює, як дві (чи більше) таблиць будуть порівнюватись.
Якщо об’єднувати таблиці через кому, то не можна використовувати конструкції ON
та USING
, така умова може бути задана тільки в конструкції WHERE
.
В MySQL використовуються наступні типи приєднань:
INNER JOIN
)LEFT JOIN
)RIGHT JOIN
)CROSS JOIN
)
Для прикладу, розглянемо варіант, коли у вас є 2 таблиці: users
та orders
. Спільними для двох таблиць є стовпець user_id
. Нижче розглянемо на прикладах використання різних типів приєднання.
INNER JOIN
зіставляє кожен рядок в одній таблиці з кожним рядком в інших таблицях і дозволяє видобувати рядки, які містять схожі стовпці обох таблиць. Якщо значення з обох рядків задовольняють умову об’єднання, INNER JOIN
створює новий рядок, стовпець якого містить усі стовпці з обох таблиць. Іншими словами, результатом будуть лише відповідні рядки з обох таблиць.
Якщо в умові об’єднання використовується оператор рівності (=
), а назви стовпців в обох таблицях, що використовуються для зіставлення, однакові, замість умови ON
можна використати умову USING
. Ось базовий синтаксис внутрішнього JOIN, який об’єднує наші дві таблиці:
SELECT order_id FROM orders INNER JOIN users ON {умова};
Деталі запиту:
SELECT
(в даному випадку order_id
– номер замовлення)FROM
(orders
).INNER JOIN
(users
).ON
. Умова з’єднання визначає правило відповідності рядків між основною таблицею та іншою таблицею (пошук спільних даних). Ця умова відома як предикат об’єднання. В даному прикладі ми використовуємо спільне поле user_id
– ідентифікатор клієнта.
Оскільки обидві таблиці використовують той самий стовпець (user_id
), ви можете використати конструкцію USING
замість ON
:
SELECT * FROM orders INNER JOIN users USING(user_id);
Результатом буде загальна таблиця з даними з двох таблиць. Щось типу цього:
+---------+----------+-----------+-------------+ | user_id | order_id | firstname | lastname | +---------+----------+-----------+-------------+ | 2 | 1 | Petro | Shevchenko | | 1 | 2 | Ivan | Goncharenko | | 2 | 3 | Petro | Shevchenko | | 3 | 4 | Stepan | Melnik | +---------+----------+-----------+-------------+ 4 rows in set (0.00 sec)
LEFT JOIN
дозволяє запитувати дані з двох або більше таблиць.
Подібно до внутрішнього об’єднання, для лівого об’єднання також потрібен предикат з’єднання (умова). Під час об’єднання двох таблиць за допомогою LEFT JOIN
використовується поняття лівої та правої таблиць. В даному прикладі users
— ліва (перша) таблиця, а orders
— права таблиця. При LEFT JOIN
дані відбираються, починаючи з лівої таблиці.
Кожен рядок лівої таблиці порівнюється з кожним рядком правої таблиці.
Якщо значення в двох рядках задовольняють умову об’єднання, LEFT JOIN
створює новий рядок, стовпці якого містять усі стовпці рядків обох таблиць, і включає його у набір результатів.
Якщо значення в двох рядках не збігаються, LEFT JOIN
все одно створює новий рядок, стовпці якого містять стовпці рядка в лівій таблиці та NULL
для стовпців рядка в правій таблиці.
Іншими словами, ліве об’єднання вибирає всі дані з лівої таблиці незалежно від того, чи є відповідні рядки в правій таблиці чи ні. Якщо відповідних рядків із правої таблиці не знайдено, ліве об’єднання використовує NULL
для стовпців рядка з правої таблиці в наборі результатів.
Ось більш складний синтаксис з використанням LEFT JOIN, який об’єднує наші дві таблиці:
SELECT orders.order_id, orders.created_at, users.lastname FROM users LEFT JOIN orders ON {умова} WHERE {умова};
Деталі запиту:
orders.order_id
“.USING
, якщо стовпець, який використовується для зіставлення в обох таблицях, однаковий.LEFT JOIN
дуже корисний, коли ви хочете знайти рядки в таблиці, які не мають відповідного рядка в іншій таблиці.ON
ми можемо використовувати більш складні умови, наприклад, для фільтрації та/або сортування результатів
Щоб скоротити код запиту, ми можемо попередній приклад записати з використанням псевдонімів (alias) таблиць, наприклад так:
SELECT o.order_id, o.created_at, u.lastname FROM orders AS o LEFT JOIN users AS u ON o.user_id = u.user_id WHERE u.firstname = 'Ivan';
Запис правого об’єднання подібний до запису лівого об’єднання, за винятком того, що обробка таблиць зворотна – спочатку дані вибираються з правої таблиці і порівнюються з лівою таблицею. Якщо рядок із правої таблиці не має відповідних рядків в лівій таблиці, стовпець лівої таблиці матиме значення NULL
у кінцевому наборі результатів.
Ось приклад запиту з використанням RIGHT JOIN, який об’єднує наші дві таблиці:
SELECT o.order_id, o.created_at, u.lastname FROM users AS u RIGHT JOIN orders AS o ON o.user_id = u.user_id;
Деталі запиту:
users
— це ліва таблиця, а orders
— права таблицяRIGHT JOIN
і LEFT JOIN
функціонально еквівалентні, і вони можуть замінювати одне одного, якщо змінювати порядок таблиць{умова}
використовує оператор рівності (=
), а об’єднані стовпці обох таблиць мають однакові назви, ви також можете використовувати синтаксис USING(назва стовпця)
замість ON
RIGHT OUTER JOIN
є синонімом RIGHT JOIN
. Тому ви можете використовувати їх як взаємозамінніWHERE
з оператором IS NULL
Оператор Self JOIN — це оператор в MySQL, який об’єднує або перетинає таблицю в базі даних із самою собою. По суті, функція JOIN
об’єднує дві або більше таблиць у SQL, але тут Self Join — це звичайне об’єднання, яке дозволяє об’єднувати записи в одній таблиці на основі певної умови.
Самооб’єднання дозволяє приєднати таблицю до самої себе. Оскільки MySQL не має спеціального синтаксису самооб’єднання, вам потрібно виконати Self Join за допомогою звичайного об’єднання, такого як LEFT
або INNER JOIN
.
Оскільки ви посилаєтеся на ту саму таблицю в одному запиті, вам потрібно використовувати псевдоніми таблиці, щоб призначити таблиці тимчасове ім’я, коли ви посилаєтеся на неї вдруге.
Щоб виконати самооб’єднання, виконайте такі дії:
Приклад базового синтаксису запиту Self Join у MySQL:
SELECT CONCAT(u.lastname, ' ', o.firstname) AS Customer, u.lastname, o.firstname FROM users u, users o WHERE u.user_id = o.user_id;
Деталі запиту:
users
, якій присвоєно два псевдоніми u
і o
. Вираз WHERE
визначає умовний вираз для фільтрації результатів.
Результатом попереднього запиту буде щось типу цього:
+-------------------+-------------+-----------+ | Customer | lastname | firstname | +-------------------+-------------+-----------+ | Goncharenko Ivan | Goncharenko | Ivan | | Shevchenko Petro | Shevchenko | Petro | +-------------------+-------------+-----------+ 2 rows in set (0.00 sec)
На відміну від внутрішнього з’єднання, лівого з’єднання та правого з’єднання, CROSS JOIN
не має умови з’єднання.
Перехресне з’єднання створює декартовий добуток рядків з об’єднаних таблиць. Перехресне з’єднання об’єднує кожен рядок першої таблиці з кожним рядком правої таблиці, щоб створити загальний набір результатів.
Припустимо, що перша таблиця має a
рядків, а друга таблиця має b
рядків. Тоді перехресне об’єднання CROSS JOIN
поверне a * b
рядків. Набір результатів включатиме всі рядки з обох таблиць, де кожен рядок є комбінацією кожного рядка в першій таблиці з кожним рядком у другій таблиці.
Нижче показано синтаксис перехресного з’єднання CROSS JOIN:
SELECT {назва стовпця(ів)} FROM {таблиця 1} CROSS JOIN {таблиця 2};
Деталі запиту:
INNER JOIN
, LEFT JOIN
і RIGHT JOIN
, функція CROSS JOIN
не має предиката з’єднання. Іншими словами, вона не використовує умову ON
або USING
.
От і все на сьогодні!
В даному практичному уроці ви ознайомилися з різними операторами приєднання JOIN
в MySQL, включаючи внутрішнє приєднання (INNER JOIN
), приєднання зліва (LEFT JOIN
), приєднання з права (RIGHT JOIN
), самоприєднання (Self Join) та перехресне приєднання (CROSS JOIN
), які використовуються для отримання даних з однієї, з двох, або більше таблиць. При використанні оператора JOIN
слід враховувати, що процес об’єднання таблиць може бути ресурсомістким, тому слід поєднувати лише таблиці, дані з яких дійсно необхідні. Чим більше таблиць ви поєднуєте, тим більше буде знижуватись продуктивність.
Дякуємо за увагу! Сподіваємось, що даний урок приніс вам практичну користь.
Навчання за кордоном вже давно асоціюється з якісною освітою, новими можливостями та безліччю перспектив. Але…
Вибір майстра для ремонту та перетяжки меблів – завдання, яке потребує вдумливого підходу. Адже від…
Вибір ідеального хостингу під свій сайт може бути досить заплутаною справою, особливо коли існує багато…
Щоб уникати помилок, потрібно набиратися досвіду; щоб набиратися досвіду, потрібно робити помилки Лоуренс Пітер
Коротке визначення Чорного SEO Чорне СЕО (або Чорна оптимізація) — це будь-яка практика, метою якої…
Отримання прав водія категорії C відкриває двері до професійної діяльності, пов'язаної з керуванням вантажними автомобілями.…