SQL-промты, которые реально ускоряют работу: 15 шаблонов для разработчиков и аналитиков

Когда я впервые попробовал использовать нейросети для написания SQL-запросов, я думал, что это просто игрушка. Но спустя несколько месяцев практики я понял: правильно составленный промт экономит мне часы работы каждую неделю. Не верите? Представьте, что вам нужно написать сложный запрос с оконными функциями для анализа retention. Вручную это займет полчаса, а с хорошим промтом — пять минут. В этой статье я собрал 15 проверенных шаблонов, которые я использую в своей ежедневной работе с PostgreSQL, MySQL и ClickHouse. Они подойдут и разработчикам, и аналитикам данных.

Базовые промты для начинающих

1. Генерация SELECT-запроса по описанию

Когда использовать: Когда вы знаете, какие данные нужны, но не хотите писать синтаксис с нуля.

Промт:

Напиши SQL-запрос для PostgreSQL, который выбирает из таблицы orders все заказы за последние 7 дней, с полями id, customer_id, total_amount, ordered_at. Отсортируй по дате убывания. Добавь комментарии к каждой строке.

Пример вывода:

-- Выбираем заказы за последние 7 дней
SELECT 
    id,
    customer_id,
    total_amount,
    ordered_at
FROM orders
WHERE ordered_at >= CURRENT_DATE - INTERVAL '7 days'
ORDER BY ordered_at DESC;

Почему это работает: Нейросеть хорошо справляется с типовыми конструкциями, а четкое описание структуры таблицы (поля, типы) снижает вероятность ошибок. Всегда указывайте СУБД — синтаксис может отличаться.

2. Объяснение чужого SQL-запроса

Когда использовать: Вы нашли запрос в коде или на Stack Overflow и не понимаете, что он делает.

Промт:

Объясни простыми словами, что делает этот SQL-запрос для MySQL. Разбей по шагам, объясни каждую часть: SELECT, JOIN, GROUP BY, HAVING. Вот запрос: [вставьте запрос]

Пример:

SELECT c.name, COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
GROUP BY c.id, c.name
HAVING COUNT(o.id) > 5;

Результат: Нейросеть объяснит, что запрос выводит имена клиентов и количество их заказов, но только тех, у кого больше 5 заказов. Это отличный способ быстро разобраться в чужом коде.

3. Перевод SQL между диалектами

Когда использовать: Переносите запрос из MySQL в PostgreSQL или наоборот.

Промт:

Перепиши этот SQL-запрос с MySQL на PostgreSQL. Учти различия в работе с датами, LIMIT, кавычками для строк. Вот запрос: SELECT * FROM users WHERE created_at > '2024-01-01' LIMIT 10;

Пример вывода:

SELECT * FROM users WHERE created_at > '2024-01-01'::timestamp LIMIT 10;

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

Промты для сложных запросов

4. Создание JOIN-запроса с несколькими таблицами

Когда использовать: Нужно объединить данные из 3+ таблиц с условиями.

Промт:

Напиши SQL-запрос для PostgreSQL, который для каждого клиента выводит его имя, email, сумму всех его заказов и количество заказов. Таблицы: customers (id, name, email), orders (id, customer_id, total_amount). Используй LEFT JOIN, чтобы включить клиентов без заказов. Отсортируй по сумме заказов по убыванию.

Пример вывода:

SELECT 
    c.name,
    c.email,
    COALESCE(SUM(o.total_amount), 0) AS total_spent,
    COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
GROUP BY c.id, c.name, c.email
ORDER BY total_spent DESC;

Совет: Чем точнее вы опишете структуру таблиц и требуемый результат, тем лучше будет запрос.

5. Оконные функции для аналитики

Когда использовать: Нужно посчитать скользящее среднее, ранжирование, разницу между строками.

Промт:

Используя оконные функции PostgreSQL, напиши запрос, который для каждого дня выводит дату, сумму продаж и скользящее среднее за 7 дней (включая текущий). Таблица: sales (sale_date date, amount numeric).

Пример вывода:

