10 промтов для написания SQL-запросов и оптимизации баз данных

Введение

SQL — язык, на котором разговаривают с базами данных. Даже опытные разработчики тратят часы на отладку сложных запросов, а новички часто боятся избыточных JOIN и подзапросов. Современные ИИ-ассистенты, такие как ChatGPT, Claude или YandexGPT, умеют генерировать и оптимизировать SQL-код не хуже мидл-разработчика. Но чтобы получить качественный результат, нужно правильно составить промт. В этой подборке — 10 проверенных промтов для написания запросов и оптимизации БД, с примерами и объяснением, почему они работают.

1. Генерация SQL-запроса по текстовому описанию

Задача: получить готовый SQL из обычного языка.

Промт: Напиши SQL-запрос для MySQL, который выводит названия продуктов и общее количество заказов для каждого продукта за последние 30 дней. Таблицы: products(id, name), orders(id, product_id, created_at). Используй LEFT JOIN.

Пример использования: вы только начинаете изучать SQL и не уверены в синтаксисе. Ассистент вернёт:

SELECT p.name, COUNT(o.id) AS order_count
FROM products p
LEFT JOIN orders o ON p.id = o.product_id
WHERE o.created_at >= NOW() - INTERVAL 30 DAY
GROUP BY p.id, p.name
ORDER BY order_count DESC;

Вывод: чётко указывайте тип БД, структуру таблиц и требуемый тип JOIN. Чем детальнее промт, тем точнее результат.

2. Оптимизация медленного запроса

Задача: ассистент объясняет план выполнения и предлагает улучшения.

Промт: Вот мой запрос. Он работает 10 секунд на таблице с миллионом строк. Проанализируй, почему он медленный, и предложи оптимизацию. SELECT * FROM users WHERE last_login < '2020-01-01' AND status = 'inactive';

Пример использования: вы подозреваете, что отсутствуют индексы. ИИ ответит, что, вероятно, не используется индекс из-за функции или OR, и посоветует создать составной индекс: CREATE INDEX idx_users_lastlogin_status ON users(last_login, status);.

Вывод: используйте промт, когда нужно быстро понять причину тормозов, но не забывайте проверять рекомендации через EXPLAIN ANALYZE.

3. Объяснение сложного SQL-запроса

Задача: понять чужой код без боли.

Промт: Объясни построчно, что делает этот SQL-запрос, как будто я джун: SELECT department, AVG(salary) FROM employees WHERE hire_date > '2020-01-01' GROUP BY department HAVING AVG(salary) > 50000;

Пример результата: ассистент разберёт WHERE, GROUP BY, HAVING и порядок их выполнения. Это отличный способ учиться на реальном коде.

Вывод: полезен при работе с легаси-проектами и для обучения стажёров.

4. Написание запроса с JOIN для конкретной схемы

Задача: правильно связать несколько таблиц.

Промт: Есть таблицы customers(id, name), orders(id, customer_id, amount), payments(id, order_id, date). Напиши SQL, который выводит имена клиентов и сумму их неоплаченных заказов. Подскажи, какой JOIN лучше использовать.

Пример: ассистент предложит LEFT JOIN, чтобы учесть клиентов без заказов, и COALESCE для нулевых сумм.

SELECT c.name, COALESCE(SUM(o.amount), 0) AS unpaid_total
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
LEFT JOIN payments p ON o.id = p.order_id
WHERE p.id IS NULL
GROUP BY c.id, c.name;

Вывод: уточняйте бизнес-правила (что значит "неоплаченные") — это экономит время.

5. Поиск и удаление дубликатов

Задача: навести порядок в данных.

Промт: В таблице email_subscribers(id, email, subscribed_at) есть дубликаты по email. Напиши запрос, который оставит одну запись с самой старой датой подписки, а остальные удалит. Сделай это через CTE.

Пример: ассистент создаст временную таблицу с ROW_NUMBER() OVER (PARTITION BY email ORDER BY subscribed_at) и удалит строки с номером > 1. Это безопасный и воспроизводимый подход.

Вывод: всегда делайте резервную копию перед массовым удалением — ИИ тоже может ошибаться.

6. Генерация тестовых данных

Задача: наполнить таблицу синтетическими данными.

Промт: Сгенерируй 100 строк для таблицы employees(id, name, salary, department) в PostgreSQL. Используй generate_series и рандомные значения.

Пример: получите готовый скрипт с INSERT INTO ... SELECT ... FROM generate_series. Это удобно для тестирования производительности индексов.

Вывод: добавляйте условие на диапазон значений, чтобы данные были реалистичными.

7. Форматирование SQL-кода по стандарту

Задача: улучшить читаемость.

Промт: Отформатируй этот ужасный SQL-код: select * from users where id in (1,2,3) order by name

Пример: ассистент расставит ключевые слова в верхний регистр, отступы и переносы:

SELECT *
FROM users
WHERE id IN (1,2,3)
ORDER BY name;

Вывод: помогает при код-ревью и в документации.

8. Работа с оконными функциями

Задача: написать сложные аналитические запросы.

Промт: Есть таблица sales(id, product, sale_date, amount). Напиши запрос, который для каждого продукта показывает дату продажи, сумму, и накопленную сумму продаж за последние 7 дней (включая текущую строку).

Пример: ассистент предложит SUM(amount) OVER (PARTITION BY product ORDER BY sale_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW). Вы получите не просто SQL, но и объяснение логики.

Вывод: оконные функции сложны для новичков, поэтому промт с примером из реальной задачи работает лучше всего.

9. Рекомендации по индексам

Задача: ускорить поиск по условиям.

Промт: В PostgreSQL есть таблица events(user_id, event_type, created_at). Я часто делаю запрос с WHERE user_id = ? AND event_type = ? AND created_at > ?. Какие индексы посоветуешь?

Пример: ИИ объяснит, что оптимален составной индекс (user_id, event_type, created_at) — порядок колонок важен. Также предложит частичный индекс, если event_type принимает мало значений.

Вывод: промт учит думать об индексах как о структуре, а не просто о "прибавлении скорости".

10. Безопасное обновление и удаление данных

Задача: выполнить опасную операцию с проверкой.

Промт: Напиши запрос на удаление пользователей, которые не заходили с 2010 года. Оберни в транзакцию и добавь проверку количества удаляемых строк через RETURNING.

Пример: ассистент предложит:

BEGIN;
DELETE FROM users WHERE last_login < '2010-01-01' RETURNING id;
-- посмотрите количество строк, затем COMMIT или ROLLBACK;

Вывод: в промте явно требуйте транзакцию и RETURNING — это защищает от случайной потери данных.

Заключение

Эти 10 промтов — базовый набор, который закрывает 80% ежедневных задач с SQL. Главный секрет эффективного промта — конкретика: указывайте СУБД, схему таблиц, ожидаемый результат и ограничения. Пробуйте, адаптируйте под свой проект и помните: ИИ — это помощник, а финальное слово всегда за вами. Если у вас есть свои любимые SQL-промты — делитесь в комментариях!

Полезные источники: PostgreSQL Documentation, MySQL Reference, SQL Standard Wikipedia

← Все статьи

Комментарии