← Назад к вопросам

Какие знаешь джойны в SQL?

1.0 Junior🔥 281 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Джойны в SQL: типы и особенности

В SQL оператор JOIN используется для объединения строк из двух или более таблиц на основе связанного между ними столбца. Это фундаментальная концепция для работы с реляционными базами данных, позволяющая выполнять сложные запросы и агрегировать данные. Основные типы джойнов можно разделить на INNER, OUTER, CROSS и специальные виды.

Основные типы JOIN

1. INNER JOIN

INNER JOIN возвращает только те строки, где есть совпадение в обеих таблицах. Это самый распространенный тип.

SELECT 
    employees.name, 
    departments.department_name
FROM employees
INNER JOIN departments 
    ON employees.department_id = departments.id;

Если у сотрудника нет департамента (NULL в department_id) или департамент не существует в таблице departments, такие строки не будут включены в результат.

2. LEFT (OUTER) JOIN

LEFT JOIN возвращает все строки из левой (первой) таблицы и соответствующие строки из правой. Если совпадения нет, в полях правой таблицы будут значения NULL.

SELECT 
    orders.order_id,
    customers.customer_name
FROM orders
LEFT JOIN customers 
    ON orders.customer_id = customers.id;

Все заказы будут в результатах, даже если покупатель не найден.

3. RIGHT (OUTER) JOIN

RIGHT JOIN работает противоположно LEFT JOIN: все строки из правой таблицы и соответствующие из левой.

SELECT 
    products.product_name,
    suppliers.supplier_name
FROM products
RIGHT JOIN suppliers 
    ON products.supplier_id = suppliers.id;

Все поставщики будут в результатах, даже если нет их продуктов.

4. FULL (OUTER) JOIN

FULL JOIN возвращает все строки из обеих таблиц. Если есть совпадение — строки объединяются, если нет — недостающие поля заполняются NULL.

SELECT 
    students.student_name,
    courses.course_title
FROM students
FULL JOIN courses 
    ON students.course_id = courses.id;

Результат включает всех студентов и все курсы.

5. CROSS JOIN

CROSS JOIN возвращает декартово произведение таблиц: каждую строку первой таблицы со всеми строками второй.

SELECT 
    sizes.size,
    colors.color
FROM sizes
CROSS JOIN colors;

Если sizes содержит 3 записи, а colors — 4, результат будет 12 строк.

Специальные и производные типы

  • SELF JOIN: соединение таблицы с самой собой, часто используется для иерархических данных.
SELECT 
    e1.name AS Employee,
    e2.name AS Manager
FROM employees e1
LEFT JOIN employees e2 
    ON e1.manager_id = e2.id;
  • NATURAL JOIN: автоматически объединяет таблицы по столбцам с одинаковыми названиями. Используется редко из-за неявности.
SELECT * 
FROM employees 
NATURAL JOIN departments;
  • EQUI JOIN: частный случай INNER JOIN, где условие использует строго равенство (=).

Ключевые особенности и оптимизация

  • Условие соединения (ON vs WHERE): ON задает условие соединения, WHERE фильтрует уже соединенный результат.
  • Индексы: наличие индексов на столбцах соединения критически важно для производительности больших запросов.
  • Алиасы: использование алиасов для таблиц улучшает читаемость, особенно при множественных JOIN и SELF JOIN.
  • Последовательность соединений: порядок JOIN может повлияять на план выполнения и эффективность.

Пример сложного запроса с несколькими JOIN

SELECT 
    o.order_date,
    c.customer_name,
    p.product_name,
    s.supplier_name,
    SUM(oi.quantity) AS total_quantity
FROM orders o
INNER JOIN customers c 
    ON o.customer_id = c.id
INNER JOIN order_items oi 
    ON o.id = oi.order_id
INNER JOIN products p 
    ON oi.product_id = p.id
LEFT JOIN suppliers s 
    ON p.supplier_id = s.id
WHERE o.order_date >= '2024-01-01'
GROUP BY o.order_date, c.customer_name, p.product_name, s.supplier_name
ORDER BY o.order_date DESC;

На практике INNER JOIN и LEFT JOIN используются наиболее часто. RIGHT JOIN и FULL JOIN менее распространены, а CROSS JOIN — для специальных случаев. Правильный выбор типа JOIN напрямую влияет на корректность и эффективность запроса.