Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации



Вы уже умеете писать запросы SQL, но иногда сталкиваетесь с «запутанными» условиями, множеством таблиц и сложными агрегатами. Искусственный интеллект — это ваш быстрый помощник, который превратит описание задачи на обычном языке в готовый запрос за секунды. В этом уроке вы узнаете, как формулировать запросы к ИИ, какие детали схемы нужно указывать, как проверять полученный код и как избежать типичных ошибок.
| Проблема | Как ИИ решает | Пример |
|---|---|---|
Длинные условия — много AND/OR |
Генерирует их автоматически, соблюдая приоритеты | «Выберите клиентов, у которых сумма покупок > 1000 и которые сделали заказ в последнем месяце». |
| Неизвестные функции | Предлагает нужные агрегаты, окна, CTE | «Посчитайте средний чек за каждый день». |
| Ошибки в синтаксисе | Быстрая проверка и исправление | ИИ указывает, где забыли запятую или скобку. |
Именно потому, что ИИ «видит» ваш запрос в контексте схемы, он может предложить оптимальное решение, а вам остаётся лишь проверить и при необходимости поправить.
| Термин | Определение |
|---|---|
| Prompt | Текстовое описание задачи, которое вы передаёте ИИ. |
| Schema | Структура базы данных: таблицы, столбцы, типы, ключи. |
| DDL | Data Definition Language – команды создания/изменения схемы (CREATE TABLE, ALTER). |
| DML | Data Manipulation Language – команды работы с данными (SELECT, INSERT). |
| CTE (Common Table Expression) | Временный набор результатов, объявляемый через WITH. |
| Parameterization | Подстановка параметров вместо конкатенации строк, защищающая от SQL‑инъекций. |
Все эти термины будут использоваться в примерах, поэтому запоминайте их заранее.
Укажите цель – что именно нужно получить.
Пример: «Получить список топ‑5 товаров по выручке».
Опишите входные данные – какие таблицы и столбцы задействованы.
Пример: «Таблица orders (order_id, product_id, quantity, price) и products (product_id, name)».
Добавьте ограничения и сортировку – фильтры, группировки, порядок.
Пример: «Только за 2023 год, сортировать по убыванию выручки».
Укажите желаемый формат вывода – список, агрегаты, вложенные запросы.
Пример: «Вывести product_name, total_sales».
Не забудьте про ограничения – ограничения на количество строк, безопасность.
Пример: «Не использовать подзапросы более двух уровней».
Совет: пишите запрос в виде небольшого диалога, а не одного длинного абзаца. ИИ лучше «понимает» короткие, чётко разделённые части.
Вы:
У меня есть две таблицы:
employees(id, name, department_id, salary) иdepartments(id, dept_name). Нужно получить среднюю зарплату по каждому отделу, но только для тех отделов, где средняя зарплата выше 50000. Выведитеdept_nameиavg_salary, отсортировав поavg_salaryубыванию.
ИИ (результат):
WITH dept_avg AS (
SELECT
d.id,
d.dept_name,
AVG(e.salary) AS avg_salary
FROM
departments d
JOIN
employees e ON e.department_id = d.id
GROUP BY
d.id, d.dept_name
HAVING
AVG(e.salary) > 50000
)
SELECT
dept_name,
avg_salary
FROM
dept_avg
ORDER BY
avg_salary DESC;
Пояснение ИИ:
WITH dept_avg AS (…) — CTE, упрощает дальнейший запрос. HAVING — фильтр после агрегирования. ORDER BY … DESC — сортировка по убыванию. | Шаг | Что делаем | Почему |
|---|---|---|
| 1️⃣ | Сравниваем названия столбцов с Schema | Чтобы убедиться, что ИИ не придумал несуществующие поля. |
| 2️⃣ | Выполняем запрос в тестовой среде (sandbox) | Проверка синтаксиса и логики без риска продакшн‑данных. |
| 3️⃣ | Сравниваем результат с ожидаемым вручную | Убедиться, что бизнес‑правила соблюдены. |
| 4️⃣ | Добавляем Parameterization если запрос содержит пользовательские данные | Защита от SQL‑инъекций. |
| 5️⃣ | Оптимизируем план выполнения (EXPLAIN) |
Выявить потенциальные узкие места. |
Если на каком‑то шаге обнаружена ошибка, просто уточните её в следующем запросе к ИИ: «В столбце salary тип DECIMAL(10,2), а я получил ошибку «тип данных не совместим»». ИИ автоматически поправит запрос.
| Практика | Описание | Пример |
|---|---|---|
| Ясность | Указывайте точные типы данных, если они влияют на синтаксис. | «price — NUMERIC(12,2)». |
| Контекст | При повторных запросах передавайте часть предыдущего кода. | «Продолжи, используя CTE dept_avg из предыдущего сообщения». |
| Ограничения | Указывайте максимум строк (LIMIT) и запрещённые конструкции. |
«Не использовать DISTINCT». |
| Тестовый набор | Попросите ИИ сгенерировать небольшие тестовые данные. | «Создай 5‑строк таблицы employees для проверки». |
| Пошаговый подход | Сначала попросите схему, потом запрос, потом объяснение. | 1️⃣ «Опиши схему», 2️⃣ «Сгенерируй запрос», 3️⃣ «Объясни каждый шаг». |
| Платформа | Особенности | Как подключить |
|---|---|---|
| ChatGPT (OpenAI) | Поддержка «code interpreter», возможность задавать системные подсказки. | Включить режим «Developer Mode», добавить system‑сообщение с описанием схемы. |
| GitHub Copilot | Интеграция в VS Code, автодополнение SQL‑блоков. | Установить расширение, включить AI Pair Programmer. |
| Google Gemini | Хорошо работает с мультимодальными запросами (таблицы + текст). | Через API, передавая schema в metadata. |
| SQL‑Assist (Open‑source) | Локальная модель, работает без интернета. | Запустить Docker‑контейнер, загрузить schema.json. |
Все они используют один и тот же принцип: Prompt + Schema → SQL. Выбирайте тот, который удобнее в вашей рабочей среде.
| Ошибка | Причина | Решение |
|---|---|---|
Column not found |
ИИ использовал псевдоним, не объявленный в SELECT. |
Добавьте AS‑псевдоним в CTE или уточните в Prompt. |
Ambiguous column |
Одинаковые имена столбцов в разных таблицах без префикса. | Указывайте таблицу (t1.column). |
Incorrect data type |
Попытка сравнить VARCHAR с INT. |
Приведите типы (CAST(... AS INT)). |
Performance issue |
ИИ использовал подзапрос вместо JOIN. | Попросите переписать с JOIN и добавить индексы. |
SQL injection risk |
Конкатенация пользовательского ввода. | Перепишите запрос с параметрами (?, :name). |
Задача:
Нужно получить список студентов, которые получили более 90 % от максимального балла в каждом предмете, а также вывести их средний балл по всем предметам. Таблицы:
students(id, name),grades(student_id, subject_id, score),subjects(id, title).
Prompt:
Опиши запрос, используя CTE, без подзапросов более одного уровня, выводя
student_name,subject_title,score,overall_avg. Сортировать поoverall_avgубыванию.
Ответ ИИ:
WITH max_score_per_subject AS (
SELECT
subject_id,
MAX(score) AS max_score
FROM
grades
GROUP BY
subject_id
),
high_achievers AS (
SELECT
g.student_id,
g.subject_id,
g.score,
s.title AS subject_title,
st.name AS student_name
FROM
grades g
JOIN
max_score_per_subject m ON g.subject_id = m.subject_id
JOIN
subjects s ON g.subject_id = s.id
JOIN
students st ON g.student_id = st.id
WHERE
g.score >= 0.9 * m.max_score
),
overall_average AS (
SELECT
student_id,
AVG(score) AS overall_avg
FROM
grades
GROUP BY
student_id
)
SELECT
ha.student_name,
ha.subject_title,
ha.score,
oa.overall_avg
FROM
high_achievers ha
JOIN
overall_average oa ON ha.student_id = oa.student_id
ORDER BY
oa.overall_avg DESC;
Разбор:
max_score_per_subject — вычисляет максимум в каждом предмете. high_achievers — фильтрует студентов, превысивших 90 % от максимального. overall_average — средний балл по всем предметам для каждого студента. SELECT соединяет всё вместе и сортирует.sql_prompt.txt. schema.json. generated.sql. EXPLAIN и выводит план. Пример кода (Python):
import openai, json, subprocess
with open('schema.json') as f:
schema = json.load(f)
task = "Получить топ‑10 самых продаваемых товаров за последний квартал."
prompt = f"""Schema:
{json.dumps(schema, indent=2)}
Task: {task}
Generate SQL only, no explanation."""
response = openai.ChatCompletion.create(
model="gpt-4o",
messages=[{"role":"system","content":"You are a helpful SQL assistant."},
{"role":"user","content":prompt}]
)
sql = response.choices[0].message.content.strip()
print(sql)
# optional: run EXPLAIN
subprocess.run(["psql", "-c", f"EXPLAIN {sql}"])
Упражнение 1
Таблицы: orders (order_id, customer_id, order_date, total_amount) и customers (customer_id, city).
Задача: Сформулируйте Prompt, который попросит ИИ вывести количество заказов и суммарную сумму по каждому городу за 2022 год, только для городов, где суммарная сумма превышает 500 000.
Упражнение 2
Сгенерируйте запрос, который найдёт всех сотрудников, получивших зарплату выше среднего по их отделу, и выведет employee_name, department_name, salary. Таблицы: employees (id, name, department_id, salary) и departments (id, name).
Упражнение 3
Опишите, как добавить parameterization к запросу из упражнения 2, если department_id будет передаваться пользователем. Приведите пример кода на Python с использованием psycopg2.
Упражнение 4
Вы получили от ИИ запрос, но в нём присутствует подзапрос более двух уровней. Переформулируйте Prompt, чтобы ИИ использовал только CTE и не более одного уровня вложенности.
Упражнение 5
Сравните план выполнения (EXPLAIN) двух вариантов одного и того же запроса: один с JOIN, второй с подзапросом в WHERE. Какие различия в стоимости вы видите? Какие рекомендации дадите для оптимизации?
Итоги
EXPLAIN для читаемости и производительности.