Skip to content

JOIN-ים ב-SQL מוסברים

השוואה בין סוגי ה-JOIN ב-SQL: inner, outer, cross, self, lateral, natural — מה כל אחד מחזיר ודוגמה בת שורה אחת.

Join משלב שורות משתי טבלאות לפי מפתח משותף. סוג ה-join קובע אילו שורות יישארו כשמפתחות תואמים, חסרים או חוזרים על עצמם.

טבלת עיון · 8 ערכים
8 of 8 rows
Inner ו-outer
רק שורות שבהן תנאי ה-ON מתקיים בשתי הטבלאות. שורות ללא התאמה בכל אחד מהצדדים נשמטות.SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id;
כל השורות מהטבלה השמאלית. עמודות הצד הימני הן NULL כשאין התאמה.SELECT u.name, o.total FROM users u LEFT OUTER JOIN orders o ON u.id = o.user_id;
כל השורות מהטבלה הימנית. עמודות הצד השמאלי הן NULL כשאין התאמה.SELECT u.name, o.total FROM users u RIGHT OUTER JOIN orders o ON u.id = o.user_id;
כל השורות משתי הטבלאות. צדדים ללא התאמה ממולאים ב-NULL.SELECT u.name, o.total FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id;
Cross ו-self
מכפלה קרטזית. כל שורה מהצד השמאלי מתחברת לכל שורה מהצד הימני. בלי תנאי ON.SELECT u.name, o.total FROM users u CROSS JOIN orders o;
טבלה שמצורפת לעצמה באמצעות כינויים (aliases). משווה שורות בתוך טבלה אחת.SELECT a.id AS o1, b.id AS o2 FROM orders a JOIN orders b ON a.user_id = b.user_id WHERE a.id < b.id;
מתקדם
תת-שאילתה ב-FROM שמוערכת לכל שורה חיצונית. תת-השאילתה יכולה להתייחס לעמודות של הטבלה החיצונית.SELECT u.name, o.total FROM users u, LATERAL (SELECT total FROM orders WHERE user_id = u.id LIMIT 1) o;
מצרף לפי עמודות שחולקות אותו שם. בלי תנאי ON. היזהרו מהתנגשויות מפתח לא מכוונות.SELECT u.name, o.total FROM users u NATURAL JOIN orders o;