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

Для чего нужен RIGHT JOIN?

1.3 Junior🔥 231 комментариев
#Базы данных (SQL)

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

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

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

Для чего нужен RIGHT JOIN

RIGHT JOIN — это операция соединения таблиц в SQL, которая возвращает все строки из правой (второй) таблицы и совпадающие строки из левой таблицы.

Основная концепция

SELECT u.id, u.name, o.order_id
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;

Вернёт:

  • Все заказы из таблицы orders (правая таблица)
  • Соответствующих пользователей из users (левая таблица)
  • Если заказ создан неизвестным пользователем (u.id = NULL)

Визуальное представление

users                      orders
┌────┬─────────┐           ┌────┬────────┬─────────┐
│id  │name     │           │id  │user_id │amount   │
├────┼─────────┤           ├────┼────────┼─────────┤
│1   │Alice    │───────┐   │101 │1       │1000     │
│2   │Bob      │───┐   │   ├────┼────────┼─────────┤
│3   │Charlie  │   │   └──→│102 │1       │2000     │
└────┴─────────┘   │       ├────┼────────┼─────────┤
                   └──────→│103 │2       │500      │
                           ├────┼────────┼─────────┤
                           │104 │NULL    │300      │ ← неизвестный пользователь
                           └────┴────────┴─────────┘

RIGHT JOIN вернёт ВСЕ 4 заказа, включая заказ от NULL пользователя

Практические примеры

Пример 1: Найти заказы с данными пользователей

SELECT 
    COALESCE(u.name, 'Unknown User') as customer,
    o.order_id,
    o.amount
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id
ORDER BY o.order_id;

Пример 2: Найти все платежи с информацией о счетах

SELECT 
    a.account_number,
    a.balance,
    p.payment_id,
    p.amount,
    p.payment_date
FROM accounts a
RIGHT JOIN payments p ON a.id = p.account_id
WHERE p.payment_date >= '2024-01-01';

Когда RIGHT JOIN полезен

  1. Поиск потерянных данных: Найти записи из правой таблицы, которые не имеют соответствия в левой
SELECT o.* 
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id
WHERE u.id IS NULL;  -- Заказы от несуществующих пользователей
  1. Аудит и контроль качества: Проверить целостность данных
SELECT 
    d.department_name,
    COUNT(e.id) as employee_count
FROM departments d
RIGHT JOIN employees e ON d.id = e.dept_id
GROUP BY d.id, d.department_name;
  1. Отчёты по всем записям
SELECT 
    c.category_name,
    COUNT(p.id) as product_count
FROM categories c
RIGHT JOIN products p ON c.id = p.category_id
GROUP BY c.id, c.category_name
HAVING COUNT(p.id) > 0;

LEFT vs RIGHT JOIN

-- Эти два запроса ЭКВИВАЛЕНТНЫ:

-- Способ 1: RIGHT JOIN
SELECT u.*, o.*
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;

-- Способ 2: LEFT JOIN (рекомендуется)
SELECT u.*, o.*
FROM orders o
LEFT JOIN users u ON o.user_id = u.id;  -- ← Более читаемо

Профессиональный совет: Большинство команд предпочитают LEFT JOIN, так как он интуитивнее — левая таблица в FROM, и мы расширяем её данные.

Python пример: работа с результатами RIGHT JOIN

import sqlite3

conn = sqlite3.connect(':memory:')
cursor = conn.cursor()

# Создание таблиц
cursor.execute('''
    CREATE TABLE users (
        id INTEGER PRIMARY KEY,
        name TEXT
    )
''')

cursor.execute('''
    CREATE TABLE orders (
        id INTEGER PRIMARY KEY,
        user_id INTEGER,
        amount REAL
    )
''')

# Заполнение данных
cursor.execute("INSERT INTO users VALUES (1, 'Alice'), (2, 'Bob')")
cursor.execute("""
    INSERT INTO orders VALUES 
    (101, 1, 100),
    (102, 1, 200),
    (103, NULL, 50)  -- Заказ от неизвестного пользователя
""")

# RIGHT JOIN эквивалент в SQLite (использует UNION)
results = cursor.execute('''
    SELECT u.name, o.id, o.amount
    FROM users u
    INNER JOIN orders o ON u.id = o.user_id
    
    UNION ALL
    
    SELECT NULL, o.id, o.amount
    FROM orders o
    WHERE o.user_id NOT IN (SELECT id FROM users WHERE id IS NOT NULL)
''').fetchall()

for row in results:
    print(f"Customer: {row[0]}, Order: {row[1]}, Amount: ${row[2]}")

Итоговые выводы

  • RIGHT JOIN нужен когда важны ВСЕ строки из правой таблицы
  • На практике часто заменяют на LEFT JOIN с переёлиренной последовательностью таблиц (более читаемо)
  • Используется в аудите данных, поиске потерянных связей, отчётах
  • В критическом коде лучше явно переписать через LEFT JOIN для ясности