كتابة استعلام SQL من سؤال بالعربية إلى استعلام مُختبَر
كتابة JOIN صحيح أو دالة نافذة من الذاكرة تأخذ وقتًا، وGROUP BY خاطئ يعطي أرقامًا تبدو سليمة وهي ليست كذلك. الصق بنية جداولك واكتب سؤالك بالعربية. يكتب وكيلك في todo.is استعلامًا مع تعليقات يناسب قاعدة بياناتك، ويشغّله على بيانات نموذجية في مساحة عمله، ويريك النتيجة.
الأمر
- اكتب لي استعلام SQL لقاعدة [نوع قاعدة البيانات] يجيب عن: [سؤالك]. جداولي: [بنية الجداول]. أضف تعليقات تشرح كل جزء، واستخدم أسماء مستعارة واضحة، وتجنّب أي شيء يكون بطيئًا على [حجم الجداول]. أنشئ مجموعة بيانات نموذجية صغيرة تطابق جداولي، وشغّل الاستعلام عليها في مساحة عملك، وأرني الناتج حتى أتأكد أنه يعمل. إذا كان في سؤالي أي غموض (مثل طريقة احتساب المرتجعات)، فأخبرني بما افترضته. اكتب الشرح بالعربية واترك الكود وأسماء الأعمدة كما هي.
ما الذي تغيّره
- [نوع قاعدة البيانات]: مثل «PostgreSQL 15» أو «MySQL 8» أو «SQL Server» أو «SQLite» أو «BigQuery» أو «Oracle».
- [سؤالك]: بكلمات عادية، مثل «أعلى 10 عملاء من حيث الإيرادات بالريال في آخر 90 يومًا مع عدد طلباتهم».
- [بنية الجداول]: الصق أوامر CREATE TABLE أو اكتب الجداول والأعمدة، مثل «orders(id, customer_id, total, status, created_at)». أو أرفق ملف المخطط.
- [حجم الجداول]: عدد الصفوف التقريبي، مثل «جدول orders فيه 20 مليون صف» أو «صغيرة، أقل من 100 ألف صف».
مثال على النتيجة
- أعلى 10 عملاء من حيث الإيرادات في آخر 90 يومًا (PostgreSQL)
- -- الطلبات المدفوعة في آخر 90 يومًا بعد خصم المرتجعات
- WITH recent AS (
- SELECT o.customer_id,
- o.id AS order_id,
- o.total - COALESCE(r.amount, 0) AS net_total
- FROM orders o
- LEFT JOIN refunds r ON r.order_id = o.id -- يُبقي الطلبات التي لا مرتجع لها
- WHERE o.status = 'paid'
- AND o.created_at >= now() - interval '90 days'
- )
- SELECT c.id,
- c.name,
- COUNT(*) AS orders,
- SUM(rc.net_total) AS revenue
- FROM recent rc
- JOIN customers c ON c.id = rc.customer_id
- GROUP BY c.id, c.name
- ORDER BY revenue DESC
- LIMIT 10;
- ماذا يفعل كل جزء
- • WITH recent AS (...) يجمع الطلبات المطلوبة أولًا، فيبقى الاستعلام الرئيسي سهل القراءة
- • LEFT JOIN refunds يُبقي الطلبات التي لم تُسترجع، وCOALESCE تحوّل المرتجع الغائب إلى صفر
- • GROUP BY c.id, c.name يعطي صفًا واحدًا لكل عميل، والتجميع بالمعرّف يمنع دمج عميلين بالاسم نفسه، وهذا شائع مع أسماء مثل «محمد العتيبي»
- • ORDER BY revenue DESC LIMIT 10 يحتفظ بأعلى 10
- تشغيل تجريبي (500 طلب وهمي و60 عميلًا)
- • 1. مؤسسة النخيل للتجارة: 14 طلبًا، 8,920.00 ريال
- • 2. استوديو ريم للتصميم: 9 طلبات، 7,410.50 ريال
- • 3. شركة الأفق للمقاولات: 11 طلبًا، 6,985.00 ريال
- الافتراضات
- • «الإيرادات» تعني الطلبات المدفوعة ناقص المرتجعات، والطلبات المعلّقة والملغاة مستبعدة
- • مرتجع واحد على الأكثر لكل طلب. إن كنت تسمح بأكثر من مرتجع، فيجب جمع المرتجعات لكل طلب أولًا
- الأداء على 20 مليون صف
- • فهرس على orders (status, created_at) يجعل شرط WHERE يتخطى الصفوف القديمة
- • شغّل EXPLAIN ANALYZE قبل استخدامه في لوحة تقارير
- إذا كانت أسماء العملاء بالعربية
- • تأكد أن ترميز قاعدة البيانات UTF-8 (أو utf8mb4 في MySQL) حتى لا تظهر الأسماء رموزًا غريبة
- • في SQL Server استخدم أعمدة NVARCHAR واكتب النصوص العربية بالشكل N'الرياض'
كيف تنفّذه مع todo.is
- انسخ البرومبت واكتب نوع قاعدة بياناتك وسؤالك وجداولك.
- الصق أوامر CREATE TABLE أو أرفق ملف المخطط على شاشة «اليوم» في todo.is.
- يكتب وكيلك الاستعلام، ويشغّله على بيانات نموذجية واقعية، ويريك جدول النتائج.
- انسخ الاستعلام (أو حمّل ملف .sql) وشغّله في أداة قاعدة البيانات لديك.
- أرسل له أي رسالة خطأ أو رقم غريب فيصلح الاستعلام.
نصائح لنتيجة أفضل
- اذكر نوع قاعدة البيانات دائمًا. دوال التاريخ وLIMIT مقابل TOP والتعامل مع النصوص تختلف بين PostgreSQL وMySQL وSQL Server وBigQuery.
- شارك البنية لا البيانات. أسماء الأعمدة وأنواعها تكفي لكتابة استعلام صحيح.
- عرّف الكلمات الملتبسة مثل «عميل نشط» أو «الإيرادات» (قبل ضريبة القيمة المضافة أم بعدها؟). أغلب الأرقام الخاطئة سببها تعريف غير واضح.
- جرّب الاستعلامات الجديدة بمستخدم للقراءة فقط أو على نسخة من القاعدة قبل تشغيل UPDATE أو DELETE.
- إن كنت تحتاج التقرير نفسه كل أسبوع، اجعله مهمة متكررة يرسل لك فيها وكيلك ملاحظات الاستعلام بالبريد.
كتابة استعلام SQL: أسئلة شائعة
- هل يتصل الوكيل بقاعدة بياناتي ويشغّل الاستعلام؟ لا. لا يسجّل الدخول إلى قاعدة بياناتك. يشغّل الاستعلام على بيانات نموذجية في مساحة عمله، وأنت تشغّل الاستعلام النهائي في أداتك.
- ما الفرق بين WHERE وHAVING؟ WHERE تصفّي الصفوف قبل التجميع، وHAVING تصفّي المجموعات بعده. مثلًا HAVING COUNT(*) > 5 تُبقي العملاء الذين لديهم أكثر من 5 طلبات فقط.
- هل يمكنه شرح استعلام بطيء أو تسريعه؟ نعم. الصق الاستعلام ومخرجات EXPLAIN إن أمكن. يشير إلى الفهارس الناقصة والاستعلامات الفرعية غير الضرورية والدوال على الأعمدة المفهرسة، ثم يعيد كتابته.
- هل يمكنني كتابة السؤال بالعربية؟ نعم. اكتب سؤالك بالعربية، ويكتب وكيلك الاستعلام بأسماء الأعمدة كما هي في جداولك، والشرح والتعليقات بالعربية إن طلبت ذلك.
- هل لصق المخطط آمن؟ يبقى المخطط في مساحة عمل وكيلك الخاصة ولا يستخدمه غيره. لا ترسل بيانات حقيقية أو كلمات مرور، فهي غير ضرورية.
JavaScript is required to use the todo.is app.