Python Junior a
Ниже — cheat sheet по PostgreSQL для собеседований
Ответы
Ниже — **cheat sheet по PostgreSQL для собеседований** 💼 Сконцентрирован на **том, что реально спрашивают**: синтаксис, поведение, подводные камни. --- # 🧠 PostgreSQL — Cheat Sheet для собеседований ## 🔹 1. SELECT — база, которую проверяют первой ```sql SELECT col1, col2 FROM table WHERE condition GROUP BY col1 HAVING aggregate_condition ORDER BY col1 DESC LIMIT 10 OFFSET 20; ``` ❗ ВАЖНО: * `WHERE` — до агрегации * `HAVING` — после `GROUP BY` * `ORDER BY` выполняется **после** `SELECT` --- ## 🔹 2. JOIN — классика вопросов ```sql INNER JOIN LEFT JOIN RIGHT JOIN FULL JOIN CROSS JOIN ``` Частые вопросы: * `LEFT JOIN` + `WHERE right.col IS NULL` → поиск **несопоставленных строк** * `ON` vs `WHERE` — `ON` влияет на JOIN, `WHERE` фильтрует результат --- ## 🔹 3. Агрегации ```sql COUNT(*) COUNT(col) SUM AVG MIN / MAX ``` ❗ Подвохи: * `COUNT(*)` считает строки * `COUNT(col)` **не считает NULL** * Нельзя использовать агрегат в `WHERE` --- ## 🔹 4. Оконные функции (часто спрашивают!) ```sql ROW_NUMBER() OVER (PARTITION BY dep ORDER BY salary DESC) RANK() DENSE_RANK() NTILE(4) ``` ❗ Отличие: * `GROUP BY` → **схлопывает строки** * `OVER()` → **сохраняет строки** --- ## 🔹 5. PERCENTILE и аналитика ```sql PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY value) PERCENTILE_DISC(0.5) ``` * `CONT` → интерполяция * `DISC` → существующее значение --- ## 🔹 6. CASE WHEN ```sql CASE WHEN condition THEN result ELSE other END ``` Можно использовать: * в `SELECT` * в `ORDER BY` * в `GROUP BY` --- ## 🔹 7. Подзапросы ```sql IN EXISTS ANY ALL ``` ❗ Частый вопрос: * `EXISTS` — быстрее для **проверки наличия** * `IN` — плохо с `NULL` --- ## 🔹 8. UNION ```sql UNION -- удаляет дубликаты UNION ALL -- быстрее, НЕ удаляет ``` --- ## 🔹 9. NULL — любимая ловушка ```sql IS NULL IS NOT NULL COALESCE(a, b) NULLIF(a, b) ``` ❗ Никогда: ```sql col = NULL -- ❌ ``` --- ## 🔹 10. Индексы ```sql CREATE INDEX ON table(col); CREATE UNIQUE INDEX ``` Типы: * `BTREE` — default (99% случаев) * `GIN` — массивы, JSONB * `GIST` — гео, range ❗ Индекс **не используется**, если: * функция над колонкой * `LIKE '%abc'` --- ## 🔹 11. EXPLAIN / ANALYZE ```sql EXPLAIN ANALYZE SELECT ... ``` Смотри: * `Seq Scan` — плохо (часто) * `Index Scan` — хорошо * `cost` — оценки планировщика --- ## 🔹 12. Транзакции ```sql BEGIN; COMMIT; ROLLBACK; SAVEPOINT; ``` Уровни: * `READ COMMITTED` (default) * `REPEATABLE READ` * `SERIALIZABLE` --- ## 🔹 13. INSERT / UPDATE / DELETE ```sql INSERT INTO table VALUES (...) UPDATE table SET col = value WHERE condition DELETE FROM table WHERE condition RETURNING * ``` ❗ `RETURNING` — фишка PostgreSQL --- ## 🔹 14. Ограничения ```sql PRIMARY KEY FOREIGN KEY UNIQUE CHECK DEFAULT NOT NULL ``` --- ## 🔹 15. WITH / CTE ```sql WITH cte AS ( SELECT ... ) SELECT * FROM cte; ``` * улучшает читаемость * **не всегда** улучшает производительность --- ## 🔹 16. Частые вопросы «в лоб» | Вопрос | Короткий ответ | | ---------------------- | ------------------------ | | WHERE vs HAVING | До vs после агрегации | | JOIN vs UNION | Горизонталь vs вертикаль | | DELETE vs TRUNCATE | Медленно vs быстро | | COUNT(*) vs COUNT(col) | С NULL / без NULL | | EXISTS vs IN | EXISTS чаще быстрее | --- ## 🔹 17. Мини-SQL для проверки ```sql -- Найти дубликаты SELECT col, COUNT(*) FROM table GROUP BY col HAVING COUNT(*) > 1; ``` ```sql -- Вторая максимальная зарплата SELECT MAX(salary) FROM table WHERE salary < (SELECT MAX(salary) FROM table); ``` --- ## 🎯 Как готовиться с этим cheat sheet * Пройти **каждый блок и написать 1 запрос** * Уметь **объяснять словами**, не только писать * Знать **где подвохи** (NULL, JOIN, GROUP BY) --- Если хочешь, дальше могу: * дать **типовые задачи с собеседований** * сделать **SQL live-coding checklist** * разобрать **частые ошибки кандидатов** * подготовить **уровень junior / middle / senior** Скажи, на **какой уровень** и **какой формат собеседования** (live / тест / SQL screen) 👌