ИИ и нейросети

ИИ для сложных SQL-запросов: JOIN, CTE, оконные функции

Как эффективно использовать ChatGPT и o1 для написания sql запросы с join sql, подзапросами в sql, оконными функциями sql, CTE. Почему нужны итерации и как оптимизировать процесс с пайплайнами LLM и промптами для оптимизация sql запросов.

5 ответов 1 просмотр

Как эффективно использовать ИИ для написания и доработки сложных SQL-запросов с JOIN, оконными функциями, подзапросами, CTE и иерархическими запросами? Почему чат-боты требуют множества итераций и как оптимизировать процесс?

Эффективно использовать ИИ для написания sql запросы с join sql, оконными функциями sql, подзапросами в sql и CTE помогает детальный промпт с DDL-схемой БД и примерами данных. Чат-боты вроде ChatGPT или o1 требуют множества итераций из-за галлюцинаций и потери контекста, но это решается пайплайнами LLM, отдельными чатами и проверкой в IDE вроде VSCode. Оптимизация sql запросов ускоряется через chain-of-thought и RAG, снижая ошибки на 70-80%.

Схема LLM-пайплайна для генерации SQL-запросов

Содержание


Как использовать ИИ для написания sql запросы с JOIN и подзапросами в sql

Начать стоит с четкого промпта. Опишите схему БД: таблицы, ключи, типы данных. Добавьте семантику — что значит каждый столбец. Для join sql попросите ИИ сгенерировать INNER JOIN или LEFT JOIN шаг за шагом.

Представьте: у вас таблицы orders и customers. Промпт: “Напиши sql запросы для соединения orders (id, customer_id, amount) с customers (id, name) по LEFT JOIN, чтобы показать всех клиентов, даже без заказов. Добавь коррелированный подзапрос в sql для подсчета среднего чека по клиенту.”

ChatGPT выдает что-то вроде:

sql
SELECT 
 c.name,
 o.amount,
 (SELECT AVG(o2.amount) FROM orders o2 WHERE o2.customer_id = c.id) AS avg_check
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id;

Это работает, но проверьте на реальных данных. А CROSS JOIN? Идеален для декартова произведения, например, категорий товаров. В статье на Хабр показывают, как ChatGPT генерирует CROSS JOIN для AdventureWorks2019 — комбинирует подкатегории продуктов без ошибок.

Подзапросы в sql — коррелированные или нет — ИИ справляется, если уточнить. Но без контекста он может забыть фильтр в WHERE.


Оконные функции sql и их генерация через нейросеть для sql запросов

Оконные функции sql вроде ROW_NUMBER(), LAG() или RANK() — это магия для ранжирования без группировки. Нейросеть для sql запросов их любит, но путает PARTITION BY.

Промпт: “Создай запрос с оконными функциями sql: найди топ-3 заказа по сумме за клиента в таблице orders (customer_id, order_date, amount). Используй ROW_NUMBER OVER() и LAG для сравнения дат.”

Результат от o1 или GPT-4o:

sql
SELECT 
 customer_id,
 amount,
 order_date,
 ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY amount DESC) AS rn,
 LAG(amount) OVER (PARTITION BY customer_id ORDER BY order_date) AS prev_amount
FROM orders
WHERE rn <= 3;

Почему это круто? ИИ объяснит логику, если попросить chain-of-thought. Но в тестах на LEFT JOIN o1 иногда меняет условия, теряя строки — всегда тестируйте на подвыборке.

Идеально для дедупликации: ROW_NUMBER() по MIN(date) с JOIN.


CTE и рекурсивные запросы: cte sql что это и примеры с ИИ

CTE sql что это? Common Table Expression — временная таблица для читаемости. Рекурсивные CTE — для иерархий, деревьев.

Промпт для ИИ: “Объясни cte sql что это и напиши рекурсивный CTE для иерархии категорий (category_id, parent_id, name). Покажи все уровни от корня.”

