2.2 · محرر الاستعلامات وSQL

المستوى 2 · المتوسط: البيانات والاستعلامات والتقارير

2.2محرر الاستعلامات وSQL

الهدف: إنشاء استعلامات بالمحرر المرئي (التحديد، الربط، الحسابات) وكتابة SQL لاستجواب البيانات بكفاءة.
الوقت المقدّر: 11 دقيقة · قراءة ذاتية · إذا كان لديك 5 دقائق فقط: اقرأ «الأساسي في 30 ثانية» + المخطط.

الأساسي في 30 ثانية

  • الاستعلام هو استجواب لقاعدة البيانات؛ ويوفر WinDev مقاربتين متكاملتين: محرر الاستعلامات المرئي (الذي يولّد SQL) وSQL المباشر للحالات المعقدة.
  • لبنات SQL الأساسية: SELECT (ماذا)، FROM (من أين)، WHERE (التصفية)، ORDER BY (الفرز)، JOIN (دمج ملفات مرتبطة)، GROUP BY + الدوال التجميعية (SUM، COUNT، AVG، MIN/MAX).
  • ممارستان جيدتان رئيسيتان: جعل الاستعلام معامليًا (قابلًا لإعادة الاستخدام)، والتصفية على مستوى القاعدة باستخدام WHERE بدلًا من جلب كل شيء ثم الفرز في WLangage.

حالة مصغّرة متسلسلة — ياسين يستجوب مبيعات تجارته

ياسين، مطوّر WinDev في شركة صغيرة لتجارة العتاد الكهربائي بوهران، عليه أن يعرض بجانب كل طلب اسم العميل لا رمزه وحده. يفتح محرر الاستعلامات المرئي، يختار ملفي Commande وClient، يحدد الحقول النافعة ويضع ربطًا (jointure) على كود العميل: فيولّد WinDev استعلام SQL دون خطر خطأ في الصياغة. وللوحة معلومات المدير، يضيف GROUP BY مع SUM للحصول على رقم الأعمال حسب العميل. ثم يدرك أن الاستعلام مكتوب بشكل ثابت على فترة: فيجعله معامليًا ({pDateDebut, pDateFin}) لإعادة استخدامه شهرًا بعد شهر، ويحرص على إبقاء التصفية على مستوى القاعدة (WHERE) بدلًا من جلب كل الصفوف وفرزها في WLangage.

حالة مستقلة لهذا القسم: تعود في الدرس والمخطط والسكربت وتحدي 48 ساعة للقسم 2.2.

1. طريقتان لكتابة استعلام

الاستعلام هو استجواب لقاعدة البيانات: «أعطني الطلبات التي تتجاوز 1000 € مع اسم العميل». ويوفر WinDev (1) محرر الاستعلامات: أداة مرئية نختار فيها الملفات، ونحدد الحقول، ونضع الشروط والفرز والتجميع — فيولّد WinDev ما يقابلها من SQL، وهو مثالي للبدء دون خطأ في الصياغة؛ (2) SQL المباشر (SELECT، FROM، WHERE، ORDER BY…)، للحالات المعقدة أو عندما تتحكم في اللغة. وبما أن HFSQL يدعم SQL، فإن المقاربتين تتعايشان.

2. لبنات SQL والربط (jointure)

المفاهيم الأساسية: SELECT (أي الحقول)، FROM (أي الملفات)، WHERE (تصفية الصفوف)، ORDER BY (الفرز). والربط (JOIN) يدمج عدة ملفات مرتبطة — ولا غنى عنه لعرض اسم العميل بجانب طلبه. وGROUP BY مع الدوال التجميعية (SUM، COUNT، AVG، MIN/MAX) ينتج الإحصائيات والمجاميع حسب الفئة.

3. إعادة الاستخدام والتصفية على مستوى القاعدة

الاستعلام قابل لإعادة الاستخدام في كل مكان: مصدرًا لحقل Table، أو مصدرًا لـطبعة، أو يُمسح في WLangage. وممارستان جيدتان: المعاملات (تصبح المدينة أو الفترة متغيرًا بدل أن تُكتب كتابةً ثابتة — استعلام واحد قابل لإعادة الاستخدام بدل عشرة)، والتصفية على مستوى القاعدة (ترك المحرك يصفّي بـ WHERE بدلًا من جلب كل شيء وفرزه في WLangage: أسرع بكثير إلى ما لا نهاية).

