SQL без боли: 15 промтов, которые заменят аналитика, если вы разработчик

Вы когда-нибудь тратили полдня на запрос, который должен был занять 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, но они снимают рутину. Вы перестаёте тратить время на синтаксические ошибки и сосредотачиваетесь на логике. Если вы разработчик, который регулярно работает с базами данных, советую сохранить эту подборку себе — она окупится в первый же день.

Попробуйте хотя бы один из промтов сегодня, и вы увидите разницу. А если у вас есть свои любимые формулировки — делитесь в комментариях, я всегда за новыми идеями.

← Все статьи

Комментарии