Сможешь ли написать JOIN-запрос в SQL?

Ответ

Да, конечно. В Node.js-проектах я часто работаю с реляционными БД через драйверы (например, pg для PostgreSQL) или ORM. Вот пример JOIN-запроса, который я мог бы выполнить из Node.js-приложения, используя параметризованные запросы для безопасности:

// Пример с использованием библиотеки 'pg' (PostgreSQL)
const queryText = `
  SELECT u.id, u.name, u.email, o.id AS order_id, o.total_amount, o.created_at
  FROM users u
  INNER JOIN orders o ON u.id = o.user_id
  WHERE u.is_active = $1
  ORDER BY o.created_at DESC
  LIMIT $2;
`;
const values = [true, 10];

const result = await pool.query(queryText, values); // pool - пул соединений

Ключевые типы JOIN и их применение:

  • INNER JOIN: Возвращает только записи, для которых есть совпадение в обеих таблицах. Используется чаще всего.
  • LEFT (OUTER) JOIN: Возвращает все записи из левой таблицы и совпадающие из правой. Если совпадения нет, поля из правой таблицы будут NULL. Полезно, например, для получения списка всех пользователей и их заказов, даже если заказов нет.
  • RIGHT JOIN и FULL JOIN используются реже, но я с ними знаком.

Важно для производительности: Поля, по которым происходит соединение (ON u.id = o.user_id), должны быть проиндексированы.

Ответ 18+ 🔞

А, ну это же классика, ёпта! Сидишь ты такой, пишешь свой пет-проект на Node.js, и тут бац — нужно данные из двух таблиц вытащить, как будто они в ссоре и не разговаривают. Без JOIN'ов тут нихуя не получится, это как пытаться собрать мебель из Икеа без инструкции — вроде детали есть, а хуй пойми, что куда.

Вот смотри, самый частый случай — INNER JOIN. Это когда тебе нужны только те записи, где обе стороны согласны на сотрудничество. Как на нормальной вечеринке: есть и водка, и закуска. Пример из жизни: пользователи и их заказы. Хочешь получить список только тех юзеров, которые хотя бы раз что-то купили, и их покупки. Вот тебе код, смотри не обосрись:

// Пример с использованием библиотеки 'pg' (PostgreSQL)
const queryText = `
  SELECT u.id, u.name, u.email, o.id AS order_id, o.total_amount, o.created_at
  FROM users u
  INNER JOIN orders o ON u.id = o.user_id
  WHERE u.is_active = $1
  ORDER BY o.created_at DESC
  LIMIT $2;
`;
const values = [true, 10];

const result = await pool.query(queryText, values); // pool - пул соединений

Видишь, ON u.id = o.user_id? Это и есть та самая волшебная палочка, которая говорит: «Слушай, дружок-пирожок, свяжи-ка ты мне юзера с его заказами по айдишнику». Без этого — будет тебе манда с ушами, а не результат.

А бывает, нужен LEFT JOIN. Это уже история с подтекстом. Ты хочешь всех пользователей, даже тех лентяев, которые нихуя не купили. Правда, в полях заказа у них будет красивый NULL. Типа, «заказ-то где, Петрович? А, ну да, ты просто смотритель».

RIGHT JOIN и FULL JOIN — это уже на любителя, как экзотические специи. Используются реже, но знать про них надо, а то на собеседовании опозоришься.

И главное, чувак, запомни как «Отче наш»: индексы, блядь! Поля, по которым джойнишь (u.id, o.user_id), должны быть проиндексированы. Иначе твой запрос будет выполняться дольше, чем очередь в женский туалет на корпоративе. База будет тупить, как студент на паре по философии, и в итоге накроется медным тазом под нагрузкой. Так что не забудь про CREATE INDEX, это твой лучший друг в этой ебучей вселенной данных.