Главная / ИИ агент для программиста / ИИ для SQL запросов

ИИ для SQL запросов

Опиши что нужно получить из данных — получи готовый SQL за секунды. Сложные JOIN, оптимизация, миграции — агент знает SQL лучше большинства разработчиков

30 сек на написание сложного SQL-запроса
×10 ускорение медленных запросов
0 SQL-инъекций в сгенерированном коде

Знакомо?

🤯
JOIN на 5 таблиц — голова кипит
Нужен отчёт с данными из 5 таблиц. LEFT JOIN или INNER? Где поставить условие — в ON или WHERE? Пишешь час, запрос возвращает дубли. Переписываешь. Ещё час.
🐌
Запрос работает 40 секунд
На 100 записях летало, на миллионе — тормозит. EXPLAIN ANALYZE показывает Seq Scan, но какой индекс создать? И не сломает ли он INSERT-ы?
💣
Миграция — страшно запускать
ALTER TABLE на таблице с 50 млн строк. Заблокирует ли это таблицу? На сколько? А если откатить — данные потеряются? Один неправильный шаг — и прод лежит.
📊
Аналитический запрос — «посчитай вот это»
Бизнес просит отчёт: «средний чек по когортам за 6 месяцев с разбивкой по каналам». Оконные функции, CTE, группировки — пока напишешь, день прошёл.

Реальные кейсы

1
Аналитик без SQL — начал писать запросы за 2 дня
Маркетинг-аналитик работал только в Excel и Google Sheets. Компания перешла на PostgreSQL — нужно писать запросы самому. С агентом освоил SQL за 2 дня и перестал дёргать разработчиков.
Настройка
👤
Пользователь
Я маркетинг-аналитик, SQL не знаю вообще. Раньше всё в Excel делал, теперь данные в PostgreSQL. Разработчики устали от моих запросов «выгрузи вот это». Хочу научиться сам. Таблицы: users, orders, order_items, products, utm_sources.
🤖
Агент
📚 План обучения SQL для аналитика:

Подход: вы говорите, какой отчёт нужен → я пишу запрос + объясняю каждую строку. Через неделю будете писать сами.

Ваши таблицы:
• `users` — клиенты (id, name, email, created_at)
• `orders` — заказы (id, user_id, total, status, created_at)
• `order_items` — строки заказа (order_id, product_id, quantity, price)
• `products` — товары (id, name, category, price)
• `utm_sources` — источники трафика (user_id, source, medium, campaign)

Начнём с простого:

Запрос 1 — сколько заказов за последний месяц:
SELECT COUNT(*) AS total_orders
FROM orders
WHERE created_at >= NOW() - INTERVAL '1 month'
AND status = 'completed';


Разбор: `COUNT(*)` — посчитать строки. `WHERE` — фильтр. `INTERVAL '1 month'` — последний месяц. `AND` — ещё одно условие.

Попробуйте запустить — и скажите, какой отчёт нужен следующий.
Ежедневное использование
👤
Пользователь
Работает! Теперь нужно: топ-10 товаров по выручке за квартал, с количеством заказов и средним чеком.
🤖
Агент
📊 Топ-10 товаров по выручке:

SELECT
p.name AS product_name,
p.category,
SUM(oi.quantity * oi.price) AS revenue, -- выручка
COUNT(DISTINCT oi.order_id) AS order_count, -- кол-во заказов
ROUND(AVG(oi.price), 2) AS avg_price -- средняя цена
FROM order_items oi
JOIN products p ON p.id = oi.product_id
JOIN orders o ON o.id = oi.order_id
WHERE o.status = 'completed'
AND o.created_at >= DATE_TRUNC('quarter', NOW()) - INTERVAL '1 quarter'
AND o.created_at < DATE_TRUNC('quarter', NOW())
ORDER BY revenue DESC
LIMIT 10;


Разбор новых концепций:
• `JOIN` — соединяет таблицы. Как VLOOKUP в Excel, только мощнее
• `SUM(oi.quantity * oi.price)` — считает выручку (кол-во × цена)
• `COUNT(DISTINCT oi.order_id)` — уникальные заказы (без дублей)
• `DATE_TRUNC('quarter', NOW())` — начало текущего квартала
• `ORDER BY revenue DESC` — сортировка от большего к меньшему
• `LIMIT 10` — только топ-10

Следующий шаг: GROUP BY с несколькими полями — разбивка по категориям и месяцам.
2
Оптимизация базы данных — запросы ускорены в 50 раз
SaaS-платформа для HR: дашборд с метриками грузился 45 секунд. Пользователи жаловались. Один бэкенд-разработчик за вечер с агентом ускорил до 0.8 секунды.
Настройка
👤
Пользователь
SaaS для HR, PostgreSQL 14, таблицы: employees (500K), attendance (12M), payroll (6M), departments (200). Дашборд грузится 45 секунд — 5 запросов, каждый тормозит. Буду скидывать запросы с EXPLAIN — помоги оптимизировать.
🤖
Агент
⚡ План оптимизации — 5 запросов:

Скидывайте по одному — для каждого сделаю:
1. Анализ EXPLAIN ANALYZE
2. Поиск узких мест (Seq Scan, Nested Loop, disk sort)
3. Оптимизированный запрос
4. Необходимые индексы
5. Прогноз ускорения

Частые причины тормозов на таких объёмах:
• Missing indexes на FK и фильтрующих колонках
• N+1 на уровне SQL (подзапросы вместо JOIN)
• Отсутствие partial indexes для частых фильтров (status, is_active)
• Агрегации без materialized views для дашбордов

Начинайте с самого медленного запроса.
Ежедневное использование
👤
Пользователь
Запрос 1: посещаемость за месяц по отделам. 18 секунд. Вот EXPLAIN.
🤖
Агент
⚡ Оптимизация запроса посещаемости:

🔴 Проблема 1: Seq Scan на attendance (12M строк). Фильтр по `date` без индекса.
→ `CREATE INDEX CONCURRENTLY idx_attend_date ON attendance(date, employee_id);`

🔴 Проблема 2: Подзапрос `(SELECT name FROM departments WHERE id = e.dept_id)` — выполняется для каждой строки (500K раз).
→ Заменить на JOIN

🟡 Проблема 3: `GROUP BY department_name` — строковая группировка. Дорого.
→ Группировать по `dept_id`, имя добавить через JOIN после агрегации

Оптимизированный запрос:
SELECT d.name AS department,
COUNT(DISTINCT a.employee_id) AS present,
COUNT(*) AS total_records,
ROUND(COUNT(DISTINCT a.employee_id)::numeric /
NULLIF(d.employee_count, 0) * 100, 1) AS attendance_pct
FROM attendance a
JOIN employees e ON e.id = a.employee_id
JOIN departments d ON d.id = e.department_id
WHERE a.date >= '2026-03-01' AND a.date < '2026-04-01'
AND a.status = 'present'
GROUP BY d.id, d.name, d.employee_count
ORDER BY attendance_pct DESC;


Прогноз: 18 сек → 0.2 сек. Создайте индекс и проверьте.
3
Миграция с MySQL на PostgreSQL — 80 запросов переписаны за 2 дня
Компания мигрировала с MySQL 5.7 на PostgreSQL 15. 80 SQL-запросов в коде использовали MySQL-специфичный синтаксис. Агент помог переписать с учётом PostgreSQL-фич.
Настройка
👤
Пользователь
Мигрируем с MySQL 5.7 на PostgreSQL 15. В коде 80 SQL-запросов, многие используют MySQL-синтаксис: GROUP_CONCAT, IF(), IFNULL, LIMIT offset,count, обратные кавычки. Буду скидывать пачками — переписывай под PostgreSQL и улучшай, если можно.
🤖
Агент
🔄 План миграции MySQL → PostgreSQL:

Основные замены:
• `GROUP_CONCAT(x SEPARATOR ',')` → `STRING_AGG(x, ',')`
• `IF(cond, a, b)` → `CASE WHEN cond THEN a ELSE b END`
• `IFNULL(x, y)` → `COALESCE(x, y)`
• `LIMIT 10, 20` → `LIMIT 20 OFFSET 10` (порядок другой!)
• `` `backticks` `` → `"double_quotes"` (или без кавычек)
• `NOW()` → `NOW()` (совпадает ✅)
• `AUTO_INCREMENT` → `GENERATED ALWAYS AS IDENTITY`
• `UNSIGNED INT` → `INT CHECK (col >= 0)` или `BIGINT`
• `ENUM('a','b')` → `VARCHAR CHECK` или `CREATE TYPE`

PostgreSQL-улучшения (бесплатные):
• CTE вместо вложенных подзапросов (читаемость)
• Window functions вместо self-join
• JSONB вместо EAV-таблиц
• Partial indexes
• `DISTINCT ON` (нет в MySQL)

Скидывайте пачками по 10 запросов — переписываю с объяснениями.
Ежедневное использование
👤
Пользователь
Вот первые 5 запросов. Все используют GROUP_CONCAT и IF().
🤖
Агент
🔄 5 запросов — MySQL → PostgreSQL:

Запрос 1 (оригинал):
`SELECT dept_id, GROUP_CONCAT(name SEPARATOR ', ') FROM employees GROUP BY dept_id;`

PostgreSQL:
SELECT dept_id, STRING_AGG(name, ', ' ORDER BY name)
FROM employees GROUP BY dept_id;

💡 Бонус: `ORDER BY name` внутри агрегации — в MySQL так нельзя

Запрос 2 (оригинал):
`SELECT id, IF(status=1, 'active', 'inactive') AS status_text FROM users;`

PostgreSQL:
SELECT id,
CASE status WHEN 1 THEN 'active' ELSE 'inactive' END AS status_text
FROM users;


Запрос 3 (оригинал):
`SELECT * FROM orders WHERE date BETWEEN '2026-01-01' AND '2026-01-31' LIMIT 20, 10;`

PostgreSQL:
SELECT * FROM orders
WHERE date >= '2026-01-01' AND date < '2026-02-01' -- вместо BETWEEN
LIMIT 10 OFFSET 20;

💡 `BETWEEN` включает обе границы → `date < '2026-02-01'` корректнее для дат

... запросы 4 и 5 аналогично. Итого: 5/80 готово. Следующая пачка?

Вопросы про SQL с ИИ

Какие СУБД поддерживает?
PostgreSQL, MySQL, SQLite, MS SQL, Oracle, ClickHouse — агент знает синтаксис и особенности каждой СУБД. Укажите вашу — запросы будут с правильным диалектом.
Можно оптимизировать без EXPLAIN?
Да, агент может предложить улучшения по структуре запроса. Но с EXPLAIN ANALYZE оптимизация точнее — видно реальный план выполнения, количество строк и время каждого шага.
Агент не отправит мой запрос куда-то?
Агент работает с текстом запроса, а не с вашей базой данных. Он не имеет доступа к серверу БД — только помогает написать и оптимизировать SQL.
Подходит для новичков?
Да. Опишите задачу на русском — агент напишет SQL и объяснит каждую строку. Через неделю работы с агентом начнёте понимать и писать запросы самостоятельно.
Может проектировать схему с нуля?
Да. Опишите бизнес-сущности и связи — агент спроектирует таблицы, выберет типы данных, расставит индексы и constraints. С учётом нормализации и паттернов нагрузки.

Попробуй ИИ агента за 490 ₽

7 дней без ограничений. Настройка за 3 минуты — бот уже ждёт в Telegram.

Попробовать за 490 ₽ — 7 дней ← ИИ агент для программиста