RIGHT JOIN

RIGHT JOIN  — це тип зовнішнього з’єднання таблиць, який повертає:    
• всі рядки з правої таблиці (RIGHT table),    
• рядки з лівої таблиці (LEFT table), які збігаються з умовою з’єднання (ON),    
• якщо відповідності немає — поля з лівої таблиці будуть містити NULL.
SELECT columns
FROM left_table
RIGHT JOIN right_table    
ON left_table.key = right_table.key;
RIGHT JOIN логічно застосовують у ситуаціях, коли основною таблицею, з якої потрібно повернути всі записи, є права таблиця в запиті.
Наприклад:    
• треба показати всі замовлення, навіть якщо деякі з них не мають прив’язаних товарів    
• потрібно отримати всі події, навіть якщо для частини не існує записів у таблиці користувачів    
• необхідно знайти “висячі” записи (які існують у правій таблиці, але відсутні в лівій) На практиці таких випадків менше, ніж для LEFT JOIN, тому RIGHT JOIN використовується рідше.

Приклад

-- Створення бази даних
CREATE DATABASE right_join_practice;
USE right_join_practice;

-- Створення таблиць
-- customers — таблиця клієнтів
CREATE TABLE customers (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100),
    city VARCHAR(100)
);

-- orders — таблиця замовлень
CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    customer_id INT,
    amount DECIMAL(10,2),
    order_date DATE
);

-- Заповнення таблиць даними
-- Таблиця customers
INSERT INTO customers (name, city) VALUES
('Alice', 'Kyiv'),
('Jennifer', 'Lviv'),
('William', 'Odessa');

-- Таблиця orders
INSERT INTO orders (customer_id, amount, order_date) VALUES
(1, 100.50, '2024-01-01'),
(1, 250.00, '2024-01-05'),
(2, 80.00, '2024-02-01'),
(4, 500.00, '2024-03-01'); -- Нема клієнта з id = 4

-- Усі замовлення + дані клієнтів (типовий RIGHT JOIN)
SELECT customers.id AS customer_id,
       customers.name,
       orders.id AS order_id,
       orders.amount
FROM customers
RIGHT JOIN orders
    ON customers.id = orders.customer_id;

-- Знайти “висячі” замовлення (немає відповідних клієнтів)
SELECT orders.*
FROM customers
RIGHT JOIN orders
    ON customers.id = orders.customer_id
WHERE customers.id IS NULL;

-- Отримати всі замовлення дорожчі за 100, разом із даними клієнтів
SELECT customers.name, orders.amount
FROM customers
RIGHT JOIN orders
    ON customers.id = orders.customer_id
WHERE orders.amount > 100;

-- Показати всі замовлення з клієнтами + упорядкувати по місту клієнта
SELECT orders.id AS order_id,
       customers.name,
       customers.city,
       orders.amount
FROM customers
RIGHT JOIN orders
    ON customers.id = orders.customer_id
ORDER BY customers.city;

Для додаткової візуалізації є відео.

LEFT JOIN

LEFT JOIN — це тип з’єднання, яке вибирає всі рядки з лівої таблиці (першої, що зазначена в запиті) і лише ті рядки з правої таблиці (другої таблиці), які задовольняють умову з’єднання. Якщо відповідних рядків у правій таблиці немає, то для них будуть виведені значення NULL.
Умовно, LEFT JOIN можна описати так:    
• Якщо є запис у лівій таблиці, то він обов’язково з’явиться в результаті.    
• Якщо для цього запису немає відповідного рядка у правій таблиці, то для стовпців правої таблиці будуть виведені значення NULL.
Синтаксис операції LEFT JOIN виглядає наступним чином:
SELECT стовпець1, стовпець2, …
FROM таблиця1
LEFT JOIN таблиця2 ON таблиця1.стовпець = таблиця2.стовпець;
• SELECT — вказує, які стовпці потрібно вибрати в результаті.    
• FROM таблиця1 — основна (ліва) таблиця, з якої будуть вибиратися всі записи.    
• LEFT JOIN таблиця2 — приєднуємо праву таблицю, де ми вибираємо лише ті рядки, які відповідають умові з’єднання.    
• ON таблиця1.стовпець = таблиця2.стовпець — умова, за якою відбувається з’єднання таблиць.
Left Join Example

