Python Junior a
Ниже — каждый пример + чёткая формулировка задачи, как её обычно произносят интервьюеры.
Ответы
Отлично, это **идеальный формат для собеседований** 👍 Ниже — **каждый пример + чёткая формулировка задачи**, как её обычно **произносят интервьюеры**. --- # 🧠 PostgreSQL — Cheat Sheet ## Формат: *ЗАДАЧА → SQL → что объяснять* Используем таблицы: ```text users(id, name, age, city) orders(id, user_id, amount, created_at) employees(id, name, department, salary) ``` --- ## 🔹 1. SELECT / WHERE / ORDER BY / LIMIT ### 📌 Задача **Найти 5 самых взрослых пользователей старше 18 лет** ```sql SELECT name, age FROM users WHERE age >= 18 ORDER BY age DESC LIMIT 5; ``` 👉 Что объяснять: * фильтрация по условию * сортировка по убыванию * ограничение количества строк --- ## 🔹 2. JOIN ### 📌 Задача **Вывести пользователей и суммы их заказов** ```sql SELECT u.name, o.amount FROM users u JOIN orders o ON u.id = o.user_id; ``` 👉 Объяснять: * связь таблиц по `id` * `JOIN` возвращает только совпавшие строки --- ### 📌 Задача (LEFT JOIN) **Показать всех пользователей, даже если у них нет заказов** ```sql SELECT u.name, o.id FROM users u LEFT JOIN orders o ON u.id = o.user_id; ``` 👉 Ключевая мысль: * пользователи без заказов → `o.id = NULL` --- ## 🔹 3. GROUP BY + агрегаты ### 📌 Задача **Посчитать количество пользователей в каждом городе** ```sql SELECT city, COUNT(*) AS users_count FROM users GROUP BY city; ``` 👉 Объяснять: * группировка по `city` * агрегат считает строки внутри группы --- ## 🔹 4. WHERE vs HAVING ### 📌 Задача **Найти города, где больше 10 пользователей** ```sql SELECT city, COUNT(*) FROM users GROUP BY city HAVING COUNT(*) > 10; ``` 👉 Обязательно сказать: * `WHERE` тут нельзя * `HAVING` фильтрует результат агрегации --- ## 🔹 5. Оконные функции (ROW_NUMBER) ### 📌 Задача **Пронумеровать сотрудников по зарплате внутри каждого отдела** ```sql SELECT name, department, salary, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) FROM employees; ``` 👉 Ключ: * строки не схлопываются * нумерация внутри группы --- ## 🔹 6. RANK vs DENSE_RANK ### 📌 Задача **Построить рейтинг сотрудников по зарплате** ```sql SELECT name, salary, RANK() OVER (ORDER BY salary DESC) AS rank, DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank FROM employees; ``` 👉 Объяснить: * `RANK` → пропуски * `DENSE_RANK` → без пропусков --- ## 🔹 7. PERCENTILE_CONT ### 📌 Задача **Найти медианную зарплату сотрудников** ```sql SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) FROM employees; ``` 👉 Объяснить: * медиана ≠ среднее * возможна интерполяция --- ## 🔹 8. CASE WHEN ### 📌 Задача **Разбить пользователей на возрастные категории** ```sql SELECT name, CASE WHEN age < 18 THEN 'child' WHEN age < 65 THEN 'adult' ELSE 'senior' END AS category FROM users; ``` 👉 Сравнение с `if / else` --- ## 🔹 9. Подзапрос IN ### 📌 Задача **Найти пользователей, которые сделали хотя бы один заказ** ```sql SELECT name FROM users WHERE id IN ( SELECT user_id FROM orders ); ``` 👉 Объяснить: * подзапрос возвращает список id --- ### 📌 Задача (EXISTS) **То же самое, но более эффективно** ```sql SELECT name FROM users u WHERE EXISTS ( SELECT 1 FROM orders o WHERE o.user_id = u.id ); ``` 👉 Объяснить: * `EXISTS` останавливается на первом совпадении --- ## 🔹 10. UNION / UNION ALL ### 📌 Задача **Получить общий список имён пользователей и сотрудников без дублей** ```sql SELECT name FROM users UNION SELECT name FROM employees; ``` 👉 `UNION` убирает дубликаты --- ### 📌 Задача **То же самое, но быстрее** ```sql SELECT name FROM users UNION ALL SELECT name FROM employees; ``` 👉 `UNION ALL` — без удаления дублей --- ## 🔹 11. NULL и COALESCE ### 📌 Задача **Заменить NULL-город на значение "unknown"** ```sql SELECT name, COALESCE(city, 'unknown') FROM users; ``` 👉 Объяснить: * `COALESCE` берёт первое не-NULL значение --- ## 🔹 12. Индексы ### 📌 Задача **Ускорить поиск пользователей по городу** ```sql CREATE INDEX idx_users_city ON users(city); ``` 👉 Объяснить: * ускоряет `WHERE` * замедляет записи --- ## 🔹 13. EXPLAIN ANALYZE ### 📌 Задача **Понять, как PostgreSQL выполняет запрос** ```sql EXPLAIN ANALYZE SELECT * FROM users WHERE city = 'Moscow'; ``` 👉 Сказать: * `Seq Scan` — плохо на больших таблицах * `Index Scan` — хорошо --- ## 🔹 14. INSERT / RETURNING ### 📌 Задача **Добавить пользователя и сразу получить его id** ```sql INSERT INTO users(name, age) VALUES ('Ivan', 30) RETURNING id; ``` 👉 Фича PostgreSQL --- ## 🔹 15. Транзакции ### 📌 Задача **Обновить данные и отменить изменения** ```sql BEGIN; UPDATE users SET age = age + 1; ROLLBACK; ``` 👉 Объяснить: * изменения не зафиксированы --- ## 🔹 16. CTE (WITH) ### 📌 Задача **Выделить взрослых пользователей и посчитать их** ```sql WITH adults AS ( SELECT * FROM users WHERE age >= 18 ) SELECT COUNT(*) FROM adults; ``` 👉 Объяснить: * читаемость * логическое разбиение --- ## 🔹 17. Классические задачи ### 📌 Задача **Найти дубликаты по имени** ```sql SELECT name, COUNT(*) FROM users GROUP BY name HAVING COUNT(*) > 1; ``` --- ### 📌 Задача **Найти вторую максимальную зарплату** ```sql SELECT MAX(salary) FROM employees WHERE salary < (SELECT MAX(salary) FROM employees); ``` --- # 🎯 Как это говорить на собеседовании Формула ответа: > *«Нам нужно получить … Для этого сначала … затем …»* --- Если хочешь следующий шаг: * 🔥 **20 задач, которые реально дают на собесах** * 🔥 **live-coding SQL с таймером** * 🔥 **tricky вопросы уровня middle/senior** * 🔥 **чеклист “что проговаривать вслух”** Скажи, **уровень и цель** — сделаем точечно 💪