أخبار الموقع

الاستعلامات المتقدمة في SQL: JOIN والاستعلامات الفرعية والتوابع الإحصائية — الثالثة ثانوي (بكالوريا) إعلام آلي — شعبة تقني رياضي — المنهاج الجزائري

📚 المادة: الإعلام الآلي (Informatique)
🎯 المستوى: الثالثة ثانوي — شعبة تقني رياضي (بكالوريا)
📖 الوحدة: قواعد البيانات — الاستعلامات المتقدمة في SQL
المدة المقترحة: حصتان (ساعتان)

🎯 أهداف التعلم

  • أن يتقن الطالب استخدام JOIN لربط جدولين أو أكثر في استعلام واحد
  • أن يميز بين INNER JOIN و LEFT JOIN ويوظف كلاً منهما في السياق المناسب
  • أن يفهم مفهوم الاستعلامات الفرعية (Sous-requêtes) ويطبقها
  • أن يوظف التوابع الإحصائية (COUNT, SUM, AVG, MAX, MIN) مع GROUP BY و HAVING
  • أن يحل تمارين بكالوريا في SQL باستخدام هذه التقنيات

🔗 تمهيد

في الدرس السابق تعلمنا أساسيات لغة SQL — إنشاء الجداول، الإدراج، والاستعلامات البسيطة. لكن قواعد البيانات العلائقية الحقيقية تتطلب ربط الجداول ببعضها عبر المفاتيح (Primary Keys / Foreign Keys) لاستخراج معلومات متكاملة. هنا تكمن قوة SQL الحقيقية: في الاستعلامات المتقدمة التي تجمع بين جداول متعددة، وتستخدم استعلامات فرعية، وتلخص البيانات بتوابع إحصائية. هذه المهارات أساسية في امتحان البكالوريا وفي التطبيقات العملية.

1️⃣ ربط الجداول: JOIN

في قاعدة بيانات علائقية، تُوزَّع البيانات على عدة جداول مرتبطة بمفاتيح أجنبية. لاسترجاع معلومات من جدولين معاً، نستخدم JOIN.

1.1 INNER JOIN

يرجع فقط الصفوف المتطابقة في كلا الجدولين (حسب شرط الربط).

📝 مثال: جدولان (Étudiants و Notes)

-- جدول الطلاب
CREATE TABLE Etudiants (
  NumEt INTEGER PRIMARY KEY,
  Nom VARCHAR(30),
  Classe VARCHAR(20)
);

-- جدول العلامات
CREATE TABLE Notes (
  NumNote INTEGER PRIMARY KEY,
  NumEt INTEGER,
  Matiere VARCHAR(30),
  Note REAL,
  FOREIGN KEY (NumEt) REFERENCES Etudiants(NumEt)
);

-- الاستعلام: اسم الطالب وعلامته في الرياضيات
SELECT E.Nom, N.Note
FROM Etudiants E
INNER JOIN Notes N ON E.NumEt = N.NumEt
WHERE N.Matiere = 'Mathématiques';

شرح: استخدمنا INNER JOIN لربط الجدولين عبر NumEt. الاختصار E و N هما أسماء مستعارة (Alias) للجدولين لتسهيل الكتابة. الشرط ON E.NumEt = N.NumEt يحدد كيفية الربط.

1.2 LEFT JOIN

يرجع كل صفوف الجدول الأيسر (الأول) حتى لو لم تجد تطابقاً في الجدول الأيمن (الثاني). الحقول غير المتطابقة تكون NULL.

📝 مثال: عرض كل الطلاب وعلاماتهم (حتى من لا علامة له)

SELECT E.Nom, N.Matiere, N.Note
FROM Etudiants E
LEFT JOIN Notes N ON E.NumEt = N.NumEt;

إذا كان هناك طالب لم يسجل له أي علامة بعد، سيظهر اسمه مع NULL في الخانتين الأخريين.

1.3 ربط أكثر من جدولين

📝 مثال: ثلاثة جداول — الطلاب، المواد، العلامات

CREATE TABLE Matieres (
  CodeMat VARCHAR(10) PRIMARY KEY,
  Libelle VARCHAR(50)
);

-- إضافة مفتاح أجنبي للمادة في جدول Notes
-- (يفترض أن Notes.Matiere أصبح CodeMat)

SELECT E.Nom, M.Libelle, N.Note
FROM Etudiants E
INNER JOIN Notes N ON E.NumEt = N.NumEt
INNER JOIN Matieres M ON N.Matiere = M.CodeMat
ORDER BY E.Nom, M.Libelle;

2️⃣ الاستعلامات الفرعية (Sous-requêtes)

الاستعلام الفرعي هو استعلام SELECT داخل استعلام آخر. يستخدم غالباً مع WHERE أو FROM أو HAVING.

2.1 استعلام فرعي في WHERE (مقارنة بقيمة واحدة)

