الانتقال إلى المحتوى الرئيسي
الوحدة 3 · الدرس 2 من 410/57 في الدورة~10 min
دروس الوحدة (2/4)

إبقاء كل شيء على اليسار: LEFT JOIN

إن INNER JOIN من الدرس السابق له تأثير جانبي مهم: فهو ** يسقط الصفوف التي ليس لها تطابق **. إذا كان الموظف ليس لديه قسم (department_id هو NULL)، تختفي من النتيجة.

في بعض الأحيان هذا ما تريده. ومع ذلك، في كثير من الأحيان، لا يكون الأمر كذلك: في تقرير الموارد البشرية من الضروري رؤية جميع الموظفين، بما في ذلك أولئك الذين ليس لديهم قسم، ومعرفة من هم. هذا هو الغرض من LEFT JOIN (بالكامل، LEFT OUTER JOIN).

كيف يعمل

SQL
SELECT columns
FROM   table_a
LEFT JOIN table_b ON table_a.x = table_b.y;

اقرأ باللغة الإنجليزية: "احتفظ بـ جميع صفوف table_a؛ لكل واحد حاول أن إرفاق صف من table_b؛ إذا لم يكن هناك تطابق، املأ الأعمدة من table_b مع NULL".

الكلمة الأساسية هي LEFT: وتعني "الجدول الأيسر"، أي المكتوب بعد FROM. كل صفوفها تبقى على قيد الحياة دائمًا.

SQL
-- All employees, including those without a department:
SELECT e.first_name,
       e.last_name,
       d.name AS dipartimento
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id;

في مجموعة البيانات الخاصة بنا، يُرجع هذا الاستعلام 10 صفوف (موظف واحد لكل منها). أندريا كوستا، الذي لديه department_id = NULL، يظهر مع dipartimento = NULL بدلا من أن تختفي.

البحث عن الصفوف "لا يوجد تطابق".

نتيجة مفيدة للغاية: عن طريق التصفية باستخدام IS NULL في عمود من الجدول الأيمن تجد الصفوف بالضبط ** بدون أي تطابق **:

SQL
-- Orphan employees: no department assigned
SELECT e.first_name, e.last_name
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id
WHERE  d.id IS NULL;

يتم استخدام هذه الخدعة طوال الوقت في العالم الحقيقي: "ابحث لي عن طلبات بدون رقم العميل", "المنتجات بدون مراجعات", "المستخدمون الذين لم يقوموا بالتسجيل مطلقًا في".

جربه

تمرين#sql.m3.l2.e1
المحاولات: 0جارٍ التحميل…

قم بإرجاع الاسم الأول (الاسم الأول) والاسم الأخير (اسم العائلة) للموظفين الذين ليس لديهم قسم معين. صف واحد أو أكثر، عمودين.

جارٍ تحميل المحرر…
إظهار التلميح

أكمل WHERE باستخدام d.id IS NULL - تريد الصفوف التي لم يعثر فيها LEFT JOIN على قسم مطابق.

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#sql.m3.l2.e2
المحاولات: 0جارٍ التحميل…

قم بإدراج جميع الأقسام (departments.name) وبجانبها عدد الموظفين، بما في ذلك الأقسام التي ليس لديها موظفين (أظهر 0 لهؤلاء). تلميح: ابدأ من الأقسام وقم بإجراء عملية JOIN لليسار مع الموظفين، ثم GROUP BY + COUNT.

جارٍ تحميل المحرر…
إظهار التلميح

استخدم COUNT(e.id) (وليس COUNT(*)) لحساب 0 عندما لا يكون هناك تطابق: COUNT(*) سيحسب 1 بسبب صف LEFT JOIN الذي يحتوي على NULL.

الحل متاح بعد 3 من المحاولات