Какие SQL запросы вы писали
Что проверяют
Вопрос открытый, и по нему меряют глубину, а не список ключевых слов. Интервьюер хочет понять, писали ли вы что-то сложнее выборки по первичному ключу, видели ли план запроса и приходилось ли чинить медленный запрос на боевых объёмах. Следом уточняют: как поняли, что тормозит, и что сделали.
Как отвечать
Не перечисляйте синтаксис, идите от задач своего проекта. Каркас надо наполнить своими примерами:
- контекст: какая СУБД и версия, порядок размера таблиц, какая нагрузка (отчёты, онлайн-запросы, пакеты);
- типовые запросы: соединения нескольких таблиц и разница
INNERиLEFT, агрегация сGROUP BYиHAVING,EXISTSвместоINна больших подзапросах,CTEдля многоступенчатых выборок; - оконные функции:
ROW_NUMBER() OVER (PARTITION BY ...)для задачи «последняя запись по каждому клиенту»,LAGи накопительные суммы для сравнения периодов. Это отличает уверенный уровень от базового; - оптимизация:
EXPLAIN (ANALYZE, BUFFERS), чтение плана (последовательное сканирование против индексного, оценка строк против фактической), составной индекс под конкретный запрос, частичный индекс, пагинация по ключу вместоOFFSETна глубоких страницах; - запись: пакетные вставки,
INSERT ... ON CONFLICT, транзакции и уровни изоляции, блокировки черезSELECT ... FOR UPDATE.
Для Java-позиции свяжите SQL с приложением: где хватало Spring Data и @Query, где брали JdbcTemplate или jOOQ ради контроля над запросом, как ловили N+1 (join fetch, @EntityGraph, включённый лог SQL), чем версионировали схему, Flyway или Liquibase.
Один разобранный случай сильнее длинного списка: отчёт выполнялся минуту, план показал сортировку с уходом на диск, добавили индекс под условие и порядок, стало сто миллисекунд.
Где спотыкаются
Перечисляют операторы, будто отвечают на вопрос из учебника. Спрашивали про ваш опыт, а не про существование GROUP BY.
Говорят «оптимизировал запросы», но не могут назвать, чем смотрели план и какой индекс добавили. Это звучит как чужая история.
Списывают всё на ORM: «Hibernate сам генерирует SQL». Следующий вопрос про N+1 или про LazyInitializationException закрывает тему не в вашу пользу.