Python Junior a
Отлично 👍 Ниже — тот же cheat sheet, но теперь КАЖДЫЙ БЛОК → с простыми, наглядными SQL-примерами, которые удобно объяснять словами на собеседовании.
Ответы
Отлично 👍 Ниже — **тот же cheat sheet, но теперь КАЖДЫЙ БЛОК → с простыми, наглядными SQL-примерами**, которые удобно **объяснять словами на собеседовании**. Буду использовать воображаемые таблицы: ```text users(id, name, age, city) orders(id, user_id, amount, created_at) employees(id, name, department, salary) ``` --- # 🧠 PostgreSQL — Cheat Sheet с ПРИМЕРАМИ --- ## 🔹 1. SELECT / WHERE / ORDER BY / LIMIT ```sql SELECT name, age FROM users WHERE age >= 18 ORDER BY age DESC LIMIT 5; ``` 👉 **Что объяснять**: * сначала фильтруем (`WHERE`) * потом сортируем (`ORDER BY`) * потом ограничиваем (`LIMIT`) --- ## 🔹 2. JOIN ```sql SELECT u.name, o.amount FROM users u JOIN orders o ON u.id = o.user_id; ``` 👉 **Объяснение**: * `JOIN` связывает таблицы по ключу * `ON` — условие соединения ### 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` * `COUNT(*)` считает строки в группе --- ## 🔹 4. WHERE vs HAVING ```sql SELECT city, COUNT(*) FROM users GROUP BY city HAVING COUNT(*) > 10; ``` 👉 **Ключевая мысль**: * `WHERE` — до агрегации * `HAVING` — после --- ## 🔹 5. Оконные функции ```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; ``` 👉 **Объяснение**: SQL-аналог `if / else`. --- ## 🔹 9. Подзапросы ```sql SELECT name FROM users WHERE id IN ( SELECT user_id FROM orders ); ``` 👉 Пользователи, у которых есть заказы. ### EXISTS (часто предпочтительнее) ```sql SELECT name FROM users u WHERE EXISTS ( SELECT 1 FROM orders o WHERE o.user_id = u.id ); ``` --- ## 🔹 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 ```sql SELECT name, COALESCE(city, 'unknown') FROM users; ``` 👉 Если `city = NULL`, вернётся `'unknown'`. ❌ Никогда: ```sql WHERE city = NULL ``` ✅ Правильно: ```sql WHERE city IS NULL ``` --- ## 🔹 12. Индексы ```sql CREATE INDEX idx_users_city ON users(city); ``` 👉 **Объяснение**: * ускоряет `WHERE city = 'Moscow'` * замедляет `INSERT / UPDATE` --- ## 🔹 13. EXPLAIN ANALYZE ```sql EXPLAIN ANALYZE SELECT * FROM users WHERE city = 'Moscow'; ``` 👉 **Что смотреть**: * `Seq Scan` — плохо на больших таблицах * `Index Scan` — хорошо --- ## 🔹 14. INSERT / UPDATE / DELETE + RETURNING ```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 (ошибки + подсказки)** * 🔥 **middle / senior tricky questions** * 🔥 **разбор реального SQL-скрина** Скажи, **уровень (jun/mid/sen)** и **формат** — подстрою 👌