Введение
SQL остаётся языком №1 для работы с данными, но даже опытные разработчики тратят до 40% времени на отладку и оптимизацию запросов. Согласно опросу Stack Overflow 2025, 68% профессиональных разработчиков используют SQL ежедневно, а 41% признают, что сложные JOIN-ы и подзапросы — их главная головная боль.
Современные AI-модели (GPT-4o, Claude 3.5 Sonnet, Gemini 2.0) научились не просто генерировать синтаксически корректный SQL, но и предлагать оптимизации, основанные на планах выполнения и статистике распределения данных. В этой статье — 10 готовых промтов, которые сэкономят вам часы работы. Каждый промт протестирован на реальных задачах и адаптирован под 2026 год.
1. Базовый генератор SELECT-запроса
Когда использовать: Нужно быстро получить данные из таблицы с условиями и сортировкой.
Промт:
Сгенерируй SQL-запрос (диалект PostgreSQL 16) для выборки данных из таблицы {название_таблицы}. Условия: {список_полей_для_выборки}, фильтр по {поле_фильтрации} со значением {значение}, отсортировать по {поле_сортировки} по убыванию. Добавь LIMIT 100 и комментарии к каждой строке запроса.
Пример использования:
Сгенерируй SQL-запрос для выборки данных из таблицы orders. Условия: id, customer_id, total_amount, created_at, фильтр по status со значением 'completed', отсортировать по created_at по убыванию. Добавь LIMIT 100 и комментарии к каждой строке запроса.
Результат:
-- Выбираем последние 100 завершённых заказов
SELECT
id, -- ID заказа
customer_id, -- ID клиента
total_amount, -- Сумма заказа
created_at -- Дата создания
FROM orders
WHERE status = 'completed' -- Только завершённые заказы
ORDER BY created_at DESC -- Сначала новые
LIMIT 100; -- Ограничиваем вывод
2. Генератор JOIN-запроса с несколькими таблицами
Когда использовать: Связываете 3+ таблицы и не хотите ошибиться с условиями соединения.
Промт:
Напиши SQL-запрос (MySQL 8.0) с INNER JOIN для таблиц: {таблица1} (алиас t1), {таблица2} (алиас t2), {таблица3} (алиас t3). Связи: t1.{поле} = t2.{поле}, t2.{поле} = t3.{поле}. Выбери поля: {поля}. Добавь WHERE по дате за последние 30 дней. Используй явные JOIN, не устаревший синтаксис с запятыми.
Пример:
Напиши SQL-запрос с INNER JOIN для таблиц: orders (алиас o), customers (алиас c), order_items (алиас oi). Связи: o.customer_id = c.id, o.id = oi.order_id. Выбери поля: o.id, c.name, oi.product_name, oi.quantity. Добавь WHERE по дате за последние 30 дней.
3. Промт для оптимизации медленного запроса
Когда использовать: Запрос выполняется дольше 5 секунд, нужно найти узкое место.
Промт:
Проанализируй следующий SQL-запрос и предложи 3 способа оптимизации. Укажи, какие индексы нужно создать, и объясни, как изменится план выполнения. Используй синтаксис PostgreSQL.
[ВСТАВЬТЕ ВАШ ЗАПРОС]
Учти, что таблица {название} содержит {число} строк, а поле {поле} имеет кардинальность {значение}.
Пример ответа (фрагмент):
- Проблема: Sequential Scan на таблице orders (10 млн строк) из-за отсутствия индекса по status и created_at.
- Решение: Создать составной индекс: CREATE INDEX idx_orders_status_created ON orders(status, created_at);
- Эффект: Переход от Sequential Scan к Index Scan, сокращение времени с 4.2 сек до 0.03 сек.
4. Генератор хранимой процедуры
Когда использовать: Нужно автоматизировать рутинную операцию (например, архивацию старых записей).
Промт:
Создай хранимую процедуру на PL/pgSQL для PostgreSQL 16, которая:
1. Принимает параметр {название_параметра} с типом {тип}.
2. Проверяет существование записи в таблице {таблица}.
3. Если запись существует — обновляет поле {поле}, иначе — вставляет новую.
4. Возвращает ID записи.
Добавь обработку ошибок с использованием EXCEPTION и комментарии.
5. Промт для написания оконных функций
Когда использовать: Нужно ранжировать, считать скользящие средние или накопительные итоги.
Промт:
Напиши SQL-запрос с оконной функцией ROW_NUMBER() для таблицы {таблица}. Разбей данные по полю {поле_разбивки} и отсортируй внутри группы по {поле_сортировки}. Выведи TOP 3 записи из каждой группы. Диалект: PostgreSQL.
Пример:
WITH ranked AS (
SELECT
product_id,
sale_amount,
sale_date,
ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY sale_amount DESC) AS rn
FROM sales
)
SELECT * FROM ranked WHERE rn <= 3;
6. Генератор тестовых данных
Когда использовать: Нужно заполнить таблицу данными для нагрузочного тестирования.
Промт:
Сгенерируй INSERT-запросы для заполнения таблицы {таблица} со схемой:
- {поле1} (тип: INTEGER, PK, автоинкремент)
- {поле2} (тип: VARCHAR(100), NOT NULL)
- {поле3} (тип: TIMESTAMP, DEFAULT NOW())
Создай 1000 строк с реалистичными тестовыми данными: имена, email-ы, даты в диапазоне 2025-2026. Используй GENERATE_SERIES() для PostgreSQL.
7. Промт для рефакторинга сложного подзапроса
Когда использовать: Есть запутанный вложенный запрос, который нужно упростить с помощью CTE.
Промт:
Перепиши следующий запрос с использованием Common Table Expressions (WITH). Разбей логику на 3 логических шага: (1) фильтрация, (2) агрегация, (3) финальная выборка. Добавь комментарии к каждому CTE.
[ВСТАВЬТЕ СЛОЖНЫЙ ПОДЗАПРОС]
8. Генератор запроса с полнотекстовым поиском
Когда использовать: Нужно реализовать поиск по текстовым полям с учётом морфологии.
Промт:
Напиши SQL-запрос для полнотекстового поиска по таблице {таблица} в поле {текстовое_поле}. Используй to_tsvector и to_tsquery с русским конфигом. Отсортируй результаты по релевантности (ts_rank). Диалект: PostgreSQL 16.
9. Промт для анализа плана выполнения
Когда использовать: Нужно понять, почему запрос медленный, и получить рекомендации на основе EXPLAIN ANALYZE.
Промт:
Вот вывод EXPLAIN ANALYZE для моего запроса:
[ВСТАВЬТЕ ВЫВОД]
Проанализируй его:
1. Найди самые дорогие узлы (по total_cost и actual time).
2. Определи, какие индексы отсутствуют.
3. Предложи конкретные изменения запроса или схемы.
4. Оцени ожидаемый прирост производительности в процентах.
10. Генератор миграции для изменения схемы
Когда использовать: Нужно безопасно добавить колонку или индекс в production-базу.
Промт:
Создай SQL-миграцию для PostgreSQL 16, которая:
1. Добавляет колонку {название_колонки} с типом {тип} и значением по умолчанию {значение} в таблицу {таблица}.
2. Создаёт индекс по этой колонке.
3. Обновляет существующие строки (если нужно).
4. Добавляет проверку NOT NULL после обновления.
Используй транзакцию с BEGIN/COMMIT и обработкой ошибок.
Как адаптировать промты под свой проект?
Универсальные промты хороши для старта, но максимальную пользу они приносят после кастомизации. Вот чек-лист для настройки:
| Параметр | Что указать | Пример |
|---|---|---|
| Диалект SQL | PostgreSQL / MySQL / SQLite / BigQuery | PostgreSQL 16 |
| Именование | snake_case / camelCase / префиксы | Все поля в нижнем регистре |
| Стиль | прописные ключевые слова / строчные | Ключевые слова заглавными |
| Комментарии | нужны/не нужны | Да, на русском |
| Размер | LIMIT, пакетная обработка | Не более 1000 строк |
Заключение
Эти 10 промтов покрывают 90% повседневных задач разработчика баз данных — от простой выборки до оптимизации сложных запросов. Главное правило: всегда указывайте диалект SQL и контекст (размер таблиц, кардинальность полей). Без этого AI может сгенерировать синтаксически верный, но неэффективный запрос.
Попробуйте применить любой промт из списка к своей рабочей задаче уже сегодня — результат удивит. А чтобы прокачать навыки работы с базами данных до уровня Senior, обратите внимание на практические курсы, где разбираются реальные кейсы оптимизации — например, на asibiont.com/courses.
Помните: хороший промт — это 50% успеха. Вторая половина — понимание того, как работает ваша база данных на уровне индексов, буферов и планов выполнения.
Комментарии