أهلا بكم بدورة قاعدة البيانات باستخدام Postgres. في الدرس السابق تحدثنا عن Data Modeling. اليوم سننتقل إلى أمثلة عملية لكيفية استخدام الـ JOIN للحصول على البيانات التي نريدها.
سنبدأ أولاً بشرح علاقة الـ One to One. في الدرس السابق بنينا جدول اسمه Person وجدول ثاني اسمه Profile. كل Person لديه Profile واحد فقط - هذه علاقة واحد لواحد.
عند النظر إلى البيانات الفعلية:
| Person Name | Profile Status |
|---|---|
| John | ✓ |
| Maria | ✓ |
| Smith | ✗ |
في هذا المثال، لاحظ أن Smith لم ينشئ Profile بعد.
إذا أردنا الحصول على جميع الأشخاص الذين لديهم Profile، سنستخدم INNER JOIN:
SELECT
Person.id AS PersonID,
Person.name AS PersonName,
Profile.followers
FROM Person
INNER JOIN Profile
ON Person.id = Profile.person_id
هذا الاستعلام سيعيد لنا فقط الأشخاص الذين لديهم Profile. Smith لن يظهر في النتائج لأنه ليس لديه Profile.
اشترك في النشرة البريدية
دروس جديدة، مقالات، وأدوات مباشرة لبريدك.
إذا أردنا الحصول على جميع الأشخاص سواء كان لديهم Profile أم لا:
SELECT
Person.id AS PersonID,
Person.name AS PersonName,
Profile.followers
FROM Person
LEFT JOIN Profile
ON Person.id = Profile.person_idبهذه الطريقة سيظهر Smith في النتائج، لكن قيمة followers ستكون NULL.
الآن سننتقل إلى علاقة أكثر تعقيداً: الـ One to Many. تخيل لدينا جدول Employee (الموظفين) وجدول Department (الأقسام). كل قسم يمكن أن يحتوي على عدة موظفين.
إذا أردنا معرفة عدد الموظفين في كل قسم:
SELECT
Department.name AS DepartmentName,
COUNT(Employee.id) AS EmployeeCount
FROM Employee
RIGHT JOIN Department D
ON Employee.department_id = D.id
GROUP BY D.idلاحظ أننا استخدمنا RIGHT JOIN هنا. هذا يسمح لنا برؤية الأقسام التي لا تحتوي على أي موظفين.
| Department | Count |
|---|---|
| Engineering | 1 |
| IT | 4 |
| Marketing | 1 |
| HR | 0 |
الفرق بين أنواع الـ Joins:
الآن سننتقل إلى أكثر العلاقات تعقيداً: الـ Many to Many. في هذه العلاقة:
Student يمكن أن يكون مسجلاً في عدة ClassClass يمكن أن يحتوي على عدة Studentلربط هاتين الجدولين معاً، نحتاج إلى جدول وسيط اسمه StudentClass:
Student (1) ──→ StudentClass ←── (1) Class
↓ ↓ ↓
(1) (Many to Many) (1)
↓ ↓ ↓
StudentClass ──→ StudentClass ←── StudentClass
إذا أردنا الحصول على أسماء الطلاب وأسماء الصفوف المسجلين فيها:
سننفذ استعلام مع عمليتي JOIN:
SELECT
Student.name AS StudentName,
Class.name AS ClassName
FROM Student
INNER JOIN StudentClass
ON Student.id = StudentClass.student_id
INNER JOIN Class
ON StudentClass.class_id = Class.idالخطوات في هذا الاستعلام:
Student جدولStudentClass للحصول على معرفات الصفوفClass للحصول على أسماء الصفوفالنتيجة ستكون:
| Student Name | Class Name |
|---|---|
| John | JavaScript |
| John | SQL |
| Maria | History |
| Maria | JavaScript |
إذا أردنا معرفة الصفوف التي لا يوجد فيها أي طالب:
SELECT
Class.name AS ClassName
FROM Class
LEFT JOIN StudentClass
ON Class.id = StudentClass.class_id
WHERE StudentClass.student_id IS NULLهذا الاستعلام سيعيد لنا الصفوف الفارغة مثل Biology.
عند اختيار نوع الـ JOIN، اسأل نفسك:
INNER JOINLEFT JOINRIGHT JOINLEFT JOIN أو RIGHT JOIN مع شرط IS NULLكل سيناريو عملي مختلف، لذا تخيل البيانات التي تريدها أمامك واختر الـ JOIN المناسب لحالتك.