| 📚 المادة: | الإعلام الآلي (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. الكتب المستعارة (مع 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 في امتحان البكالوريا
📍 دروس مشابهة
- قواعد البيانات: لغة SQL والاستعلامات — الثالثة ثانوي (بكالوريا) إعلام آلي
- قواعد البيانات — النموذج العلائقي والمفاتيح (Primary Key, Foreign Key) — الثانية ثانوي (شعبة تقني رياضي) — الإعلام الآلي
مدونة التربية و التعليم في الجزائر – دروس، فروض، نتائج امتحانات مدونة التربية والتعليم في الجزائر | تحضير الدروس، فروض واختبارات، نتائج البكالوريا وBEM، مسابقات التوظيف، والتوجيه المدرسي للطلاب وأولياء الأمور.