Коли використовувати LEFT JOIN?

• Вивести всі записи з лівої таблиці, навіть якщо для деяких з них немає відповідних записів у правій таблиці.
• Показати відсутність зв’язку між записами двох таблиць. Наприклад, у вас є таблиця з користувачами, і ви хочете отримати всіх користувачів, навіть якщо вони не зробили жодного замовлення (відсутні записи в таблиці замовлень).
• LEFT JOIN дає можливість вивести всі записи з лівої таблиці, навіть якщо немає відповідних рядків у правій таблиці.    
• У разі відсутності відповідних записів у правій таблиці, будуть виведені значення NULL.

Приклад

-- Створення бази даних
CREATE DATABASE left_join_practice_db;
USE left_join_practice_db;

-- Створення двох пов’язаних таблиць
-- Створимо таблиці employees та projects.
CREATE TABLE employees (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    position VARCHAR(100)
);
CREATE TABLE projects (
    id INT PRIMARY KEY AUTO_INCREMENT,
    project_name VARCHAR(100) NOT NULL,
    employee_id INT,
    FOREIGN KEY (employee_id) REFERENCES employees(id)
);
-- Наповнення таблиць даними
-- Таблиця employees
INSERT INTO employees (name, position) VALUES
('Віталій Коваль', 'Менеджер'),
('Олена Петренко', 'Аналітик'),
('Олексій Савчук', 'Розробник'),
('Марина Шевчук', 'Розробник'),
('Петро Івасюк', 'Дизайнер'),
('Оксана Левченко', 'Тестувальник'),
('Юрій Чумаченко', 'DevOps');
-- Таблиця projects
INSERT INTO projects (project_name, employee_id) VALUES
('CRM система', 1),
('Аналітична панель', 2),
('Мобільний застосунок', 3),
('Корпоративний сайт', 5),
('AI чатбот', NULL),     -- немає відповідального
('ERP система', 3),
('E-commerce платформа', NULL), -- немає відповідального
('Система моніторингу', 7);
-- Вивести всі проєкти та відповідальних співробітників
SELECT p.id, p.project_name, e.name AS employee
FROM projects p
LEFT JOIN employees e ON p.employee_id = e.id;

-- Вивести всіх співробітників і проєкти, які вони ведуть
SELECT e.id, e.name, p.project_name
FROM employees e
LEFT JOIN projects p ON e.id = p.employee_id
ORDER BY e.id;
-- Вивести тільки проєкти без відповідального
SELECT p.id, p.project_name
FROM projects p
LEFT JOIN employees e ON p.employee_id = e.id
WHERE e.id IS NULL;

-- Вивести співробітників, які НЕ працюють над жодним проєктом
SELECT e.id, e.name
FROM employees e
LEFT JOIN projects p ON e.id = p.employee_id
WHERE p.id IS NULL;

Для додаткової візуалізації є відео.

INNER JOIN

INNER JOIN — це оператор SQL, який використовується для поєднання рядків із двох або більше таблиць на основі логічної умови. Він повертає лише ті рядки, де існує співпадіння між таблицями відповідно до умов, визначених у ON.
У реляційних базах даних інформація розбивається на логічні частини (таблиці), щоб уникнути дублювання.
Наприклад:    
• Таблиця users — інформація про користувачів    
• Таблиця orders — інформація про замовлення    
• Таблиця products — інформація про товари
Щоб знайти, який користувач зробив яке замовлення, потрібно з’єднати таблиці.
Це і робить INNER JOIN.

