مقایسه انواع JOIN در SQL: inner، outer، cross، self، lateral، natural — اینکه هر کدام چه چیزی برمیگردانند و یک مثال تکخطی.
اتصالها ردیفهای دو جدول را بر اساس یک کلید مشترک ترکیب میکنند. نوع اتصال تعیین میکند وقتی کلیدها مطابقت دارند، غایباند یا تکرار میشوند، کدام ردیفها باقی میمانند.
جدول مرجع · 8 مورد
اتصالهای SQLExplained
8 of 8 rows
داخلی و خارجی
فقط ردیفهایی که شرط 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;
متقاطع و خودی
ضرب دکارتی. هر ردیف سمت چپ با هر ردیف سمت راست جفت میشود. شرط ON ندارد.
SELECT u.name, o.total FROM users u CROSS JOIN orders o;
جدولی که با استفاده از نامهای مستعار به خودش متصل میشود. ردیفهای درون یک جدول را مقایسه میکند.
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;