Если вы умеете работать в Excel — вы уже понимаете логику SQL. Большинство Excel-операций имеют прямые аналоги в SQL. Это руководство для тех, кто хочет перейти с таблиц на запросы.
Таблица → SQL: основная параллель
Excel таблица SQL таблица
Лист → FROM table_name
Строки → Строки (rows)
Столбцы → Столбцы (columns)
Фильтр → WHERE
Сортировка → ORDER BY
Скрыть столбцы → SELECT col1, col2 (только нужные)
Фильтр (AutoFilter) → WHERE
Excel: Фильтр → Категория = "Электроника" И Цена > 1000
SQL:
SELECT *
FROM products
WHERE category = 'Электроника'
AND price > 1000;
Excel: Фильтр → Статус IN ("Новый", "В обработке")
SQL:
SELECT * FROM orders
WHERE status IN ('Новый', 'В обработке');
Excel: Фильтр → Имя содержит "Иван"
SQL:
SELECT * FROM customers
WHERE name LIKE '%Иван%';
Сортировка → ORDER BY
Excel: Сортировка по дате (новые сверху), затем по сумме
SQL:
SELECT * FROM orders
ORDER BY created_at DESC, amount DESC;
Сводная таблица → GROUP BY
Сводная таблица — самый мощный инструмент Excel. В SQL это GROUP BY.
Excel Сводная: Строки=Категория, Значения=Сумма продаж
SQL:
SELECT
category,
SUM(amount) AS total_sales
FROM orders
GROUP BY category
ORDER BY total_sales DESC;
Excel Сводная: Строки=Категория, Столбцы=Месяц, Значения=Сумма
SQL (через CASE WHEN):
SELECT
category,
SUM(CASE WHEN EXTRACT(MONTH FROM date) = 1 THEN amount END) AS january,
SUM(CASE WHEN EXTRACT(MONTH FROM date) = 2 THEN amount END) AS february,
SUM(CASE WHEN EXTRACT(MONTH FROM date) = 3 THEN amount END) AS march
FROM orders
WHERE EXTRACT(YEAR FROM date) = 2026
GROUP BY category;
Агрегатные функции
| Excel | SQL |
|---|---|
СУММ(A:A) | SUM(column) |
СРЗНАЧ(A:A) | AVG(column) |
СЧЁТ(A:A) | COUNT(column) |
СЧЁТЗ(A:A) | COUNT(*) |
МИН(A:A) | MIN(column) |
МАКС(A:A) | MAX(column) |
СЧЁТЕСЛИ(A:A, "да") | COUNT(*) WHERE col = 'да' |
СУММЕСЛИ(A:A, "да", B:B) | SUM(B) WHERE A = 'да' |
-- Excel: СЧЁТЕСЛИМН(status, "completed", amount, ">1000")
SELECT COUNT(*)
FROM orders
WHERE status = 'completed' AND amount > 1000;
ВПР (VLOOKUP) → JOIN
ВПР — поиск значения в другой таблице по ключу. В SQL это JOIN.
Excel:
Таблица1: orders (order_id, user_id, amount)
Таблица2: users (user_id, name, email)
ВПР: =ВПР(B2, users!A:C, 2, 0) — найти имя по user_id
SQL:
SELECT
o.order_id,
o.amount,
u.name, -- ← как ВПР нашёл name из users
u.email
FROM orders o
JOIN users u ON u.id = o.user_id;
ВПР с #Н/Д для ненайденных → LEFT JOIN (сохранить все строки orders):
SELECT
o.order_id,
o.amount,
u.name -- NULL если пользователь не найден
FROM orders o
LEFT JOIN users u ON u.id = o.user_id;
ЕСЛИ (IF) → CASE WHEN
Excel: =ЕСЛИ(A2>10000; "Крупный"; "Мелкий")
SQL:
SELECT
order_id,
amount,
CASE
WHEN amount > 10000 THEN 'Крупный'
ELSE 'Мелкий'
END AS size_category
FROM orders;
Excel: =ЕСЛИМН(A2>=100000,"Whale", A2>=10000,"Loyal", A2>=1000,"Regular", A2>0,"New", "Inactive")
SQL:
SELECT
user_id,
total_spent,
CASE
WHEN total_spent >= 100000 THEN 'Whale'
WHEN total_spent >= 10000 THEN 'Loyal'
WHEN total_spent >= 1000 THEN 'Regular'
WHEN total_spent > 0 THEN 'New'
ELSE 'Inactive'
END AS segment
FROM user_totals;
ТЕКСТ / Строковые функции
| Excel | SQL (PostgreSQL) |
|---|---|
ПРОПИСН(A1) | UPPER(col) |
СТРОЧН(A1) | LOWER(col) |
ДЛСТР(A1) | LENGTH(col) |
ЛЕВСИМВ(A1, 3) | LEFT(col, 3) |
ПРАВСИМВ(A1, 3) | RIGHT(col, 3) |
СЦЕПИТЬ(A1, " ", B1) | A1 || ' ' || B1 или CONCAT(A1,' ',B1) |
ПОДСТАВИТЬ(A1,"а","о") | REPLACE(col,'а','о') |
НАЙТИ("текст", A1) | POSITION('текст' IN col) |
ПСТР(A1, 3, 5) | SUBSTRING(col, 3, 5) |
СЖПРОБЕЛЫ(A1) | TRIM(col) |
Даты
| Excel | SQL (PostgreSQL) |
|---|---|
СЕГОДНЯ() | CURRENT_DATE |
ТДАТА() | NOW() |
ГОД(A1) | EXTRACT(YEAR FROM col) |
МЕСЯЦ(A1) | EXTRACT(MONTH FROM col) |
ДЕНЬ(A1) | EXTRACT(DAY FROM col) |
ДЕНЬНЕД(A1) | EXTRACT(DOW FROM col) |
A1-B1 (разница в днях) | A1 - B1 или DATE_PART('day', A1-B1) |
ДАТАМЕС(A1, 1) | A1 + INTERVAL '1 month' |
ТЕКСТ(A1,"ММММ") | TO_CHAR(col, 'Month') |
-- Заказы за последние 30 дней
SELECT * FROM orders
WHERE created_at >= CURRENT_DATE - INTERVAL '30 days';
-- Выручка по месяцам
SELECT
TO_CHAR(created_at, 'YYYY-MM') AS month,
SUM(amount) AS revenue
FROM orders
GROUP BY 1
ORDER BY 1;
СЧЁТЕСЛИ по уникальным → COUNT DISTINCT
Excel: =СУММПРОИЗВ(1/СЧЁТЕСЛИ(A:A, A:A)) — подсчёт уникальных
SQL:
SELECT COUNT(DISTINCT user_id) AS unique_customers
FROM orders;
Нарастающий итог → SUM() OVER
Excel: =СУММ($B$2:B2) — нарастающая сумма
SQL:
SELECT
date,
revenue,
SUM(revenue) OVER (ORDER BY date) AS running_total
FROM daily_sales;
Ранжирование → RANK()
Excel: =РАНГ(A2, A:A, 0)
SQL:
SELECT
name,
sales,
RANK() OVER (ORDER BY sales DESC) AS rank
FROM salespeople;
Практический пример: отчёт продаж
Excel: Сводная → Менеджер | Кол-во сделок | Сумма | Средний чек | Доля от итога
SQL:
SELECT
manager_name,
COUNT(*) AS deals,
SUM(amount) AS total,
ROUND(AVG(amount), 0) AS avg_deal,
ROUND(SUM(amount) / SUM(SUM(amount)) OVER () * 100, 1) AS pct_of_total
FROM sales
WHERE created_at >= '2026-01-01'
GROUP BY manager_name
ORDER BY total DESC;
Главные преимущества SQL над Excel
| Excel | SQL | |
|---|---|---|
| Размер данных | До ~1M строк | Миллиарды строк |
| Воспроизводимость | Формулы могут сломаться | Запрос всегда одинаков |
| Версионность | Файлы v1, v2, final... | Git, история запросов |
| Совместная работа | Конфликты файлов | Все работают с одними данными |
| Автоматизация | Макросы (сложно) | Scheduled queries, dbt |
SQL не заменяет Excel — он дополняет. Excel для визуализации и ad-hoc анализа, SQL для получения данных и сложных расчётов на больших объёмах.