Як працює INNER JOIN?

INNER JOIN виконує такі кроки:    
1. Береться кожен рядок з першої таблиці (лівої).    
2. Для кожного рядка шукаються рядки у другій таблиці (правій), що відповідають умові ON.
3. Якщо знайдено хоча б один збіг, рядки об’єднуються у новий рядок у результаті.    
4. Якщо відповідності немає — рядок не потрапляє в результат.
Отже, INNER JOIN повертає перетин множин двох таблиць.
Синтаксис INNER JOIN
SELECT t1.*, t2.*
FROM table1 AS t1
INNER JOIN table2 AS t2    
ON t1.column = t2.column;

ON — ключовий блок, який визначає умову з’єднання.

INNER JOIN на прикладі

Inner Join приклад

В цьому прикладі таблиця users та orders мають звязок через id таблиці users та user_id таблиці orders. Стандартний select з inner join дасть нам результат у вигляді імен користувачів і їхніх замовлень, себто перетин двох таблиць. В нашому прикладі в результат select потраплять користувачі Anna та Olga, оскільки їхні id є в переліку user_id таблиці orders.

Приклад

-- Створення бази даних
CREATE DATABASE inner_join_practice_db;
USE inner_join_practice_db;

-- Створення двох пов’язаних таблиць
-- Створимо таблицю customers (клієнти) та orders (замовлення).
-- Зв’язок: customers.id - orders.customer_id
CREATE TABLE customers (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100)
);

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    customer_id INT NOT NULL,
    product VARCHAR(50),
    amount DECIMAL(10,2),
    order_date DATE,
    FOREIGN KEY (customer_id) REFERENCES customers(id)
);

-- Наповнення таблиць даними
-- Таблиця customers:
INSERT INTO customers (name, email) VALUES
('Anna Petrenko', 'anna@example.com'),
('Ivan Stepanenko', 'ivan@example.com'),
('Olga Melnyk', 'olga@example.com'),
('Petro Savchenko', 'petro@example.com'),
('Marta Koval', 'marta@example.com'),
('Vitaliy Bondar', 'vitaliy@example.com'),
('Roman Kovalenko', 'roman@example.com'),
('Vira Shevchenko', 'vira@example.com');

-- Таблиця orders:
INSERT INTO orders (customer_id, product, amount, order_date) VALUES
(1, 'Laptop', 1200.00, '2024-01-12'),
(1, 'Mouse', 25.00, '2024-01-15'),
(2, 'Keyboard', 45.00, '2024-02-03'),
(3, 'Monitor', 300.00, '2024-02-10'),
(3, 'USB Cable', 8.50, '2024-02-11'),
(5, 'Tablet', 500.00, '2024-03-01'),
(7, 'Headphones', 90.00, '2024-03-05'),
(7, 'Microphone', 150.00, '2024-03-07');

-- INNER JOIN (клієнт + його замовлення)
SELECT customers.name, orders.product, orders.amount
FROM customers
INNER JOIN orders ON customers.id = orders.customer_id;
-- отримаємо - тільки клієнтів, які мають хоча б одне замовлення.

-- Показати всі замовлення із сортуванням за датою
SELECT c.name, o.product, o.amount, o.order_date
FROM customers c
JOIN orders o ON c.id = o.customer_id
ORDER BY o.order_date DESC;

-- INNER JOIN з умовою фільтрації
-- Показати замовлення дорожчі 100$:
SELECT c.name, o.product, o.amount
FROM customers c
JOIN orders o ON c.id = o.customer_id
WHERE o.amount > 100;

-- INNER JOIN з умовою по датах
-- Отримати замовлення за лютий 2024:
SELECT c.name, o.product, o.amount, o.order_date
FROM customers c
JOIN orders o ON c.id = o.customer_id
WHERE o.order_date BETWEEN '2024-02-01' AND '2024-02-29';

Для додаткової візуалізації є відео.