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

Какие знаешь виды JOIN?

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

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

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

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

Виды JOIN в SQL

JOIN — это операция в SQL, которая объединяет строки из двух или более таблиц на основе связи между ними. Как Python-разработчик, часто работаю с этими операциями через ORM (SQLAlchemy) и прямые SQL-запросы.

INNER JOIN

Возвращает только строки, где есть совпадение в обеих таблицах:

SELECT users.name, orders.order_id
FROM users
INNER JOIN orders ON users.id = orders.user_id;

В SQLAlchemy:

from sqlalchemy import select
from models import User, Order

query = select(User, Order).join(Order, User.id == Order.user_id)
results = session.execute(query).fetchall()

LEFT JOIN (LEFT OUTER JOIN)

Возвращает все строки из левой таблицы и совпадающие строки из правой. Если совпадения нет — NULL:

SELECT users.name, orders.order_id
FROM users
LEFT JOIN orders ON users.id = orders.user_id;

В Python:

from sqlalchemy import select
from sqlalchemy.orm import outerjoin

query = select(User).outerjoin(Order)

RIGHT JOIN (RIGHT OUTER JOIN)

Возвращает все строки из правой таблицы и совпадающие строки из левой:

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

В SQLAlchemy это менее распространено, но можно сделать через LEFT JOIN в обратном порядке.

FULL OUTER JOIN

Возвращает все строки из обеих таблиц. Где нет совпадения — NULL:

SELECT users.name, orders.order_id
FROM users
FULL OUTER JOIN orders ON users.id = orders.user_id;

В SQLAlchemy (для PostgreSQL):

from sqlalchemy import literal_column, text

query = select(User, Order).from_statement(
    text("""
    SELECT u.*, o.* FROM users u
    FULL OUTER JOIN orders o ON u.id = o.user_id
    """)
)

CROSS JOIN

Возвращает декартово произведение — каждую строку из левой таблицы с каждой строкой из правой:

SELECT users.name, products.product_name
FROM users
CROSS JOIN products;

В SQLAlchemy:

query = select(User, Product).join(Product, isouter=True).where(...)
# или явно
query = select(User).join(Product, literal(True))

SELF JOIN

Объединение таблицы с самой собой — полезно для иерархических данных (например, подчиненность сотрудников):

SELECT e.name, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;

В SQLAlchemy:

from sqlalchemy.orm import aliased

Manager = aliased(Employee)
query = select(Employee, Manager).outerjoin(
    Manager, Employee.manager_id == Manager.id
)

Производительность и лучшие практики

Индексы — убедитесь, что поля в ON есть в индексах:

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    
class Order(Base):
    __tablename__ = 'orders'
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('users.id'), index=True)

Выбирайте нужный тип — INNER JOIN быстрее, чем LEFT JOIN, когда не нужны пустые значения.

Избегайте множественных JOIN — каждый JOIN увеличивает сложность. Максимум 3-4 JOIN в одном запросе.

# Используйте select только нужные колонки
query = select(
    User.name,
    Order.order_id,
    Product.product_name
).join(Order).join(Product)

Вывод: знание видов JOIN критично для эффективной работы с базами данных. Выбирайте правильный тип в зависимости от требуемой семантики (все строки из одной таблицы или только совпадения).

Какие знаешь виды JOIN? | PrepBro