sql
WITH RECURSIVE category_tree AS (
 SELECT category_id, parent_id, name, 0 AS level
 FROM categories WHERE parent_id IS NULL
 UNION ALL
 SELECT c.category_id, c.parent_id, c.name, ct.level + 1
 FROM categories c
 JOIN category_tree ct ON c.parent_id = ct.category_id
)
SELECT * FROM category_tree ORDER BY level, name;

Хабр MTS подтверждает: ChatGPT генерирует такие CTE с оконными функциями sql без проблем, если дать схему.

Рекурсивные — хитрее. ИИ может зациклиться, но с лимитом глубины (MAXRECURSION в SQL Server) все ок.


Иерархические запросы sql и self join sql с помощью чат-ботов

Self join sql — для само-соединения, идеален для боссов-подчиненных. Иерархические запросы sql сочетают SELF JOIN с CTE.

Пример промпта: “Self join sql для сотрудников (employee_id, manager_id, name): покажи подчиненных каждого менеджера.”

sql
SELECT 
 m.name AS manager,
 e.name AS employee
FROM employees e
INNER JOIN employees m ON e.manager_id = m.employee_id;

Для глубины — рекурсивный CTE. Тот же Хабр демонстрирует SELF JOIN на HumanResources.Employee — выводит пары с одинаковым полом.

SELF JOIN для иерархии сотрудников

Чат-боты ускоряют, но уточняйте “без циклов, только прямые связи”.


Почему чат-боты требуют множества итераций для сложные запросы sql

Просто: ИИ не знает вашу БД. Нет глубокого понимания схемы, семантики. Галлюцинирует поля, путает JOIN с подзапросами в sql. Контекст теряется после 10k токенов.

В обсуждении на Хабр Q&A разработчики отмечают: для сложные запросы sql с оконными функциями sql нужно 5-10 итераций. Почему? Нет памяти о предыдущих ошибках. Плюс “вайбкодинг” — код выглядит круто, но не работает.

o1 лучше (chain-of-thought внутри), но все равно меняет логику, как в кейсе LEFT JOIN.

Итерации — норма. Но их можно сократить.


Оптимизация sql запросов: как писать sql запросы эффективно с ИИ

Секрет в промптах. 1) Соберите ТЗ: DDL + 10 строк данных + желаемый вывод. 2) Chain-of-thought: “Подумай шаг за шагом”. 3) Отдельные чаты: один для JOIN, другой для оконок.

Для оптимизация sql запросов: попросите “добавь индексы, убери подзапросы на JOIN”. Хабр PostgresPro советует пайплайн: генератор → критик → executor с fixerror (3 итерации max).

Используйте RAG — загружайте схему в векторное хранилище. Проверяйте в dbForge или DBeaver.

Результат? Сложные запросы sql за 2-3 шага вместо 10.

Диаграмма процесса ChatGPT с SQL

Практические примеры: join sql примеры и оконные функции sql пример

Join sql пример: LEFT JOIN с CTE.

sql
WITH sales_cte AS (
 SELECT customer_id, SUM(amount) AS total
 FROM orders GROUP BY customer_id
)
SELECT c.name, s.total
FROM customers c
LEFT JOIN sales_cte s ON c.id = s.customer_id;

Оконные функции sql пример: ранжирование.

sql
SELECT 
 product,
 sales,
 ROW_NUMBER() OVER (ORDER BY sales DESC) AS rank
FROM monthly_sales;

Тестируйте: скопируйте в IDE, запустите EXPLAIN.


Инструменты и пайплайны для оптимизация sql запросов

VSCode + GitHub Copilot или Qwen Code — лучше чат-ботов для sql запросы. Автодополнение с контекстом схемы.

Пайплайны: LangChain с SQLAgent — executor проверяет и фиксит. PostgresPro описывает: JSON-экстрактор + критик снижает ошибки.

o1 > GPT-4o для сложные запросы sql. Для больших схем — Continue.dev с локальными моделями.

