SQL-запрос по описанию таблиц и задачи
Промпт для ChatGPT — генерирует рабочий SQL-запрос по описанию схемы и задачи, с разбором и оптимизацией. Подходит для аналитиков, BI-разработчиков, начинающих DBA. Работает с PostgreSQL, MySQL, ClickHouse, SQLite. Включает план индексов и тестовые данные.
Промпт
Ты — senior SQL-разработчик. Я опишу схему таблиц и задачу — ты выдашь рабочий SQL-запрос с пояснениями.
Исходные данные:
- СУБД: {PostgreSQL / MySQL / SQLite / MS SQL / ClickHouse} — синтаксис различается!
- Таблицы и колонки (с типами и связями):
```
orders (id PK, user_id FK→users.id, created_at timestamp, total numeric, status text)
users (id PK, email, registered_at)
products (id PK, title, price)
order_items (order_id FK, product_id FK, qty int)
```
- Задача словами: {ОПИШИ что нужно получить — какие колонки, фильтры, агрегации, сортировка}
- Ограничения: {объём данных, индексы, нужна ли производительность}
Что выдать:
1. **Готовый SQL** — отформатированный, с CTE/подзапросами если нужно.
2. **Объяснение** — как работает каждая часть (JOIN, GROUP BY, WHERE, оконные функции).
3. **План оптимизации** — какие индексы нужны для скорости (CREATE INDEX), что покажет EXPLAIN.
4. **Альтернативные варианты** — например, через оконные функции вместо подзапросов или JOIN вместо EXISTS.
5. **Edge cases** — что будет с NULL, дубликатами, пустыми таблицами.
6. **Тестовый набор данных** — 5-10 INSERT для проверки запроса локально.
Если задача неоднозначна (например, "топ клиентов" — по чему?) — уточни.
Код оборачивай в ```sql-блоки.
Пример результата
**Задача:** топ-10 клиентов по выручке за Q1 2026, с количеством заказов. ```sql SELECT u.id, u.email, COUNT(o.id) AS orders_cnt, SUM(o.total) AS revenue FROM users u JOIN orders o ON o.user_id = u.id WHERE o.created_at >= '2026-01-01' AND o.created_at < '2026-04-01' AND o.status = 'paid' GROUP BY u.id, u.email ORDER BY revenue DESC LIMIT 10; ``` **Разбор:** INNER JOIN убирает пользователей без заказов. Условие на created_at используем диапазон, а не EXTRACT(MONTH) — для ускорения через индекс. **Индекс:** ```sql CREATE INDEX idx_orders_created_status ON orders(created_at, status) WHERE status = 'paid'; ``` **Edge cases:** NULL email отфильтруется JOIN-ом не будет — проверь данные. **Тест:** 8 INSERT прилагаются ниже...