Back to all questions

Як працює FULL JOIN?

JuniorMiddleDatabases
Seen on interview:0 users

FULL JOIN - це тип JOIN, який повертає всі рядки з обох таблиць. Якщо між таблицями є збіг, рядки будуть об’єднані в один результат. Якщо збігу немає, то для відсутніх значень буде NULL. Тобто FULL JOIN поєднує в собі поведінку LEFT JOIN і RIGHT JOIN одночасно.

Розберемо приклад

Ми маємо дві таблиці: users і subscriptions. Наша задача полягає в тому, щоб отримати всіх користувачів і всі підписки, навіть якщо для деяких користувачів немає підписки або якщо є підписка, яка не прив’язана до жодного користувача.

-- users
id | name
------------
1 | Alice
2 | Bob
3 | John

-- subscriptions
id | user_id | plan_name
-------------------------
1 | 1 | Basic
2 | 2 | Premium
3 | 5 | Enterprise

Запит буде мати наступний вигляд. Давайте розберемо його детальніше:

-- Вибираємо стовпці, які хочемо бачити в результаті:
-- name - з таблиці users
-- plan_name - з таблиці subscriptions
SELECT
users.name,
subscriptions.plan_name
FROM
users

-- Робимо FULL JOIN таблиці subscriptions
-- по полю users.id та subscriptions.user_id
FULL JOIN
subscriptions
ON
users.id = subscriptions.user_id;

В результаті виконання запиту, ми отримаємо такий результат:

name | plan_name
-------------------------
Alice | Basic
Bob | Premium
John | NULL
NULL | Enterprise

Важливо пам’ятати

FULL JOIN повертає всі записи з обох таблиць. Якщо збіг є - дані об’єднуються. Якщо збігу немає - з однієї зі сторін буде NULL.

Seen on interview?

Related Questions

JuniorMiddleDatabases

How does a LEFT JOIN work?

LEFT JOIN is a type of join that returns all rows from the left table, even if there are no matching rows in the right table. If a match exists in the right table, its data is included. If there is no match, the columns from the right table will contain NULL.

Let’s look at an example

We have two tables: users and orders. Our goal is to get all users along with their orders. If a user has no orders, we still want to include them in the result, so we use a LEFT JOIN.

-- users
id | name
------------
1 | Alice
2 | Bob
3 | Charlie

-- orders
id | user_id | product
------------------------
1 | 1 | Laptop
2 | 1 | Mouse
3 | 2 | Keyboard

The query will look like this. Let’s break it down in more detail:

- Select the columns we want to see in the result:
-- name — from the users table
-- product — from the orders table
SELECT
users.name,
orders.product
FROM
users
-- We do a LEFT JOIN, meaning we take ALL rows from the `users` table (the left table)
-- and add data from the `orders` table (the right table) if a match is found.
LEFT JOIN
orders
-- Define the condition that links rows from both tables:
-- if `users.id` matches `orders.user_id`, the rows are joined.
ON
users.id = orders.user_id;

As a result of running the query, we’ll get the following output.

name | product
-------------------
Alice | Laptop
Alice | Mouse
Bob | Keyboard
Charlie | NULL -- even though Charlie has no matches in the right table, the LEFT JOIN still returns him, but the columns from the right table will be NULL.
JuniorMiddleDatabases

Як працює CROSS JOIN?

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

Розберемо приклад

Ми маємо дві таблиці: users і plans. Наша задача полягає в тому, щоб отримати всі можливі пари користувачів і тарифів. Для цього ми будемо використовувати CROSS JOIN.

-- users
id | name
------------
1 | Alice
2 | Bob


-- plansœ
id | plan_name
-------------------
1 | Basic
2 | Premium
3 | Enterprise

Запит буде мати наступний вигляд. Давайте розберемо його детальніше:

-- Вибираємо стовпці, які хочемо бачити в результаті:
-- name - з таблиці users
-- plan_name - з таблиці plans
SELECT
users.name,
plans.plan_name
FROM
users
-- Робимо CROSS JOIN - тобто беремо кожен рядок з таблиці users
-- і поєднуємо його з КОЖНИМ рядком з таблиці plans
CROSS JOIN
plans;

В результаті виконання запиту, ми отримаємо такий результат: Alice поєдналася з усіма тарифами і так само Bob поєднався з усіма можливими тарифами.

name | plan_name
-------------------------
Alice | Basic
Alice | Premium
Alice | Enterprise
Bob | Basic
Bob | Premium
Bob | Enterprise

Важливо пам’ятати

CROSS JOIN може дуже швидко створити велику кількість рядків. Наприклад, якщо в першій таблиці 100 рядків, а в другій 200, то результат буде містити вже 20 000 рядків. Тому його потрібно використовувати обережно.

DatabasesJuniorMiddle

Як працює RIGHT JOIN?

RIGHT JOIN - це тип JOIN, який повертає всі рядки з правої таблиці, навіть якщо у лівій таблиці немає відповідних збігів. Якщо збіг у лівій таблиці існує - дані з неї додаються, а якщо немає - замість значень з лівої таблиці буде NULL.

Розберемо приклад

У нас є дві таблиці: users і orders. Наша задача - отримати всі замовлення разом з інформацією про користувача, навіть якщо користувача немає (наприклад, замовлення створено, але користувач був видалений чи не існує).

-- users
id | name
------------
1 | Alice
2 | Bob
3 | Charlie

-- orders
id | user_id | product
------------------------
1 | 1 | Laptop
2 | 1 | Mouse
3 | 2 | Keyboard
4 | 4 | Monitor

Запит буде мати наступний вигляд. Розберемо його детальніше:

SELECT
users.name,
orders.product
FROM
users -- Ліва таблиця
RIGHT JOIN
orders -- Права таблиця: повертаємо всі її рядки
ON
users.id = orders.user_id; -- Умова зв’язку таблиць

В останньому рядку, ім’я буде NULL, але замовлення Monitor буде в результаті, тому що RIGHT JOIN гарантує, що всі рядки з таблиці orders (правої таблиці) будуть включені.

name | product
-----------------------
Alice | Laptop
Alice | Mouse
Bob | Keyboard
NULL | Monitor

Comments (0)

Sign in to leave a comment

No comments yet. Be the first!

Як працює FULL JOIN? | Interview Question | Devs Hive