خطأ شائع في الفهم: «جلب كل البيانات ثم الفرز في WLangage مكافئ؛ وكتابة SQL مباشر إلزامية؛ والاستعلام لا يخدم إلا غرضًا واحدًا». لا، خطأ ثلاثي. جلب كل شيء يستهلك الشبكة والذاكرة ليتخلص في النهاية من معظم الصفوف: أما التصفية على مستوى القاعدة (WHERE) فتتيح للمحرك استخدام فهارسه وإرسال النافع فقط — وهو أكثر أخطاء الأداء شيوعًا. والمحرر المرئي يكفي لمعظم الحالات ويولّد SQL. والاستعلام قابل لإعادة الاستخدام كمصدر جدول أو طبعة أو في WLangage. لذلك يجعل ياسين استعلاماته معاملية ويصفّي على مستوى القاعدة.
من السؤال SQL إلى النتيجة المصفّاة يعبّر المحرر المرئي أو SQL المباشر عن الاستجواب نفسه؛ ويصفّي المحرك ويربط ويجمّع على مستوى القاعدة. محرر مرئي نحددالملفات والحقولSQL المولَّد SELECT /FROM / WHERE / JOINGROUP BY + دوالتجميعية SUM, COUNT, AVGنتيجة مصفّاة مرتبة، معاملية،قابلة لإعادة الاستخدام
يعبّر المحرر المرئي أو SQL المباشر عن الاستجواب نفسه؛ ويصفّي المحرك ويربط ويجمّع على مستوى القاعدة.
نص المخطط (SEO / قارئات الشاشة / الترجمة): 1) ياسين، مطوّر WinDev في شركة صغيرة لتجارة العتاد الكهربائي بوهران، يتعلم أن الاستعلام استجواب لقاعدة البيانات، يُكتب إما بالمحرر المرئي للاستعلامات (الذي يولّد SQL) أو بـ SQL المباشر (SELECT/FROM/WHERE/ORDER BY). 2) ويحفظ اللبنات الأساسية: SELECT (ماذا)، FROM (من أين)، WHERE (التصفية)، ORDER BY (الفرز)، JOIN (دمج ملفات مرتبطة) وGROUP BY + دوال تجميعية (SUM، COUNT، AVG، MIN/MAX) للإحصائيات. 3) لتطبيقه، يربط Client وCommande لعرض اسم العميل، ويحسب رقم الأعمال حسب العميل، ويجعل الاستعلام معامليًا على الفترة ويترك التصفية على مستوى القاعدة. الدرس: الاستعلام قابل لإعادة الاستخدام كمصدر جدول أو طبعة أو في WLangage، والتصفية على مستوى القاعدة أسرع بكثير إلى ما لا نهاية.

🔎 مثال ملموس — 🔎 مثال ملموس — الربط والمعاملات

عرض اسم العميل وحساب رقم الأعمال حسب العميل: يكتب ياسين ما يقابله من SQL.

SELECT C.NomClient, SUM(L.MontantLigne) AS ChiffreAffaires
FROM   Client C
JOIN   Commande CD      ON CD.CodeClient = C.CodeClient
JOIN   LigneCommande L  ON L.NumCommande = CD.NumCommande
WHERE  CD.DateCommande >= {pDateDebut}   // parametre, pas en dur
GROUP  BY C.NomClient
ORDER  BY ChiffreAffaires DESC

Lecture   : JOIN affiche le nom du client ; GROUP BY + SUM donnent le CA
Reflexe   : filtrer C0TE BASE (WHERE) et parametrer la periode

القراءة: JOIN يدمج الملفات المرتبطة لعرض اسم العميل؛ وGROUP BY + SUM يجمعان رقم الأعمال حسب العميل.

الدرس: المعامل {pDateDebut} يجعل الاستعلام قابلًا لإعادة الاستخدام، وWHERE يترك المحرك يصفّي على مستوى القاعدة — أسرع بكثير.

مفردات القسم

استعلام
استجواب لقاعدة البيانات: تحديد البيانات وتصفيتها وفرزها وتجميعها؛ قابل لإعادة الاستخدام كمصدر جدول أو طبعة أو في WLangage.

مثال بسيط: يكتب ياسين استعلام «رقم الأعمال حسب العميل».

ما ليس كذلك: مجرد عرض لملف دون شرط ولا فرز.

رد فعل: استجواب البيانات → استعلام.