Начните с промпта-шаблона: “Схема: [DDL]. Задача: [описание]. Шаги: 1) …”


Источники

  1. Хабр Q&A — Обсуждение проблем ИИ с SQL и советы по чатам/IDE: https://qna.habr.com/q/1409184
  2. ChatGPT для JOIN и CTE в AdventureWorks — Примеры CROSS JOIN, SELF JOIN, оконных функций: https://habr.com/ru/companies/ru_mts/articles/748112/
  3. LLM-пайплайн для SQL — Chain-of-thought, критик, executor для оптимизации: https://habr.com/ru/companies/postgrespro/articles/907614/
  4. o1 для сложных SQL-запросов — Тесты CTE, оконок, проблемы с логикой: https://leftjoin.ru/blog/data-analysis/o1-v-pomoshh-data-inzheneru-mozhet-li-ii-napisat-slozhnyj-sql-zapros/

Заключение

ИИ революционизирует написание sql запросы с join sql и CTE, но ключ — в детальных промптах и пайплайнах. Итерации неизбежны из-за контекста, однако VSCode Copilot, RAG и 3-шаговые проверки сократят их вдвое. Практикуйтесь на реальных схемах — и сложные запросы sql станут рутиной.

R

Современный ИИ не обладает глубоким пониманием контекста БД, поэтому для сложных запросов SQL с JOIN, подзапросами и оконными функциями требуется множество итераций. Собирайте полное ТЗ с DDL схемой, семантикой данных заранее, используйте отдельные чаты для уточнений и проверяйте генерируемые SQL-запросы несколькими моделями.

Для оптимизации SQL-запросов переходите на VSCode с плагинами вроде Qwen Code или GitHub Copilot — они лучше чат-ботов справляются с написанием SQL-запросов, минимизируя “вайбкодинг” и ошибки.

А

ChatGPT эффективно генерирует JOIN SQL, включая CROSS JOIN, SELF JOIN для иерархических запросов SQL, а также CTE с оконными функциями SQL вроде ROW_NUMBER() OVER().

Пример: CROSS JOIN для категорий товаров в AdventureWorks2019 или SELF JOIN для сотрудников по иерархии.

Скриншот результата CROSS JOIN запроса в SQL Server, показывающий комбинации категорий и подкатегорий продуктов Скриншот SELF JOIN запроса для иерархии сотрудников с одинаковым полом в таблице HumanResources.Employee

Чат-боты требуют итераций из-за потери контекста — оптимизируйте, уточняя таблицы/поля, тестируя на подвыборках и комбинируя с dbForge Studio для проверки сложных запросов SQL.

С

LLM-пайплайн для написания SQL-запросов: chain of thought → генератор → экстрактор (JSON) → критик → SQL-Executor с fixerror, ограничивая итерации до 3.

Поддерживает JOIN, подзапросы в SQL, CTE, оконные функции SQL и большие схемы via RAG.

Общая схема LLM-пайплайна для генерации SQL: от чата к chain of thought, генератору, критику и executor

Это оптимизирует процесс для сложных запросов SQL, снижая галлюцинации и ошибки семантики по сравнению с простыми чат-ботами.

Alexandra Naumenko / Автор статей по data analysis

Модель o1 генерирует сложные запросы SQL с CTE и оконными функциями для дедупликации (по uid/client_id с MIN датой), но может менять логику WHERE, теряя строки — проверяйте результаты.

Детальный промпт с примерами таблиц (prod_events_fdw.events, yandex_metrica.sessions_stats) минимизирует итерации для JOIN SQL и оптимизации SQL-запросов.

ИИ полезен, но уступает человеку в нюансах для подзапросов в SQL.

Авторы
R
Разработчик
Дима Соколов / Веб-разработчик
Веб-разработчик
А
Технический писатель
С
Программист-математик
Alexandra Naumenko / Автор статей по data analysis
Автор статей по data analysis
Проверено модерацией
НейроОтветы
Модерация