Какой у вас опыт работы с написанием нативных SQL-запросов?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Нужно показать, что есть практический опыт написания SQL руками, а не только через ORM. Важно понимать, когда нативный SQL дает выигрыш в производительности, гибкости или сложности запросов. Также ожидают, что известны базовые риски: SQL-инъекции, поддерживаемость и переносимость.
Определение:
Нативные SQL-запросы — это запросы, которые пишутся напрямую на SQL и выполняются без генерации ORM-слоем. В Node.js их обычно используют через драйвер базы данных или через ORM в режиме raw queries. Это полезно, когда нужен сложный JOIN, оконные функции, CTE, точная настройка GROUP BY, или когда ORM делает запрос слишком тяжелым.
Пример использования:
Например, в Node.js нужно получить список пользователей с количеством заказов за последние 30 дней и отсортировать по активности. Через ORM такой запрос может быть неудобным или неоптимальным, поэтому проще написать SQL напрямую.
const result = await db.query(
`
SELECT
u.id,
u.name,
COUNT(o.id) AS orders_count
FROM users u
LEFT JOIN orders o
ON o.user_id = u.id
AND o.created_at >= NOW() - INTERVAL '30 days'
GROUP BY u.id, u.name
ORDER BY orders_count DESC
LIMIT $1
`,
[10]
);
Пояснение кода:
Код выполняет SQL-запрос через подключение к базе данных из Node.js.
Сначала выбираются поля пользователя, затем через LEFT JOIN подцепляются его заказы за последние 30 дней.
COUNT(o.id) считает число заказов на пользователя, GROUP BY собирает строки по пользователю, а ORDER BY сортирует результат по убыванию активности.
Параметр LIMIT $1 передается отдельно, чтобы не подставлять значение в строку вручную и снизить риск SQL-инъекций.
Ключевые моменты:
- Нативный SQL используют, когда ORM не покрывает нужный сценарий или делает запрос слишком сложным.
- Важно уметь писать безопасные параметризованные запросы, а не конкатенировать строки.
- Хороший кандидат понимает, как читать план запроса и где SQL может быть быстрее ORM.
- Нужно помнить про поддерживаемость: сложный SQL лучше выносить в отдельные репозитории или DAO-слой.
- Полезно уметь работать с
JOIN,GROUP BY, подзапросами, CTE и агрегатами. - В Node.js нативный SQL обычно выполняют через драйвер БД или raw-методы ORM.