محرر الاستعلامات
أداة WinDev المرئية: نختار الملفات ونحدد الحقول ونضع الشروط والفرز والتجميع؛ ويولّد WinDev SQL.

مثال بسيط: يربط ياسين Client وCommande دون كتابة سطر SQL.

ما ليس كذلك: كتابة الاستعلام يدويًا بـ SQL مباشر.

رد فعل: الإنشاء المرئي دون خطأ في الصياغة → محرر الاستعلامات.

WHERE (التصفية)
الشرط الذي لا يُبقي إلا بعض الصفوف؛ ووُضع على مستوى القاعدة، يتيح للمحرك استخدام فهارسه وإرسال النافع فقط.

مثال بسيط: لا يعرض ياسين إلا طلبات الفترة المطلوبة.

ما ليس كذلك: تحميل كل شيء ثم التصفية في WLangage لاحقًا.

رد فعل: تقليص الحجم المُرسَل → التصفية على مستوى القاعدة بـ WHERE.

الربط (JOIN)
دمج عدة ملفات مرتبطة في الاستعلام نفسه — لا غنى عنه لعرض اسم العميل بجانب طلبه.

مثال بسيط: يربط ياسين Commande وClient على كود العميل.

ما ليس كذلك: عرض معرّف العميل وحده دون اسمه.

رد فعل: تقاطع معلومات عدة ملفات → ربط.

GROUP BY + الدوال التجميعية
التجميع لحساب إحصائيات: SUM (المجموع)، COUNT (العدد)، AVG (المتوسط)، MIN/MAX.

مثال بسيط: يجمع ياسين رقم الأعمال حسب العميل.

ما ليس كذلك: سرد كل طلب سطرًا سطرًا دون مجموع.

رد فعل: مجاميع حسب الفئة → GROUP BY مع دوال تجميعية.

في التطبيق — عمليًا — إنشاء استعلام واستغلاله

  1. أنشئ استعلامًا بالمحرر المرئي: اختر الملفات، وحدد الحقول النافعة، وأضف شروط التحديد والفرز، كما يفعل ياسين.
  2. أضف ربطًا إذا احتجت معلومات من عدة ملفات مرتبطة (عرض اسم العميل في سطر الطلب).
  3. للإحصائيات، استخدم GROUP BY مع الدوال التجميعية (SUM، COUNT، AVG) — مثلاً رقم الأعمال حسب العميل أو حسب التاجر.
  4. اجعل الاستعلام معامليًا (تصبح المدينة والفترة معاملات) لإعادة استخدامه، واترك التصفية تحدث على مستوى القاعدة (WHERE).
تعرف كيف تستجوب بياناتك مرئيًا أو بـ SQL، وتربط عدة ملفات، وتحسب إحصائيات، وتعيد استخدام استعلاماتك كمصدر للجداول والطبعات.

سكربت خطوة بخطوة — كتابة استعلام ياسين (5 دقائق)

1) افتح محرر الاستعلامات، وأضف ملفات Client وCommande وLigneCommande. 2) حدد NomClient وضع ربطًا على كود العميل. 3) أضف GROUP BY على NomClient مع SUM(MontantLigne) لرقم الأعمال. 4) صرّح بمعامل {pDateDebut} بدلًا من كتابة الفترة كتابةً ثابتة. 5) اترك التصفية على مستوى القاعدة (WHERE) واختبر النتيجة.

سيخدم هذا الاستعلام كمصدر لحقل Table (2.4) ولطبعة (2.3): اكتبه مرة واحدة وأعد استخدامه في كل مكان.

قالب للنسخ واللصق — استعلامي المعاملي

SELECT C.NomClient, SUM(L.MontantLigne) AS CA
FROM   Client C JOIN Commande CD ON CD.CodeClient = C.CodeClient
                 JOIN LigneCommande L ON L.NumCommande = CD.NumCommande
WHERE  CD.DateCommande >= {pDateDebut}
GROUP  BY C.NomClient   ORDER BY CA DESC
Regles : (1) requete parametree = reutilisable
         (2) filtrage COTE BASE (WHERE) > tout ramener et trier en WLangage

تحديد بسيط

يسرد ياسين المنتجات التي يقل مخزونها عن الحد، بـ WHERE بسيط ودون ربط.

ربط العميل

يعرض ياسين اسم العميل بجانب كل طلب بربط Commande وClient.

إحصائيات حسب التاجر

يجمع ياسين بـ GROUP BY وSUM لرقم الأعمال حسب التاجر.

