SQL и PostgreSQL: 20 промтов, которые заменят целую команду аналитиков

Когда я впервые попросил ChatGPT написать SQL-запрос, он выдал синтаксически верный код, который выполнялся 40 секунд на таблице с миллионом строк. Тогда я понял: нейросеть — не серебряная пуля, а мощный инструмент, который нужно правильно заряжать. За годы работы с базами данных я собрал арсенал промтов, которые превращают ИИ из 'говорящего справочника' в полноценного DBA-напарника. Сегодня поделюсь 20 проверенными шаблонами — от базовых до экспертных, с примерами и объяснением, почему они работают.

Базовый уровень: учим ИИ писать чистый SQL

1. Промт «Преврати описание в SELECT»

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

Промт: «Напиши SQL-запрос для PostgreSQL, который выводит имена и email клиентов, сделавших хотя бы один заказ за последние 30 дней, отсортированных по сумме заказов по убыванию. Используй CTE и оконные функции, если это улучшит читаемость.»

Пример результата:

WITH recent_orders AS (
  SELECT customer_id, SUM(amount) AS total_spent
  FROM orders
  WHERE order_date >= CURRENT_DATE - INTERVAL '30 days'
  GROUP BY customer_id
)
SELECT c.name, c.email, r.total_spent
FROM customers c
JOIN recent_orders r ON c.id = r.customer_id
ORDER BY r.total_spent DESC;

Почему работает: чёткое ТЗ с указанием СУБД, таблиц и желаемых конструкций (CTE, оконные функции) даёт ИИ контекст, и он не выдумывает несуществующие столбцы.

2. Промт «Объясни чужой запрос»

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

Промт: «Объясни, что делает этот SQL-запрос, шаг за шагом. Укажи, какие таблицы участвуют, какие соединения используются, и что именно возвращает результат. Если есть потенциальные проблемы (например, декартово произведение), выдели их.»

Пример результата: ИИ разберёт запрос, опишет логику JOIN’ов, GROUP BY и HAVING, укажет на рискованное использование SELECT *.

Совет: попросите также «переписать запрос в более читаемом виде с комментариями» — получите документированную версию.

3. Промт «Найди ошибку в запросе»

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

Промт: «Вот SQL-запрос для PostgreSQL. Он должен вывести количество заказов по каждому клиенту, но выдаёт ошибку "column customers.name must appear in the GROUP BY clause". Исправь ошибку и объясни причину.»

Пример результата: ИИ объяснит правило GROUP BY, предложит исправленный запрос (добавит name в GROUP BY или использует агрегацию).

Почему важно: нейросеть не только чинит, но и обучает — вы запоминаете правило на будущее.

4. Промт «Сгенерируй схему БД»

Когда использовать: при старте нового проекта или добавлении модуля.

Промт: «Спроектируй схему базы данных для интернет-магазина с таблицами: users, products, orders, order_items. Укажи первичные и внешние ключи, типы данных, индексы для часто используемых полей. Выведи SQL-код для создания таблиц в PostgreSQL.»

Пример результата:

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  email VARCHAR(255) UNIQUE NOT NULL,
  created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE products (
  id SERIAL PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  price NUMERIC(10,2) CHECK (price > 0)
);
-- и так далее

Совет: уточните, нужны ли мягкое удаление, аудит-логи или партиционирование — ИИ учтёт требования.

Продвинутый уровень: оптимизация и анализ

5. Промт «Объясни план выполнения»

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

Промт: «Вот результат EXPLAIN ANALYZE для запроса. Проанализируй его: укажи, какие операции самые дорогие, где возникают узкие места, и предложи конкретные меры оптимизации — индексы, изменение join-стратегии, переписывание запроса.»

Пример результата: ИИ выделит Seq Scan на большой таблице, посоветует создать индекс, предложит использовать Hash Join вместо Nested Loop, и объяснит, почему.

Важно: скормите ИИ реальный вывод EXPLAIN (ANALYZE, BUFFERS), чтобы он опирался на факты.

6. Промт «Найди пропущенные индексы»

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

Промт: «Вот список самых частых запросов и их планы выполнения. Определи, какие индексы нужно создать, чтобы ускорить их. Укажи тип индекса (B-tree, GIN, BRIN) и обоснуй выбор.»

Пример результата: ИИ предложит CREATE INDEX idx_orders_customer_date ON orders(customer_id, order_date);, объяснив, что составной индекс покроет фильтры.

7. Промт «Рефакторинг медленного запроса»

Когда использовать: когда запрос работает, но слишком долго.

Промт: «Вот медленный запрос (скрипт приложен). Перепиши его так, чтобы он выполнялся быстрее, используя JOIN вместо подзапросов, агрегацию на стороне сервера, и избегая функций в WHERE. Сохрани логику и результат.»

Пример результата: ИИ заменит коррелированные подзапросы на JOIN с GROUP BY, уберёт LOWER(email) из WHERE (предложив индекс на LOWER(email)).

8. Промт «Сравни запросы»

Когда использовать: когда нужно выбрать оптимальный вариант из двух.

Промт: «У меня есть два варианта запроса для получения топ-10 клиентов по сумме заказов за год. Сравни их с точки зрения производительности и читаемости. Какой лучше и почему?»

Пример результата: ИИ проанализирует оба, укажет на преимущества оконной функции ROW_NUMBER() перед GROUP BY с LIMIT, если это уместно.

9. Промт «Сгенерируй миграцию»

Когда использовать: при изменении схемы (например, добавление столбца).

Промт: «Создай SQL-миграцию для PostgreSQL, которая добавляет столбец "status" (тип VARCHAR(20) с проверкой) в таблицу "orders", заполняет его значением 'new' для существующих строк и создаёт индекс по этому столбцу.»

Пример результата:

