Расскажи про JOIN в SQL.

Ответ

JOIN — это операция для объединения строк из двух или более таблиц на основе логической связи между ними. Основные типы:

  • INNER JOIN: Возвращает только те строки, где есть совпадение в обеих таблицах. Это самый распространенный тип.
    SELECT users.name, orders.total
    FROM users
    INNER JOIN orders ON users.id = orders.user_id;
  • LEFT (OUTER) JOIN: Возвращает все строки из левой таблицы и соответствующие строки из правой. Если совпадения нет, в полях правой таблицы будет NULL.
    SELECT users.name, orders.total
    FROM users
    LEFT JOIN orders ON users.id = orders.user_id;
    -- Покажет всех пользователей, даже тех, у кого нет заказов
  • RIGHT JOIN: Аналогичен LEFT JOIN, но возвращает все строки из правой таблицы. Используется реже.
  • FULL OUTER JOIN: Возвращает все строки, когда есть совпадение в левой ИЛИ правой таблице. (В MySQL не поддерживается, эмулируется через UNION).

Ключевые моменты из практики:

  1. Для производительности критически важно, чтобы поля в условии ON были проиндексированы.
  2. При соединении нескольких таблиц важно понимать порядок и логику, чтобы не получить неожиданный декартов продукт.
  3. Я часто использую алиасы для улучшения читаемости сложных запросов:
    SELECT u.email, o.id, p.title
    FROM users u
    JOIN orders o ON u.id = o.user_id
    JOIN order_items oi ON o.id = oi.order_id
    JOIN products p ON oi.product_id = p.id
    WHERE o.status = 'completed';

Ответ 18+ 🔞

А, блядь, JOIN! Ну это ж классика, ёпта, основа основ, без неё нихуя не соберёшь. Представь, что у тебя в одной таблице — мужики, а в другой — их тачки. И тебе надо понять, у кого какая машина. Вот для этого вся эта движуха и нужна.

Самый частый гость — INNER JOIN. Это как строгий охранник на тусовке: пропускает только тех, у кого есть пригласительный в обе таблицы. Нет совпадения — иди нахуй, не вижу тебя в списке. Всё чётко и без сюрпризов.

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

Дальше идёт LEFT JOIN. Вот это уже хитрая жопа. Он тебе вывалит ВСЕХ мужиков из левой таблицы, даже того Ваську, который на велике катается и заказа никогда не делал. Просто напротив него в графе «заказ» будет гордо красоваться NULL. Типа, «ну был тут такой...».

SELECT users.name, orders.total
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
-- Покажет всех пользователей, даже тех, у кого нет заказов

RIGHT JOIN — это та же самая песня, только наоборот: все заказы, даже те, которые хуй знает кто сделал (хотя такое в нормальной базе маловероятно). А FULL OUTER JOIN — это вообще ёперный театр, когда нужны ВСЕ записи со всех сторон. В MySQL его нет, приходится выкручиваться.

Теперь, чувак, слушай сюда, практические моменты, а то нихуя не поймёшь, почему запрос тормозит как вобла на асфальте.

  1. Индексы, блядь! Это святое. Если поля в условии ON не проиндексированы, то база будет делать полный перебор, или, как говорят умные, «декартово произведение». А это, поверь, овердохуища строк, и ждать ты будешь до второго пришествия. Доверия ебать ноль к запросу без индексов на джойнах.
  2. ​​Соединяешь больше двух таблиц — э, бошка, думай. Важен порядок и логика, а то так наделаешь декартовых продуктов, что сам от себя охуеешь. Получишь кучу мусорных строк, которые потом отфильтровывать.
  3. ​​Когда запрос превращается в простыню, спасают алиасы. Без них — пиздец, глаза сломаешь. С ними — красота.
SELECT u.email, o.id, p.title
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN order_items oi ON o.id = oi.order_id
JOIN products p ON oi.product_id = p.id
WHERE o.status = 'completed';

Вот и вся магия. Главное — не накосячить с логикой, про индексы не забывать, и будет тебе счастье. А не будет — значит, где-то хуй с винтом, ищи.