Когда я впервые попробовал использовать нейросети для написания 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. Если у вас есть свои проверенные промты — делитесь в комментариях, я всегда рад новым идеям!
Комментарии