Вы когда-нибудь тратили полдня на запрос, который должен был занять 20 минут? Я — да. Особенно когда нужно было вытащить данные из трёх таблиц с вложенными подзапросами, да ещё и оптимизировать это под нагрузкой. Но однажды я понял: ChatGPT может стать моим личным SQL-аналитиком, если правильно его попросить. С тех пор я собрал коллекцию промтов, которые реально экономят часы каждую неделю. В этой подборке — 15 проверенных формулировок: от генерации сложных JOIN до объяснения чужого кода. Никакой воды, только конкретика и примеры.
1. Генерация сложных JOIN-запросов
Промт: «Напиши SQL-запрос для PostgreSQL, который объединяет таблицы orders, customers и payments. Нужны все заказы за последний месяц, с именем клиента и суммой платежа. Используй LEFT JOIN, чтобы включить заказы без платежей. Отсортируй по дате заказа.»
Пример ответа:
SELECT o.order_id, o.order_date, c.customer_name, p.amount
FROM orders o
LEFT JOIN customers c ON o.customer_id = c.customer_id
LEFT JOIN payments p ON o.order_id = p.order_id
WHERE o.order_date >= CURRENT_DATE - INTERVAL '1 month'
ORDER BY o.order_date DESC;
Почему работает: Промт задаёт конкретные таблицы, тип JOIN и фильтры. Модель не гадает, а сразу выдаёт рабочий код. Это база для любой аналитики.
2. Разбор оконных функций
Промт: «Объясни, как работает оконная функция ROW_NUMBER() в SQL Server. Приведи пример ранжирования сотрудников по зарплате внутри каждого отдела. Покажи разницу с RANK() и DENSE_RANK().»
Пример ответа:
SELECT employee_id, department_id, salary,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS row_num,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank,
DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS dense_rank
FROM employees;
Польза: Вместо того чтобы лезть в документацию, вы получаете сразу три функции с объяснением — отлично для подготовки к собеседованиям или написания отчётов.
3. Оптимизация медленного запроса
Промт: «Вот мой запрос, он выполняется 15 секунд на таблице с 10 миллионами строк. Помоги оптимизировать: [вставьте запрос]. Предложи индексы и перепиши, если нужно.»
Пример ответа: Модель предложит добавить составной индекс на (customer_id, order_date), заменить подзапрос на JOIN, и убрать SELECT * — типичные проблемы. В моём случае время упало до 0.3 секунды.
Важно: Всегда указывайте СУБД (PostgreSQL, MySQL и т.д.), потому что синтаксис индексов и планов различается.
4. Объяснение непонятного кода
Промт: «Я нашёл этот запрос в легаси-коде, но не могу понять, что он делает. Разбери построчно и объясни логику: [вставьте запрос]»
Пример: Модель разложит запрос с несколькими CTE и подзапросами на понятные шаги, объяснит назначение каждого блока. Это спасло меня при рефакторинге старого проекта.
5. Генерация тестовых данных
Промт: «Сгенерируй 100 строк тестовых данных для таблицы employees (id, name, department, salary). Используй INSERT INTO ... VALUES. Сделай реалистичные имена и зарплаты от 50 000 до 150 000.»
Пример ответа: Модель выдаст готовый скрипт с циклом или набором VALUES. Я использую это для локальной разработки, когда не хочется писать дата-генератор вручную.
6. Написание хранимой процедуры
Промт: «Создай хранимую процедуру в MySQL, которая принимает customer_id и возвращает сумму всех его заказов. Используй OUT-параметр. Добавь обработку ошибок через DECLARE EXIT HANDLER.»
Пример ответа:
DELIMITER //
CREATE PROCEDURE GetCustomerTotal(IN cust_id INT, OUT total DECIMAL(10,2))
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SET total = 0;
END;
SELECT SUM(amount) INTO total FROM orders WHERE customer_id = cust_id;
END//
DELIMITER ;
Это реально экономит время на написание шаблонного кода.
7. Перевод SQL между диалектами
Промт: «Переведи этот запрос из PostgreSQL в SQLite. Учти разницу в функциях, например, CURRENT_DATE и || для конкатенации.»
Пример: Модель скорректирует типы данных и функции, что критично при миграции проектов.
8. Построение аналитического отчёта
Промт: «Напиши SQL-запрос для BigQuery, который считает выручку по месяцам за 2025 год, с разбивкой по категориям товаров. Используй DATE_TRUNC и SUM. Добавь процент от общей выручки.»
Пример ответа:
SELECT DATE_TRUNC(date, MONTH) AS month, category, SUM(revenue) AS total_revenue,
SUM(revenue) / SUM(SUM(revenue)) OVER () * 100 AS pct_of_total
FROM sales
WHERE EXTRACT(YEAR FROM date) = 2025
GROUP BY month, category;
Готово — можно сразу в дашборд.
9. Отладка ошибок
Промт: «Почему этот запрос выдаёт ошибку "Column 'id' in field list is ambiguous"? Вот код: [вставьте]. Исправь и объясни.»
Пример: Модель укажет на неоднозначность в JOIN и предложит алиасы. Часто помогает быстрее, чем поиск по Stack Overflow.
10. Объяснение плана выполнения
Промт: «Объясни, что означает "Seq Scan on users" в EXPLAIN PostgreSQL. Почему это медленно и как исправить?»
Пример: Модель объяснит, что Seq Scan — это полное сканирование таблицы, и порекомендует индекс. Я часто использую этот промт, чтобы понять, почему запрос тормозит.
11. Генерация схемы БД
Промт: «Создай схему базы данных для интернет-магазина: таблицы users, products, orders, order_items. Укажи первичные и внешние ключи, типы данных, индексы. Напиши CREATE TABLE.»
Пример: Получаешь готовый DDL, который можно сразу выполнить. Отлично для старта проекта.
12. Написание сложного UPDATE с JOIN
Промт: «Напиши UPDATE в MySQL, который увеличивает цену товаров на 10% для категории "Электроника", используя JOIN с таблицей categories.»
Пример ответа:
UPDATE products p
JOIN categories c ON p.category_id = c.id
SET p.price = p.price * 1.1
WHERE c.name = 'Электроника';
Безопасно и эффективно.
13. Исправление неэффективного запроса
Промт: «Вот запрос, который использует SELECT * и подзапросы. Перепиши его с явными колонками и JOIN. Укажи, какие индексы добавить.»
Пример: Модель превратит монстра в чистый запрос с JOIN и списком колонок, а также посоветует индекс на внешние ключи.
14. Генерация отчёта по продажам
Промт: «Напиши SQL для PostgreSQL, который считает количество заказов, средний чек и общую выручку по дням за последнюю неделю. Сгруппируй по дате, отсортируй по дате.»
Пример ответа:
SELECT order_date::date AS day, COUNT(*) AS orders, AVG(total_amount) AS avg_check, SUM(total_amount) AS revenue
FROM orders
WHERE order_date >= CURRENT_DATE - 7
GROUP BY order_date::date
ORDER BY day;
Готово для ежедневного мониторинга.
15. Написание запроса с подзапросами и EXISTS
Промт: «Напиши запрос для SQL Server, который выбирает клиентов, у которых есть заказы за последний месяц, используя EXISTS. Добавь сортировку по имени.»
Пример ответа:
SELECT c.customer_name
FROM customers c
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id
AND o.order_date >= DATEADD(month, -1, GETDATE())
)
ORDER BY c.customer_name;
Этот приём часто быстрее, чем DISTINCT с JOIN.
Как я использую это в работе
Каждое утро я открываю ChatGPT и вставляю свежие данные в один из этих промтов. Например, недавно нужно было выгрузить отчёт для руководства: вместо часа ручной работы я скопировал промт №8, подставил свои таблицы — и через пять минут получил готовый запрос. Главное — всегда указывать СУБД и версию, потому что синтаксис может отличаться.
Эти промты не заменяют понимания SQL, но они снимают рутину. Вы перестаёте тратить время на синтаксические ошибки и сосредотачиваетесь на логике. Если вы разработчик, который регулярно работает с базами данных, советую сохранить эту подборку себе — она окупится в первый же день.
Попробуйте хотя бы один из промтов сегодня, и вы увидите разницу. А если у вас есть свои любимые формулировки — делитесь в комментариях, я всегда за новыми идеями.
Комментарии