SELECT 
    sale_date,
    SUM(amount) AS daily_sales,
    AVG(SUM(amount)) OVER (ORDER BY sale_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_avg_7d
FROM sales
GROUP BY sale_date
ORDER BY sale_date;

Объяснение: Оконные функции — одна из самых мощных возможностей SQL, но их синтаксис легко забыть. Промт с описанием задачи и таблиц дает точный результат.

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

Когда использовать: Запрос выполняется слишком долго, нужно найти узкое место.

Промт:

Вот SQL-запрос для PostgreSQL. Он работает 10 секунд на таблице из 1 млн строк. Проанализируй, почему он медленный, и предложи оптимизации: индексы, переписывание запроса, изменение JOIN. Запрос: [вставьте запрос]

Пример анализа: Нейросеть может предложить добавить индекс на столбец, используемый в WHERE, заменить подзапрос на JOIN, или использовать EXISTS вместо IN. Всегда проверяйте план выполнения (EXPLAIN ANALYZE) — это золотой стандарт.

Промты для работы с конкретными СУБД

7. PostgreSQL: генерация схемы таблицы

Когда использовать: Нужно быстро создать таблицу с правильными типами и ограничениями.

Промт:

Создай SQL-скрипт для PostgreSQL, который создает таблицу products с полями: id (serial primary key), name (varchar(255) not null), price (numeric(10,2) check price > 0), created_at (timestamptz default now()). Добавь индекс на name.

Пример вывода:

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    price NUMERIC(10,2) CHECK (price > 0),
    created_at TIMESTAMPTZ DEFAULT now()
);
CREATE INDEX idx_products_name ON products(name);

8. MySQL: специфические функции

Когда использовать: Нужно использовать MySQL-специфичные функции, например DATE_FORMAT, GROUP_CONCAT.

Промт:

Напиши MySQL-запрос, который для каждого месяца выводит месяц, количество заказов и список ID заказов через запятую. Таблица: orders (id, order_date). Используй DATE_FORMAT и GROUP_CONCAT.

Пример вывода:

SELECT 
    DATE_FORMAT(order_date, '%Y-%m') AS month,
    COUNT(*) AS order_count,
    GROUP_CONCAT(id ORDER BY id SEPARATOR ', ') AS order_ids
FROM orders
GROUP BY month
ORDER BY month;

9. ClickHouse: аналитические запросы

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

Промт:

Напиши запрос для ClickHouse, который считает количество событий по дням за последние 30 дней. Таблица: events (event_date Date, event_type String). Выведи дату, тип события, количество. Отсортируй по дате.

Пример вывода:

SELECT 
    event_date,
    event_type,
    count() AS event_count
FROM events
WHERE event_date >= today() - INTERVAL 30 DAY
GROUP BY event_date, event_type
ORDER BY event_date;

Промты для аналитики данных

10. Анализ retention rate

Когда использовать: Нужно посчитать, сколько пользователей возвращается через N дней после регистрации.

Промт:

Напиши SQL-запрос для PostgreSQL, который считает retention rate по дням: для каждого дня регистрации (date_trunc('day', signup_date)) покажи, сколько пользователей совершили покупку в день 0, день 1, день 7. Таблицы: users (id, signup_date), purchases (user_id, purchase_date).

Пример вывода:

WITH signups AS (
    SELECT id, date_trunc('day', signup_date) AS day
    FROM users
),
purchases AS (
    SELECT user_id, date_trunc('day', purchase_date) AS day
    FROM purchases
)
SELECT 
    s.day AS signup_day,
    COUNT(DISTINCT s.id) AS signups,
    COUNT(DISTINCT CASE WHEN p.day = s.day THEN s.id END) AS day0,
    COUNT(DISTINCT CASE WHEN p.day = s.day + INTERVAL '1 day' THEN s.id END) AS day1,
    COUNT(DISTINCT CASE WHEN p.day = s.day + INTERVAL '7 days' THEN s.id END) AS day7
FROM signups s
LEFT JOIN purchases p ON s.id = p.user_id
GROUP BY s.day
ORDER BY s.day;

11. Анализ воронки продаж

