10 промтов для написания SQL запросов и оптимизации БД: шпаргалка для разработчика 2026

Введение

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% успеха. Вторая половина — понимание того, как работает ваша база данных на уровне индексов, буферов и планов выполнения.

← Все статьи

Комментарии

Читайте также