📝 مثال: الطلاب الذين معدلهم أكبر من المعدل العام

SELECT NumEt, AVG(Note) AS Moyenne
FROM Notes
GROUP BY NumEt
HAVING AVG(Note) > (
  SELECT AVG(Note) FROM Notes
);

الاستعلام الداخلي SELECT AVG(Note) FROM Notes يحسب المعدل العام لجميع العلامات. الاستعلام الخارجي يقارن معدل كل طالب به.

2.2 استعلام فرعي مع IN

📝 مثال: الطلاب المسجلين في مادة “الرياضيات”

SELECT Nom, Classe
FROM Etudiants
WHERE NumEt IN (
  SELECT NumEt
  FROM Notes
  WHERE Matiere = 'Mathématiques'
);

IN يتحقق مما إذا كانت قيمة NumEt موجودة في قائمة النتائج من الاستعلام الداخلي.

2.3 استعلام فرعي مع EXISTS

📝 مثال: الطلاب الذين لهم على الأقل علامة واحدة

SELECT Nom, Classe
FROM Etudiants E
WHERE EXISTS (
  SELECT 1
  FROM Notes N
  WHERE N.NumEt = E.NumEt
);

EXISTS يرجع TRUE إذا كان الاستعلام الداخلي يعيد صفاً واحداً على الأقل. SELECT 1 تقليد لتحسين الأداء (لا يهم أي قيمة نختار).

3️⃣ التوابع الإحصائية (Fonctions d’agrégation)

الدالة الوصف مثال
COUNT(*) عدد الصفوف COUNT(*) → عدد الطلاب
SUM(colonne) مجموع القيم SUM(Note) → مجموع العلامات
AVG(colonne) المعدل AVG(Note) → معدل العلامات
MAX(colonne) أقصى قيمة MAX(Note) → أعلى علامة
MIN(colonne) أدنى قيمة MIN(Note) → أدنى علامة

3.1 GROUP BY — التجميع

📝 مثال: معدل كل طالب

SELECT NumEt, AVG(Note) AS Moyenne, COUNT(*) AS NbNotes
FROM Notes
GROUP BY NumEt;

GROUP BY NumEt يجمع الصفوف حسب رقم الطالب، ثم تطبق AVG على كل مجموعة. الحقول في SELECT يجب أن تكون إما دالة إحصائية أو موجودة في GROUP BY.

3.2 HAVING — فلترة المجموعات

📝 مثال: الطلاب الذين معدلهم أكبر من 12

SELECT NumEt, AVG(Note) AS Moyenne
FROM Notes
GROUP BY NumEt
HAVING AVG(Note) >= 12;

HAVING يشبه WHERE لكنه يُطبق بعد التجميع (GROUP BY). WHERE يُطبق قبل التجميع على الصفوف الفردية.

4️⃣ الجمع بين التقنيات — مثال شامل

📝 مثال: اسم الطالب، عدد المواد التي اجتازها، ومعدله العام

SELECT E.Nom,
       COUNT(N.Matiere) AS NbMatieres,
       ROUND(AVG(N.Note), 2) AS MoyenneGenerale
FROM Etudiants E
INNER JOIN Notes N ON E.NumEt = N.NumEt
GROUP BY E.NumEt, E.Nom
HAVING AVG(N.Note) >= 10
ORDER BY MoyenneGenerale DESC;

شرح: INNER JOIN يربط الجدولين، GROUP BY يجمع حسب الطالب، COUNT يحسب عدد المواد، AVG يحسب المعدل، HAVING يكتفي بمن معدله 10 فأكثر، ORDER BY ... DESC يرتب تنازلياً.

✏️ تمرين بكالوريا شامل

📌 تمرين (مقتبس من نموذج بكالوريا)

الموضوع: قاعدة بيانات لإدارة مكتبة مدرسية تحتوي على الجدولين التاليين:

-- جدول الكتب
CREATE TABLE Livres (
  CodeLivre VARCHAR(10) PRIMARY KEY,
  Titre VARCHAR(100),
  Auteur VARCHAR(50),
  Annee INTEGER,
  NbPages INTEGER
);

-- جدول الاستعارات
CREATE TABLE Emprunts (
  NumEmprunt INTEGER PRIMARY KEY,
  CodeLivre VARCHAR(10),
  DateEmp DATE,
  DateRet DATE,
  NomEmprunteur VARCHAR(50),
  FOREIGN KEY (CodeLivre) REFERENCES Livres(CodeLivre)
);

المطلوب: كتابة استعلامات SQL لـ:

  1. عرض عنوان الكتاب واسم مؤلفه لكل كتاب تم استعارته على الأقل مرة (بدون تكرار).
  2. عرض عنوان الكتاب وعدد مرات استعارته.
  3. عرض اسم المقترض وعدد الكتب التي استعارها، مع ترتيب تنازلي حسب العدد.
  4. عرض الكتب التي لم تُستعار أبداً.
  5. عرض متوسط عدد صفحات الكتب التي تم استعارتها.