ALTER TABLE orders ADD COLUMN status VARCHAR(20) DEFAULT 'new' CHECK (status IN ('new', 'paid', 'shipped', 'cancelled'));
CREATE INDEX idx_orders_status ON orders(status);

Экспертный уровень: тонкая настройка и нестандартные сценарии

10. Промт «Диагностика блокировок»

Когда использовать: когда приложение зависает из-за взаимных блокировок (deadlocks).

Промт: «Вот pg_stat_activity и pg_locks. Определи, какие транзакции блокируют друг друга, и предложи способы решения: уменьшение времени транзакций, изменение порядка обновления строк, использование SELECT FOR UPDATE SKIP LOCKED.»

11. Промт «Анализ данных с помощью SQL»

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

Промт: «Напиши SQL-запрос для анализа продаж по месяцам: общая выручка, количество заказов, средний чек, прирост к предыдущему месяцу. Используй оконные функции для расчёта прироста.»

Пример результата:

SELECT DATE_TRUNC('month', order_date) AS month,
       SUM(amount) AS revenue,
       COUNT(*) AS orders,
       AVG(amount) AS avg_order_value,
       LAG(SUM(amount)) OVER (ORDER BY DATE_TRUNC('month', order_date)) AS prev_month_revenue
FROM orders
GROUP BY month;

12. Промт «Генерация тестовых данных»

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

Промт: «Сгенерируй SQL-скрипт для вставки 1000 тестовых записей в таблицу users (id, name, email, created_at). Используй генератор случайных строк, но делай email уникальным.»

Пример результата: ИИ предложит использовать generate_series и md5(random()::text) || '@example.com'.

13. Промт «Оптимизация под конкретное железо»

Когда использовать: при настройке сервера PostgreSQL.

Промт: «У меня сервер с 16 ГБ RAM, 4 ядра CPU, SSD. Порекомендуй настройки в postgresql.conf для OLTP-нагрузки: shared_buffers, effective_cache_size, work_mem, maintenance_work_mem.»

Результат: ИИ даст конкретные значения с обоснованием (например, shared_buffers = 4GB, work_mem = 64MB) и предупредит о рисках.

14. Промт «Использование JSONB»

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

Промт: «Напиши запрос для PostgreSQL, который извлекает из JSONB-поля "metadata" таблицы "events" значение ключа "user_agent", фильтрует по вхождению "Chrome", и выводит количество событий по дням.»

Пример результата: ИИ использует оператор ->> и jsonb_path_query.

15. Промт «Рекурсивные запросы»

Когда использовать: для работы с иерархическими данными (деревья, графы).

Промт: «Напиши рекурсивный CTE для PostgreSQL, который выводит всех подчинённых сотрудника с id=5 из таблицы employees (id, manager_id). Включи уровень вложенности.»

Пример результата: ИИ напишет WITH RECURSIVE subordinates AS (...), объяснив, как работает рекурсия.

16. Промт «Партиционирование таблиц»

Когда использовать: когда таблица стала огромной и замедляет запросы.

Промт: «Спроектируй партиционирование таблицы "orders" по дате (по месяцам) в PostgreSQL. Дай DDL для создания партиций и объясни, как добавить новую партицию при необходимости.»

17. Промт «Безопасность SQL-инъекций»

Когда использовать: при написании кода с динамическими запросами.

Промт: «Вот фрагмент кода на Python с f-string в SQL-запросе. Перепиши его с использованием параметризованных запросов (psycopg2) и объясни, почему это безопасно.»

18. Промт «Сравнение производительности: CTE vs подзапросы»

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

Промт: «В PostgreSQL, что быстрее: CTE или подзапрос в FROM? Приведи пример, когда CTE материализуется, и как избежать этого с помощью MATERIALIZED/ NOT MATERIALIZED.»

Пример результата: ИИ объяснит поведение оптимизатора и даст совет: CTE лучше для читаемости, но может быть материализован — используйте WITH x AS MATERIALIZED для принудительной материализации.

19. Промт «Поиск аномалий в данных»

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

Промт: «Напиши SQL-запрос для поиска заказов с аномально большим количеством позиций (больше 3 стандартных отклонений от среднего). Используй CTE и оконные функции.»

20. Промт «Генерация документации по БД»

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

Промт: «Создай Markdown-документацию по таблицам этой БД (приложи схему): название, назначение, ключевые поля с типами, индексы, внешние ключи. Сделай в виде таблиц.»

Пример результата: ИИ сгенерирует аккуратную таблицу, которую можно вставить в README.

Как выжать максимум из промтов: 3 золотых правила

  1. Давайте контекст. Указывайте версию PostgreSQL (например, 16), объём данных, наличие индексов. ИИ без контекста выдаст generic-решения.
  2. Просите объяснить. Попросите ИИ «прокомментируй каждую строку» — так вы научитесь писать SQL сами.
  3. Проверяйте. ИИ может ошибаться, особенно в сложных оконках. Всегда прогоняйте запрос на тестовых данных.

Мои любимые связки промтов

  • Аудит производительности: сначала «объясни план», затем «предложи индексы», потом «перепиши запрос».
  • Изучение новой функции: «что такое BRIN-индексы, приведи пример использования» + «создай пример создания BRIN-индекса для таблицы с временными метками».
  • Генерация отчёта: «напиши запрос для выручки по месяцам» + «оформи результат в виде таблицы с процентами прироста».

Освоив эти 20 промтов, вы сэкономите часы работы и прокачаете свои навыки SQL. Помните: ИИ — это не замена, а усилитель вашего интеллекта. Начните с простых промтов, постепенно переходите к сложным. И обязательно делитесь своими находками в комментариях — возможно, ваш промт попадёт в следующую подборку.

← Все статьи

Комментарии

Читайте также