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**
* 🔥 **чеклист “что проговаривать вслух”**
Скажи, **уровень и цель** — сделаем точечно 💪