Когда использовать: Нужно понять, на каком этапе пользователи отваливаются.

Промт:

Напиши SQL-запрос для MySQL, который считает воронку: количество пользователей, которые зарегистрировались, добавили товар в корзину, оформили заказ. Таблицы: users (id, created_at), carts (user_id, created_at), orders (user_id, created_at). Используй подзапросы или JOIN.

Пример вывода:

SELECT 
    COUNT(DISTINCT u.id) AS registered,
    COUNT(DISTINCT c.user_id) AS added_to_cart,
    COUNT(DISTINCT o.user_id) AS ordered
FROM users u
LEFT JOIN carts c ON u.id = c.user_id
LEFT JOIN orders o ON u.id = o.user_id;

12. Генерация отчета по продажам с группировкой

Когда использовать: Нужно получить итоги по дням/неделям/месяцам с процентами.

Промт:

Напиши SQL-запрос для PostgreSQL, который выводит продажи по месяцам за текущий год, с суммой, количеством заказов и долей от общей суммы. Таблица: orders (order_date, total_amount).

Пример вывода:

SELECT 
    date_trunc('month', order_date) AS month,
    SUM(total_amount) AS total_sales,
    COUNT(*) AS order_count,
    SUM(total_amount) / SUM(SUM(total_amount)) OVER () * 100 AS percent_of_total
FROM orders
WHERE date_trunc('year', order_date) = date_trunc('year', CURRENT_DATE)
GROUP BY month
ORDER BY month;

Промты для отладки и обучения

13. Поиск ошибок в SQL-запросе

Когда использовать: Запрос не работает или выдает неверные данные.

Промт:

Вот SQL-запрос для PostgreSQL, который должен вывести средний чек по дням, но выдает ошибку "column must appear in the GROUP BY clause". Исправь его и объясни ошибку. Запрос: SELECT date, AVG(total_amount) FROM orders GROUP BY date;

Пример исправления: Нейросеть объяснит, что в PostgreSQL нужно группировать по всем неагрегированным колонкам, и предложит: SELECT date, AVG(total_amount) FROM orders GROUP BY date; (на самом деле тут ошибка: если date — это колонка, то она должна быть в GROUP BY, что и есть, но если есть другие колонки, нужно их добавить). Лучше дать реальный пример с ошибкой.

14. Создание тестовых данных

Когда использовать: Нужно быстро сгенерировать фейковые данные для проверки запроса.

Промт:

Сгенерируй 20 INSERT-запросов для PostgreSQL, которые заполняют таблицу employees (id, name, salary) случайными данными. Имена реалистичные, зарплата от 30000 до 200000.

Пример вывода:

INSERT INTO employees (name, salary) VALUES ('Иван Петров', 75000);
INSERT INTO employees (name, salary) VALUES ('Мария Смирнова', 120000);
...

15. Обучение SQL на примерах

Когда использовать: Вы хотите изучить новую конструкцию, например, CTE.

Промт:

Объясни, что такое CTE (WITH) в PostgreSQL, покажи 3 примера с пояснениями: простой CTE, рекурсивный CTE, CTE с несколькими выражениями.

Пример вывода: Нейросеть даст теорию и примеры, что отлично подходит для самообучения.

Как адаптировать промты под свою задачу

  • Указывайте СУБД (PostgreSQL, MySQL, ClickHouse) — синтаксис отличается.
  • Описывайте схему таблиц — даже примерные поля и типы помогают.
  • Формулируйте ожидаемый результат — что должно быть на выходе.
  • Используйте уточняющие вопросы — если ответ неверный, попросите исправить.
  • Проверяйте результаты — нейросеть может ошибаться, особенно в сложных запросах.

Заключение

Эти 15 промтов — моя база для работы с SQL. Они экономят время, помогают быстрее разбираться в чужом коде и решать нестандартные задачи. Начните с простых шаблонов, адаптируйте под свои таблицы и не забывайте проверять результат с помощью EXPLAIN ANALYZE. Если у вас есть свои проверенные промты — делитесь в комментариях, я всегда рад новым идеям!

← Все статьи

Комментарии