Введение
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
Комментарии