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)** и **формат** — подстрою 👌