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';

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

Aliases

Aliases (псевдоніми) — це тимчасові імена, які ви призначаєте таблицям або стовпцям в запитах для зручності та скорочення написання SQL-запитів. Вони не змінюють реальні імена таблиць або стовпців у базі даних, а тільки використовуються під час виконання запиту.
Є два основних типи alias у MySQL:
1. Alias для таблиць (Table Alias)
2. Alias для стовпців (Column Alias)

Alias для таблиць

Це псевдоніми для таблиць, які зручно використовувати, коли таблиць в запиті багато або коли їх імена дуже довгі. Псевдонім можна задати після імені таблиці.
Приклад:
SELECT u.name, o.order_date
FROM users AS u
JOIN orders AS o ON u.id = o.user_id;
Тут:    
• users AS u — це псевдонім для таблиці users (тепер ви можете використовувати u замість повного імені таблиці).    
• orders AS o — псевдонім для таблиці orders (тут замість orders використовується o).

Alias для стовпців

Це псевдоніми для стовпців, що дозволяють дати зрозуміліші або коротші імена для результатів запиту.
Приклад:
SELECT first_name AS “First Name”, last_name AS “Last Name”
FROM employees;
Тут:    
• first_name AS “First Name” — псевдонім для стовпця first_name, і результат буде виводитись як “First Name”.    
• last_name AS “Last Name” — псевдонім для стовпця last_name, і результат буде виводитись як “Last Name”.

Переваги

Зручність: псевдоніми дозволяють значно скоротити запит і зробити його більш зрозумілим, особливо при використанні складних SQL-запитів або при об’єднанні кількох таблиць.
Читабельність: псевдоніми допомагають уникнути повторення довгих імен таблиць або стовпців.
Естетика результатів: при використанні псевдонімів для стовпців, можна надавати результатам більш зрозумілі або “людські” назви, що полегшує читання виводу.

Приклад

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

-- Створення таблиці
CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    department VARCHAR(50),
    salary DECIMAL(10, 2)
);

-- Заповнення таблиці даними
INSERT INTO employees (first_name, last_name, department, salary)
VALUES
    ('John', 'Wilson', 'Sales', 5000),
    ('Jane', 'Jackson', 'Marketing', 5500),
    ('Wesley', 'Johnson', 'Sales', 4800),
    ('Angie', 'Williams', 'IT', 6000),
    ('Fred', 'Solverson', 'IT', 6200),
    ('Judie', 'Davis', 'HR', 4500),
    ('Jessie', 'Miller', 'Marketing', 5700);

-- У цьому запиті ми вибираємо ім'я та прізвище співробітників з відділу "Sales", 
--де заробітна плата більша за 4800, і використовуємо псевдоніми для стовпців і таблиці.
SELECT 
    e.first_name AS "First Name", 
    e.last_name AS "Last Name", 
    e.salary AS "Salary"
FROM employees AS e
WHERE e.department = 'Sales' AND e.salary > 4800;

-- У цьому запиті ми вибираємо співробітників з відділів "Sales", "Marketing" та "IT", 
-- використовуючи оператор IN для фільтрації за кількома значеннями.
SELECT 
    e.first_name AS "First Name", 
    e.last_name AS "Last Name", 
    e.department AS "Department"
FROM employees AS e
WHERE e.department IN ('Sales', 'Marketing', 'IT');

-- У цьому запиті ми вибираємо співробітників, чиє ім'я починається на літеру "J", 
-- використовуючи оператор LIKE для пошуку за шаблоном.
SELECT 
    e.first_name AS "First Name", 
    e.last_name AS "Last Name", 
    e.salary AS "Salary"
FROM employees AS e
WHERE e.first_name LIKE 'J%';

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

Оператор BETWEEN

Оператор BETWEEN — це логічний оператор порівняння, який використовується в SQL для перевірки, чи належить певне значення до заданого діапазону. Його часто застосовують у частині WHERE запиту для фільтрації рядків за числовими, текстовими або часовими межами.
SELECT column_name
FROM table_name
WHERE column_name BETWEEN value1 AND value2;    
• column_name — стовпець, значення якого порівнюється;    
• value1 — нижня межа (включно);    
• value2 — верхня межа (включно).
У MySQL BETWEEN включає обидві межі:
тобто умова BETWEEN 10 AND 20 еквівалентна >= 10 AND <= 20.

Приклад

-- Створення бази даних
CREATE DATABASE between_practice;
USE between_practice;
-- Створення таблиці
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    category VARCHAR(30),
    price DECIMAL(10,2),
    created_at DATE
);
-- Наповнення таблиці даними
INSERT INTO products (name, category, price, created_at)
VALUES
('iPhone 15', 'Electronics', 1200.00, '2025-01-10'),
('MacBook Air', 'Electronics', 1800.00, '2025-02-15'),
('AirPods Pro', 'Electronics', 350.00, '2025-03-05'),
('Galaxy S24', 'Electronics', 950.00, '2025-01-20'),
('Kindle Paperwhite', 'Gadgets', 180.00, '2024-12-10'),
('Sony WH-1000XM5', 'Audio', 600.00, '2025-02-02'),
('Dell XPS 13', 'Computers', 1400.00, '2025-03-20'),
('Asus ZenBook', 'Computers', 1100.00, '2025-04-12'),
('Google Pixel 8', 'Electronics', 800.00, '2025-01-25'),
('HP Pavilion', 'Computers', 700.00, '2024-11-30');

-- Використання BETWEEN для числових значень
SELECT name, price
FROM products
WHERE price BETWEEN 700 AND 1200;
-- Отримаємо всі товари, де 700 ≤ price ≤ 1200.

-- Використання BETWEEN для дат
SELECT name, created_at
FROM products
WHERE created_at BETWEEN '2025-01-01' AND '2025-02-28'
ORDER BY created_at;
-- Тут ми бачимо, що BETWEEN коректно обробляє діапазон дат.

-- Використання BETWEEN для текстових значень
SELECT name
FROM products
WHERE name BETWEEN 'G' AND 'M'
ORDER BY name;
-- Порівняння виконується за алфавітним порядком — все, що починається між літерами “G” і “M”.

-- Використання NOT BETWEEN
SELECT name, price
FROM products
WHERE price NOT BETWEEN 500 AND 1000
ORDER BY price;
-- Отримаємо все, що менше 500 або більше 1000.

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