تبدیل سؤال فارسی به کوئری SQL
ساختار جدولها و سؤال شما را بگیرد و کوئری SQL صحیح، بهینه و توضیحدار بنویسد.
متن پرامپت
پایگاه داده من [نوع پایگاه داده] است و این جدولها را دارد:
[ساختار جدولها]
یک کوئری SQL بنویس که به این سؤال پاسخ بدهد: [سؤال]
- فقط از جدولها و ستونهایی که دادم استفاده کن.
- کوئری را با توضیح خطبهخط فارسی بیاور.
- اگر سؤال مبهم است، فرضت را صریح بنویس.
- اگر ایندکسی سرعت این کوئری را بهتر میکند، پیشنهاد بده.
بخشهایی که باید جایگزین کنید
- [نوع پایگاه داده]: MySQL، PostgreSQL، SQLite، SQL Server…
- [ساختار جدولها]: نام جدولها و ستونها با نوعشان (یا دستور CREATE TABLE)
- [سؤال]: مثلاً «۱۰ مشتری که در سه ماه گذشته بیشترین خرید را داشتهاند»
چرا این پرامپت خوب کار میکند؟
مدلها وقتی ساختار واقعی جدولها را ندارند، نام ستونها را حدس میزنند. با دادن ساختار و ممنوع کردن ستونهای ناموجود، کوئری مستقیم قابل اجراست.
نکتههای حرفهای
کوئری را ابتدا روی نسخه آزمایشی پایگاه داده اجرا کنید، بهخصوص اگر UPDATE یا DELETE دارد.
نتیجه اجرا روی مدلها
نمونه پرامپت اجراشده (با جایگذاری متغیرها):
پایگاه داده من PostgreSQL است و این جدولها را دارد:
customers(id serial primary key, name text, city text, created_at timestamp)
orders(id serial primary key, customer_id int references customers(id), total_amount numeric, status text, created_at timestamp)
یک کوئری SQL بنویس که به این سؤال پاسخ بدهد: ۱۰ مشتری که در ۹۰ روز گذشته بیشترین مبلغ خرید موفق (status = 'paid') را داشتهاند، همراه با تعداد سفارش و مجموع مبلغ.
- فقط از جدولها و ستونهایی که دادم استفاده کن.
- کوئری را با توضیح خطبهخط فارسی بیاور.
- اگر سؤال مبهم است، فرضت را صریح بنویس.
- اگر ایندکسی سرعت این کوئری را بهتر میکند، پیشنهاد بده.
نمونه اولیه که Claude Opus 5.5 هنگام ساخت سایت نوشت. با اجرای آزمایشگاه (python -m sitegen lab --force) در شرایط استاندارد دوباره تولید میشود.
SELECT
c.id,
c.name,
COUNT(o.id) AS order_count,
SUM(o.total_amount) AS total_spent
FROM customers AS c
JOIN orders AS o
ON o.customer_id = c.id
WHERE o.status = 'paid'
AND o.created_at >= NOW() - INTERVAL '90 days'
GROUP BY c.id, c.name
ORDER BY total_spent DESC, c.id
LIMIT 10;
توضیح خطبهخط
SELECT ...: شناسه و نام مشتری، تعداد سفارشها و مجموع مبلغ را برمیگرداند.FROM customers AS c JOIN orders AS o ON ...: هر مشتری را به سفارشهایش وصل میکند. چون ازJOINمعمولی استفاده شده، مشتریانی که سفارشی ندارند خودبهخود حذف میشوند.WHERE o.status = 'paid': فقط سفارشهای موفق شمرده میشوند.AND o.created_at >= NOW() - INTERVAL '90 days': فقط سفارشهای ۹۰ روز اخیر.GROUP BY c.id, c.name: نتایج را برای هر مشتری جمع میزند.ORDER BY total_spent DESC, c.id: بیشترین مبلغ اول؛ در صورت برابری، شناسه کوچکتر جلوتر قرار میگیرد تا ترتیب نتیجه همیشه ثابت باشد.LIMIT 10: فقط ۱۰ مشتری اول.
فرضها
- «۹۰ روز گذشته» بر اساس زمان ثبت سفارش (
created_atدر جدولorders) حساب شده، چون ستون جداگانهای برای زمان پرداخت وجود ندارد. NOW()به منطقه زمانی تنظیمشده در سرور پایگاه داده بستگی دارد.
پیشنهاد ایندکس
اگر جدول سفارشها بزرگ است، این ایندکس جزئی (Partial Index) فیلتر وضعیت و تاریخ را سریع میکند و ستونهای لازم را هم همراه دارد:
CREATE INDEX idx_orders_paid_created
ON orders (created_at)
INCLUDE (customer_id, total_amount)
WHERE status = 'paid';
(INCLUDE از PostgreSQL 11 به بعد پشتیبانی میشود.)
خروجیها بدون ویرایش و مستقیم از خود مدلها ذخیره شدهاند.