🟢 انقر هنا لرؤية الحل

الحل:

1. الكتب المستعارة (مع INNER JOIN + DISTINCT):

SELECT DISTINCT L.Titre, L.Auteur
FROM Livres L
INNER JOIN Emprunts E ON L.CodeLivre = E.CodeLivre;

2. عدد مرات الاستعارة لكل كتاب:

SELECT L.Titre, COUNT(E.NumEmprunt) AS NbEmprunts
FROM Livres L
LEFT JOIN Emprunts E ON L.CodeLivre = E.CodeLivre
GROUP BY L.CodeLivre, L.Titre;

ملاحظة: استخدمنا LEFT JOIN بدلاً من INNER JOIN ليشمل الكتب التي لم تُستعار (ستظهر بـ 0).

3. المقترضون وعدد استعاراتهم (ترتيب تنازلي):

SELECT NomEmprunteur, COUNT(*) AS NbEmprunts
FROM Emprunts
GROUP BY NomEmprunteur
ORDER BY NbEmprunts DESC;

4. الكتب التي لم تُستعار قط (Sous-requête مع NOT IN):

SELECT Titre, Auteur
FROM Livres
WHERE CodeLivre NOT IN (
  SELECT DISTINCT CodeLivre FROM Emprunts
);

أو باستخدام LEFT JOIN:

SELECT L.Titre, L.Auteur
FROM Livres L
LEFT JOIN Emprunts E ON L.CodeLivre = E.CodeLivre
WHERE E.NumEmprunt IS NULL;

5. متوسط صفحات الكتب المستعارة (استعلام فرعي):

SELECT AVG(L.NbPages) AS MoyPages
FROM Livres L
WHERE L.CodeLivre IN (
  SELECT DISTINCT CodeLivre FROM Emprunts
);

📊 جدول مقارنة: أنواع JOIN

النوع النتيجة متى يُستخدم
INNER JOIN فقط الصفوف المتطابقة في كلا الجدولين عندما تحتاج معلومات موجودة في الجدولين معاً
LEFT JOIN كل صفوف الجدول الأيسر + المتطابقة من الأيمن عندما تريد كل البيانات من الجدول الرئيسي حتى لو لم يكن لها نظير
RIGHT JOIN كل صفوف الجدول الأيمن + المتطابقة من الأيسر عكس LEFT JOIN (نادر الاستخدام)

⚠️ أخطاء شائعة في البكالوريا

  • نسيان شرط JOIN: كتابة FROM T1 JOIN T2 دون ON يؤدي إلى منتج ديكارتي (كل صف من T1 مع كل صف من T2)
  • الخلط بين WHERE و HAVING: WHERE قبل GROUP BY، HAVING بعده
  • عدم استخدام Alias: عند وجود حقل بنفس الاسم في جدولين، يجب تحديد الجدول: E.Nom وليس Nom
  • الخلط بين IN و EXISTS: IN يقارن قيمة واحدة، EXISTS يتحقق من وجود صفوف

📝 ملخص الدرس

  • JOIN يربط جدولين عبر مفتاح مشترك — INNER JOIN للمطابقة فقط، LEFT JOIN للاحتفاظ بكل صفوف الجدول الرئيسي
  • الاستعلامات الفرعية (Sous-requêtes) هي SELECT داخل SELECT — تُستخدم مع WHERE أو FROM أو HAVING
  • التوابع الإحصائية: COUNT, SUM, AVG, MAX, MIN — تُستخدم مع GROUP BY للتجميع
  • HAVING لفلترة المجموعات بعد GROUP BY (بينما WHERE قبلها)
  • هذه التقنيات مجتمعة هي أساس حل تمارين SQL في امتحان البكالوريا

📍 دروس مشابهة

شاهد أيضا

موضوع امتحان بكالوريا 2023 في التاريخ والجغرافيا مع الحل – شعبة آداب وفلسفة

امتحان شهادة البكالوريا 2023 – التاريخ والجغرافيا – شعبة آداب وفلسفة المدة: 3 ساعات – …

موضوع امتحان بكالوريا 2024 في اللغة العربية مع الحل – شعبة آداب وفلسفة

امتحان شهادة البكالوريا 2024 – اللغة العربية – شعبة آداب وفلسفة المدة: 3 ساعات – …

موضوع امتحان بكالوريا 2023 في علوم الطبيعة والحياة مع الحل – شعبة علوم تجريبية

امتحان شهادة البكالوريا 2023 – علوم الطبيعة والحياة – شعبة علوم تجريبية المدة: 3 ساعات …

موضوع امتحان بكالوريا 2024 في العلوم الفيزيائية مع الحل — شعبة علوم تجريبية

امتحان شهادة البكالوريا 2024 – العلوم الفيزيائية – شعبة علوم تجريبية المدة: 3 ساعات – …

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *