Каждый аналитик знает это чувство: глаза наливаются кровью, когда нужно вытащить из БД данные для отчёта, а в голове — каша из JOIN'ов и подзапросов. Что если я скажу, что нейросеть может взять на себя рутину и даже предложить оптимизации, о которых ты не задумывался? Речь не о магии, а о правильно составленных промтах. Я собрал 12 проверенных сценариев — от генерации кода до отладки и тонкой настройки под конкретную СУБД. Поехали.
1. Генерация запроса по описанию задачи
Задача: Быстро получить рабочий SQL по текстовому описанию.
Промт: «Ты — старший SQL-разработчик. Составь запрос для PostgreSQL, который выводит топ-10 клиентов по сумме заказов за последний месяц. Учитывай, что таблица clients содержит id, name, created_at; таблица orders — id, client_id, total, created_at. Используй CTE и оконные функции, если это уместно. Прокомментируй каждую часть запроса.»
Пример результата:
WITH monthly_orders AS (
SELECT client_id, SUM(total) AS total_sum
FROM orders
WHERE created_at >= date_trunc('month', CURRENT_DATE) - INTERVAL '1 month'
AND created_at < date_trunc('month', CURRENT_DATE)
GROUP BY client_id
)
SELECT c.name, mo.total_sum
FROM clients c
JOIN monthly_orders mo ON c.id = mo.client_id
ORDER BY mo.total_sum DESC
LIMIT 10;
LLM объяснит, почему использует date_trunc для попадания в прошлый месяц, и добавит комментарии.
2. Перевод с MySQL на ClickHouse
Задача: Перенести запрос между СУБД без потери производительности.
Промт: «Перепиши этот MySQL-запрос для ClickHouse, используя специфические функции (например, arrayJoin, если нужно развернуть массивы) и учитывая отсутствие оконных функций в старых версиях. Исходный запрос: ...»
Пример: MySQL: SELECT user_id, COUNT(*) FROM actions WHERE date > '2026-01-01' GROUP BY user_id; → ClickHouse: SELECT user_id, count() FROM actions WHERE date > '2026-01-01' GROUP BY user_id; LLM также предложит использовать count() вместо COUNT(*), что идиоматично для ClickHouse, и объяснит разницу в синтаксисе.
3. Создание запроса для аналитики поведения пользователей
Задача: Получить данные о воронке продаж с помощью SQL.
Промт: «Напиши SQL-запрос для BigQuery, который считает конверсию по шагам воронки: просмотр страницы → добавление в корзину → покупка. Данные в таблице events (event_name, user_id, timestamp). Выведи количество пользователей на каждом шаге и конверсию между шагами. Учти, что пользователь может совершить действия в разное время.»
Пример:
WITH funnel AS (
SELECT
user_id,
MAX(CASE WHEN event_name = 'view' THEN timestamp END) AS view_time,
MAX(CASE WHEN event_name = 'cart' THEN timestamp END) AS cart_time,
MAX(CASE WHEN event_name = 'purchase' THEN timestamp END) AS purchase_time
FROM events
GROUP BY user_id
)
SELECT
COUNTIF(view_time IS NOT NULL) AS viewers,
COUNTIF(cart_time > view_time) AS added_to_cart,
COUNTIF(purchase_time > cart_time) AS purchased,
SAFE_DIVIDE(COUNTIF(cart_time > view_time), COUNTIF(view_time IS NOT NULL)) AS view_to_cart,
SAFE_DIVIDE(COUNTIF(purchase_time > cart_time), COUNTIF(cart_time > view_time)) AS cart_to_purchase
FROM funnel;
4. Автоматическое создание JOIN-запросов по схеме данных
Задача: Сгенерировать сложный JOIN, когда известно несколько таблиц.
Промт: «У меня есть таблицы: users (id, name, email), orders (id, user_id, amount, created_at), order_items (order_id, product_id, quantity), products (id, name, price). Напиши запрос, который выводит для каждого пользователя сумму его заказов и список купленных товаров (через STRING_AGG). Оптимизируй: используй индексы, избегай SELECT *, ограничь выборку. СУБД — PostgreSQL 15.»
Пример: LLM создаст запрос с LEFT JOIN, агрегацией и пояснит, почему STRING_AGG требует GROUP BY.
5. Оптимизация медленного запроса
Задача: Улучшить производительность существующего запроса.
Промт: «Вот запрос, который выполняется 30 секунд на PostgreSQL. Таблица orders содержит 10 млн строк, order_items — 50 млн. Посоветуй, как ускорить: добавление индексов, переписывание с EXISTS, использование MATERIALIZED VIEW? Объясни, как проверить план выполнения через EXPLAIN ANALYZE.»
Пример: LLM предложит создать индекс на orders(user_id, created_at), заменить IN на EXISTS, и покажет, как читать вывод EXPLAIN.
6. Написание запроса с подзапросами в FROM
Задача: Использовать производные таблицы для сложной агрегации.
Промт: «SQL-запрос для ClickHouse: найти среднюю сумму заказа по каждому клиенту, но только для клиентов, у которых больше 5 заказов. Используй подзапрос в FROM и HAVING. Покажи два варианта: с подзапросом и с CTE, объясни разницу в производительности.»
Пример: LLM выдаст оба варианта и пояснит, что ClickHouse оптимизирует подзапросы иначе, чем PostgreSQL.
7. Генерация запросов для работы с датами и временем
Задача: Фильтрация и группировка по времени.
Промт: «Сгенерируй SQL для MySQL, который группирует заказы по неделям и выводит количество и сумму заказов за каждую неделю 2026 года. Используй YEARWEEK() и объясни, как обработать границы года.»
Пример:
SELECT YEARWEEK(created_at, 1) AS week_number,
COUNT(*) AS orders_count,
SUM(total) AS total_sum
FROM orders
WHERE YEAR(created_at) = 2026
GROUP BY week_number
ORDER BY week_number;
LLM добавит пояснение про режим 1 (неделя начинается с понедельника).
8. Обработка NULL-значений и COALESCE
Задача: Избежать ошибок при работе с пустыми данными.
Промт: «Напиши запрос для PostgreSQL, который выводит имя клиента и его последний заказ, но если заказа нет — покажи "Нет заказов". Используй LEFT JOIN и COALESCE. Также добавь сортировку по дате последнего заказа (NULL последними).»
Пример: LLM предложит ORDER BY orders.created_at NULLS LAST.
9. Использование оконных функций для ранжирования
Задача: Вычислить топ-N по группам.
Промт: «Для ClickHouse напиши запрос, который для каждого товара выводит топ-3 клиента по сумме покупок этого товара. Используй ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY sum DESC). Учти, что ClickHouse поддерживает оконные функции с версии 21.1. Покажи, как ограничить вывод тремя строками на группу (QUALIFY не поддерживается, используй подзапрос).»
Пример: LLM даст решение с подзапросом и фильтрацией по rn <= 3.
10. Генерация тестовых данных для проверки запроса
Задача: Создать фейковые данные для отладки.
Промт: «Сгенерируй SQL-скрипт для MySQL, который создаст временную таблицу с 1000 случайных пользователей (id, имя, email) и 5000 заказов (случайные даты за последний год). Используй функции RAND() и DATE_ADD().»
Пример: LLM создаст INSERT с генерацией случайных строк.
11. Подсказки по EXPLAIN и диагностике
Задача: Понять, почему запрос медленный.
Промт: «Объясни, как интерпретировать вывод EXPLAIN ANALYZE для PostgreSQL. Вот вывод: ... Что означает "Seq Scan on orders"? Почему используется Hash Join? Дай рекомендации по улучшению.»
Пример: LLM разберёт план и укажет на проблему — отсутствие индекса.
12. Трансформация SQL в Python-код
Задача: Перенести логику запроса в pandas.
Промт: «Перепиши этот SQL-запрос в эквивалентный код pandas: SELECT department, AVG(salary) FROM employees GROUP BY department HAVING AVG(salary) > 50000; Покажи, как использовать groupby и фильтрацию.»
Пример:
import pandas as pd
result = df.groupby('department')['salary'].mean().reset_index()
result = result[result['salary'] > 50000]
13. Написание запроса с UNION и UNION ALL
Задача: Объединить данные из нескольких источников.
Промт: «Составь запрос для ClickHouse, который объединяет данные о продажах из двух таблиц (sales_2025, sales_2026) и выводит общую сумму по годам. Используй UNION ALL и объясни, почему UNION ALL быстрее, чем UNION.»
Пример: LLM покажет разницу в производительности.
14. Создание запроса для поиска дубликатов
Задача: Найти повторяющиеся записи.
Промт: «Напиши SQL для MySQL, который находит дубликаты в таблице users по email. Выведи email и количество повторений. Используй GROUP BY и HAVING COUNT(*) > 1.»
Пример:
SELECT email, COUNT(*) FROM users GROUP BY email HAVING COUNT(*) > 1;
15. Преобразование строк в столбцы (PIVOT)
Задача: Сделать кросс-таблицу.
Промт: «В PostgreSQL нет PIVOT, но можно использовать FILTER. Напиши запрос, который из таблицы sales (salesperson, quarter, amount) выводит продажи по кварталам в виде столбцов Q1, Q2, Q3, Q4.»
Пример: LLM покажет использование SUM(amount) FILTER (WHERE quarter = 'Q1').
16. Подсказка по использованию HAVING и WHERE
Задача: Правильно фильтровать агрегаты.
Промт: «Объясни разницу между WHERE и HAVING на примере: найти отделы со средней зарплатой > 50000, но учитывать только сотрудников старше 30 лет. Напиши запрос для PostgreSQL.»
Пример: LLM покажет, что WHERE применяется до GROUP BY, а HAVING — после.
17. Генерация запроса с рекурсивным CTE
Задача: Вывести иерархию (дерево).
Промт: «Составь рекурсивный SQL для PostgreSQL, который выводит всех подчинённых сотрудника с id=1 в таблице employees (id, manager_id, name). Используй WITH RECURSIVE.»
Пример: LLM даст запрос с UNION ALL и объяснит, как работает рекурсия.
18. Оптимизация под ClickHouse: материализованные представления
Задача: Ускорить агрегацию на больших данных.
Промт: «Объясни, как создать материализованное представление в ClickHouse для суммы продаж по дням. Приведи пример CREATE MATERIALIZED VIEW с агрегатной функцией sumState и sumMerge.»
Пример: LLM покажет, как использовать агрегатные функции-комбинаторы.
Эти промты — не просто шаблоны, а фундамент для построения диалога с нейросетью. Пробуй, адаптируй под свои задачи, и ты заметишь, как рутинная работа с SQL ускорится в разы. А если хочешь прокачаться ещё глубже — загляни в наш блог, там много полезного об AI-инструментах.
Комментарии