SQL и Python: один запрос - два разных способа думать
Сейчас у аналитика для работы с данными есть два популярных "инструмента" - это SQL и Python.
Часто слышу, что SQL считают "жестким", а Python - "гибким" инструментом в аналитике.
На самом деле разница не в гибкости между этими языками, а в "модели выполнения"
Ниже сравним один и тот же пример реализованный SQL и Python. И проследим, что выполняется на каждом шаге.
А пока подписывайся на мой канала Аналитика FM.
Его я веду с нуля подписчиков.
В этом канале я публикую информацию об инструментах аналитика (SQL, Python)
О мышлении аналитика, о метриках, об ошибках.
Публикую чек-листы по стандартным видам работы аналитика.
Присоединяйся!
Рассмотрим задачу.
Есть таблица заказов. Нужно:
Взять только оплаченные заказы
Посчитать сумму заказов по пользователям
Оставить пользователей, у которых сумма больше 10 000
Отсортировать по убыванию суммы
Как это выглядит в SQL
SELECT
user_id,
SUM(amount) AS total_amount
FROM orders
WHERE status = 'paid'
GROUP BY user_id
HAVING SUM(amount) > 10000
ORDER BY total_amount DESC;
Что происходит на самом деле?
Хотя запрос написан сверху вниз, выполняется он иначе:
FROM — база берёт таблицу orders
WHERE — отфильтровывает только status = 'paid'
GROUP BY — группирует строки по user_id
SUM(amount) — считает сумму внутри каждой группы
HAVING — отбрасывает группы с суммой ≤ 10 000
SELECT — формирует финальные колонки
ORDER BY — сортирует результат
SQL не идёт шаг за шагом как сценарий. Для него каждый запрос - это единый слепок результата
Ты не "живешь" внутри процесса, ты его декларируешь.
Теперь тот же самый запрос в Python (pandas)
Чтобы не увеличивать объем строк с подключением к БД, сделаем так, что наши данные мы читаем из CSV файла
Ты загружаешь данные. Ты их уже видишь. Они лежат в память, у них есть текущее состояние.
import pandas as pd
df = pd.read_csv('orders.csv')
2. Фильтрация
paid_orders = df[df['status'] == 'paid']
paid_orders.head()
Здесь отфильтровали данные, можно посмотреть, что получилось, можно вернуться назад.
Это состояние сохранилось.
3. Группировка и агрегация
grouped = (
paid_orders
.groupby('user_id')['amount']
.sum()
.reset_index(name='total_amount')
)
grouped.head()
Ты видишь промежуточный результат:
пользователей
их суммы
можешь проверить аномалии
4. Фильтр по агрегату
filtered = grouped[grouped['total_amount'] > 10000]
filtered.head()
5. Сортировка
result = filtered.sort_values('total_amount', ascending=False)
result
Ключевая разница
SQL
- нет "текущего состояния"
- каждый запрос - это новый расчет
- описываем, что хотим получить
- оптимизатор решает как
Python
- данные живут в памяти
- каждый шаг меняет состояние
- на каждом шаге можно остановиться, посмотреть, вернуться, ветвить логику
На практике аналитик:
- думает как в Python
- реализует как в SQL
- и постоянно переключается между этими моделями
Получается, что SQL и Python - это два разных способа мышления.
SQL говорит нам - вот результат
Python - вот процесс.
Python - это процедурный подход.
Аналитик говорит КАК делать:
- возьми данные
- отфильтруй
- посчитай
- отсортируй
- покажи результат
Здесь происходить управление процессом: мы ведем данные по шагам
SQL - декларативный подход.
Аналитик не говорит КАК делать, он говорит, что хочет получить.
В разбираемом примере мы говори:
Хочу видеть сумму заказов по пользователям,
только оплаченные,
только больше 10 000
Для SQL есть входные данные, правила отбора, финальный результат.
SQL не живет во времени, он живет в описании результата
Ну а в моем канале Аналитика FM не только об инструментах аналитика, но и об аналитическом мышлении, метриках, логики.
Присоединяйся!






