В этой статье
Чтобы ChatGPT составил полезный SQL-запрос, передайте ему диалект, схему, данные и точное описание результата. Затем выполните запрос на небольшом наборе, где ответ можно посчитать вручную. Красивый SELECT ещё ничего не говорит о том, какие строки он выберет.
Разберём задачу для SQLite: получить товары, у которых за сентябрь 2026 года отгружено не меньше пяти единиц. Нужны название и сумма, сортировка по убыванию суммы, затем по названию. Запрос ниже проверен на SQLite 3.45.3. ChatGPT в этом сценарии получает текст, а SQL вы запускаете в своём клиенте.
Подготовьте учебную базу
Создайте отдельную пустую базу в SQLite-клиенте. Выполните в ней весь блок CREATE TABLE и INSERT; рабочая база для этого примера не нужна.
CREATE TABLE order_items (
product_name TEXT NOT NULL,
units INTEGER NOT NULL CHECK (units >= 0),
status TEXT NOT NULL,
ordered_at TEXT NOT NULL
);
INSERT INTO order_items (product_name, units, status, ordered_at) VALUES
('Блокнот', 4, 'shipped', '2026-09-03'),
('Блокнот', 5, 'shipped', '2026-09-18'),
('Папка', 5, 'shipped', '2026-09-12'),
('Ручка', 3, 'shipped', '2026-09-20'),
('Папка', 20, 'cancelled', '2026-09-22'),
('Блокнот', 100, 'shipped', '2026-10-01'),
('Ручка', 50, 'shipped', '2026-08-31');
В этом наборе units — неотрицательные целые числа. Статус shipped означает отгруженную позицию, cancelled — отменённую. Даты в ordered_at записаны как TEXT строго в формате YYYY-MM-DD: при таком формате сравнение строк сохраняет порядок дат.
Что передать ChatGPT
Скопируйте заготовку ниже и вместо строки в квадратных скобках вставьте весь предыдущий блок со схемой и записями. Так модель получит и названия полей, и данные для разбора результата.
Напиши SELECT для SQLite 3.45.3.
Схема и учебные данные:
[Вставьте весь блок CREATE TABLE и INSERT из примера выше.]
units — неотрицательные целые числа.
ordered_at — TEXT строго в формате YYYY-MM-DD.
status = 'shipped' означает отгруженную позицию,
status = 'cancelled' — отменённую.
Выбери только строки со status = 'shipped' за сентябрь 2026 года:
ordered_at >= '2026-09-01' и ordered_at < '2026-10-01'.
Сгруппируй их по product_name и посчитай SUM(units).
Оставь группы, где сумма не меньше 5.
Верни product_name и сумму под именем total_units.
Отсортируй по total_units по убыванию, затем по product_name
по возрастанию.
Дай запрос для SQLite, объясни фильтрацию строк и групп
и покажи ожидаемый результат на этих данных.
Условие status = 'shipped' точнее, чем «исключи отменённые»: если появится статус ожидающей обработки позиции, она тоже не попадёт в отгрузку. Такие уточнения полезнее просьбы «дай правильный SQL». Для своей задачи используйте структуру промпта с контекстом и ограничениями. Достаточно схемы и вымышленных записей; пароли и реальные персональные данные в запрос не включайте.
После первого ответа выполните SQL. Если результат расходится с ожидаемым, передайте модели конкретные строки или текст ошибки и уточните условие. Такой подход соответствует рекомендациям OpenAI по работе с промптами: дать достаточный контекст и доработать запрос после проверки ответа.
Этот текстовый запрос можно отправить в бесплатном ChatGPT с учётом ограничений использования. Если вы уже решили пользоваться платным тарифом, можно купить месячную подписку ChatGPT в Amber Market.
SELECT для этой схемы
В той же учебной базе выполните:
SELECT
product_name,
SUM(units) AS total_units
FROM order_items
WHERE status = 'shipped'
AND ordered_at >= '2026-09-01'
AND ordered_at < '2026-10-01'
GROUP BY product_name
HAVING SUM(units) >= 5
ORDER BY total_units DESC, product_name ASC;
Нижняя граница периода включена, верхняя — нет: запрос берёт даты с 1 сентября до 1 октября. Здесь сравниваются именно текстовые значения YYYY-MM-DD; при другом формате хранения дат условие нужно пересмотреть.
WHERE оставляет сентябрьские отгрузки. Затем GROUP BY product_name собирает строки каждого товара в группу, и SUM(units) считает её объём. Условие HAVING SUM(units) >= 5 применяется к сумме группы. Если поставить units >= 5 в WHERE, строка с четырьмя блокнотами пропадёт ещё до суммирования — получится другая задача.
ORDER BY явно задаёт порядок: сначала большая сумма, при равенстве — название по возрастанию. Само группирование нужной сортировки не гарантирует. Такое разделение фильтрации строк, группирования и отбора групп описано в документации SQLite по SELECT.
Сверьте строки результата
На SQLite 3.45.3 приведённый запрос с этими семью исходными строками возвращает:
product_name total_units
------------ -----------
Блокнот 9
Папка 5
У «Блокнота» две сентябрьские отгрузки: 4 + 5 = 9. У «Папки» остаётся 5; отменённые 20 единиц отсекает WHERE. «Ручка» с суммой 3 не проходит HAVING. Августовские 50 и октябрьские 100 исключены границами периода. Девять идёт перед пятью — порядок тоже совпал.
Эта проверка подтверждает результат конкретного запроса на заданных данных. Для своей схемы добавьте случаи, на которых легко ошибиться: дату на границе периода, другой статус, сумму ровно на пороге. Ожидаемые строки посчитайте сами и сравните с выполнением, а не только с объяснением модели.
Если ваши исходные данные находятся в Excel, такой подсчёт можно начать прямо в таблице — разберите формулы Excel с ChatGPT.
Источники
- Prompt engineering best practices for ChatGPTOpenAI
- ChatGPT Free Tier FAQOpenAI
- SELECTSQLite