Какие SELECT запросы использовали в SQL
Что проверяют
Умеете ли вы писать запросы сложнее SELECT * и как работаете с базой из Python-кода. Следом обычно дают задачу, например «найти последний заказ каждого клиента», и спрашивают, как вы передаёте параметры в запрос.
Как отвечать
Покажите уровни, от базового к аналитическому, и к каждому пример из своей работы:
- фильтрация и сортировка:
WHERE,IN,BETWEEN,LIKE,IS NULL,ORDER BYсLIMIT; - соединения:
INNER JOINиLEFT JOIN, поиск записей без пары черезLEFT JOIN ... WHERE b.id IS NULLилиNOT EXISTS; - агрегация:
GROUP BYсHAVING,COUNT(DISTINCT ...), условная агрегация черезSUM(CASE ...)илиFILTERв PostgreSQL; - оконные функции:
ROW_NUMBER(),LAG(), накопительная сумма черезSUM() OVER (ORDER BY ...). Последний заказ клиента находится черезROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY created_at DESC)илиDISTINCT ONв PostgreSQL; - CTE:
WITHдля читаемости,WITH RECURSIVEдля деревьев категорий; - пагинация:
OFFSETна дальних страницах дорог, keyset-пагинация черезWHERE id > :last_idработает стабильно.
Вторая половина ответа про Python. Параметры передаются только плейсхолдерами: %s в psycopg, :name в text() у SQLAlchemy. В ORM назовите проблему N+1 и её решение: selectinload и joinedload в SQLAlchemy, select_related и prefetch_related в Django. Медленный запрос разбирайте через EXPLAIN ANALYZE, а не на глаз.
Приведите свой пример: отчёт, выгрузку или поиск дублей, который вы писали сами. Время до и после оптимизации называйте, только если цифры реальные.
Где спотыкаются
Собирают SQL через f-строку с пользовательским вводом. Это SQL-инъекция, и на собеседовании такое замечают сразу.
Пишут NOT IN с подзапросом, где встречается NULL. Результат становится пустым, у NOT EXISTS такой ловушки нет.
Приносят только примеры уровня учебника и теряются на задаче с группировкой и оконной функцией.