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) 👌