استعلام معاملي

يستبدل ياسين الفترة المكتوبة كتابةً ثابتة بـ {pDateDebut, pDateFin}: فيخدم الاستعلام كل شهر.

حذر: تنبيه احتياط: قد يكون الاستعلام ثقيلًا على القاعدة كما على الشبكة. ابقِ على عادة التصفية على مستوى القاعدة (WHERE) بدلًا من جلب كل شيء ثم الفرز في WLangage، وتحقق من أن الحقول المصفّاة والمربوطة مفهرسة، وتجنّب تنفيذ استعلام غير محدود (بدون شرط) على ملف إنتاج كبير. أخيرًا، لا تعمل مباشرةً على البيانات الحقيقية في تجاربك: انسخ نسخة أو استخدم مجموعة اختبار حتى لا تمسّ بيانات التجارة.

✓ ممارسات جيدة

  • ابدأ بـالمحرر المرئي: فهو يولّد SQL دون خطأ في الصياغة.
  • استخدم ربطًا لعرض المعلومات المرتبطة (اسم العميل).
  • اجعله معامليًا وصفِّ على مستوى القاعدة (WHERE).

✗ أخطاء شائعة

  • جلب كل شيء ثم الفرز في WLangage (إشباع الشبكة/الذاكرة).
  • كتابة المعايير كتابةً ثابتة بدلًا من جعل الاستعلام معامليًا.
  • نسيان الربط وعرض كود العميل وحده.

النقاط الأساسية

  • مقاربتان متكاملتان: محرر الاستعلامات المرئي (يولّد SQL) وSQL المباشر.
  • مفاهيم مفتاحية: SELECT، FROM، WHERE، ORDER BY، JOIN، GROUP BY + دوال تجميعية (SUM، COUNT، AVG، MIN/MAX).
  • الاستعلام قابل لإعادة الاستخدام كمصدر جدول أو طبعة أو يُمسح في WLangage.
  • ممارسات جيدة: استعلامات معاملية وتصفية على مستوى القاعدة (WHERE).

تحدي 48 ساعة — طبّقه غدًا

كما يفعل ياسين، أنشئ استعلامًا يربط ملفين مرتبطين (مثلاً الطلبات والعملاء) لعرض اسم العميل، ثم أضف GROUP BY مع SUM لمجموع حسب العميل. ثم حوّل الفترة إلى معامل {pDateDebut} واشرح في جملة واحدة لماذا التصفية على مستوى القاعدة أسرع من جلب كل شيء وفرزه في WLangage.

قائمة الخروج من القسم
  • أنشئ استعلامًا بالمحرر المرئي وأقرأ SQL المولَّد.
  • أعرف كيف أستخدم ربطًا ودوالًا تجميعية (GROUP BY، SUM).
  • أجعل استعلاماتي معاملية وأصفّي على مستوى القاعدة.
تقييم ذاتي 1-5: هل أعرف متى أستخدم المحرر المرئي أو SQL المباشر؟تقييم ذاتي 1-5: هل أعرف كيف أربط الملفات وأصفّي على مستوى القاعدة بدلًا من WLangage؟

أسئلة شائعة

لماذا ينبغي التصفية على مستوى القاعدة بدلًا من جلب كل البيانات؟

لأن المحرك يستخدم فهارسه ولا يرسل إلا الصفوف النافعة، بينما جلب كل شيء يستهلك الشبكة والذاكرة ليتخلص في النهاية من معظم البيانات — وهو أكثر أخطاء الأداء شيوعًا. ضع الشروط في الاستعلام (WHERE)، ودع القاعدة تفرز (ORDER BY)، وفوّض الدوال التجميعية.

هل يكفي محرر الاستعلامات، أم يجب كتابة SQL مباشر؟

يكفي المحرر المرئي للغالبية العظمى من الاحتياجات (التحديد، المرشّحات، الفرز، الربط، التجميع) ويولّد SQL دون خطأ في الصياغة. أما SQL المباشر فيخدم الحالات المعقدة أو عندما تريد تحكمًا دقيقًا؛ والمقاربتان تتعايشان لأن HFSQL يدعم SQL.

تحقّق من فهمك

لماذا ينبغي التصفية على مستوى القاعدة بدلًا من جلب كل البيانات؟

موارد إضافية (اختياري، للتعمّق أكثر)

اختبار المستوى 2أسئلة جديدة وأصعب للتحقق من مكتسباتك