Postgresql-join-where
@MojtabaPasoپیش از این JOIN و WHERE را با هم مقایسه کردیم و گفتیم که JOIN از لحاظ قدرت و عملکرد بهتری دارد و استفاده از آن توصیه میشود .(در مورد ترکیب دو جدول !)
در این مقاله با کمی جزيیات بیشتر به JOIN میپردازیم
در SQL، چهار نوع اصلی از JOIN وجود دارند.
INNER JOIN
LEFT JOIN
RIGHT JOIN
FULL OUTER JOIN

شماره۱ . INNER JOIN یکی از انواع JOIN در SQL است که برای ترکیب ردیفهای دو جدول بر اساس شرایط مشخصی استفاده میشود. INNER JOIN فقط ردیفهایی را نمایش میدهد که در هر دو جدول مطابقت دارند.
برای استفاده از INNER JOIN، نیاز است تا دو جدول مناسب را انتخاب کنید و شرایط مطابقت را بین آنها تعیین کنید. معمولاً از کلیدهای خارجی (Foreign Keys) موجود در جداول استفاده میشود تا رابطه بین آنها برقرار شود.
مطابق شکل و با استفاده از نمودار ون بخشی که INNER JOIN از این دو جدول نمایش مید
نکته در هنگام استفاده از JOIN در SQL اگر نوع آن را انتخاب نکنید به صورت پیشفرض INNER JOIN استفاده میشود .
نمونه :
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name = table2.column_name;
این دو دستور از نظر عملکرد یکسان هستند !!!

شماره ۲ :Left join یکی از نوعهای عملیات اتصال (join) در پایگاه داده است که از آن برای اتصال دو جدول بر اساس یک شرط استفاده میشود.
در left join، تمام رکوردهای جدول اول (چپ) نمایش داده میشوند، و رکوردهای متناظر در جدول دوم (راست) نیز در صورت مطابقت با شرط، به رکوردهای چپ اضافه میشوند. در صورت عدم مطابقت، ستونهای متناظر جدول راست با مقدار NULL در نتیجه نمایش داده میشوند.
در واقع، left join تمام رکوردهای جدول چپ را حفظ میکند، حتی اگر در جدول راست رکوردی مطابقت نداشته باشد. این نوع اتصال برای نمایش اطلاعات جداول اولیه و اطلاعات مطابق در جداول دیگر مفید است.
نمونه :
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

شماره ۳ Right Hoin : توضیح این مورد فرق با قبلی ندارد فقط سمت راست کار میکند .
نمونه
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;

شماره ۴ Full outer join: یکی دیگر از نوعهای عملیات اتصال (join) در پایگاه داده است که از آن برای اتصال دو جدول بر اساس یک شرط استفاده میشود.
در full outer join، تمام رکوردهای هر دو جدول (چپ و راست) نمایش داده میشوند. اگر رکوردها مطابقت داشته باشند، آنها به هم پیوسته و در نتیجه نمایش داده میشوند. اگر رکوردها در یکی از جداول مطابقت نداشته باشند، ستونهای متناظر در جدول دیگر با مقدار NULL در نتیجه نمایش داده میشوند.
در واقع، full outer join تمام رکوردهای هر دو جدول را حفظ میکند و هرگاه مطابقت وجود نداشته باشد، مقادیر NULL را نمایش میدهد. این نوع اتصال برای نمایش تمام اطلاعات از هر دو جدول مفید است، بدون در نظر گرفتن مطابقت رکوردها.
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name
WHERE condition;
تا اینجا کار با Join های مرسوم و اصلی آشنا شدید اما چندین نوع خاص از Join نیز وجود دارد که در ادامه به بررسی آنها میپردازیم:

شماره ۵ :Self join یک نوع خاص از عملیات اتصال (join) در SQL است که در آن یک جدول با خودش اتصال داده میشود. در واقع، self join امکان اتصال رکوردهای یک جدول با رکوردهای دیگر همان جدول را فراهم میکند.
با self join، میتوانید رابطههای بین رکوردهای یک جدول را بر اساس شرایط خاصی برقرار کنید. به عنوان مثال، فرض کنید یک جدول "کارمندان" داریم که شامل اطلاعات کارمندان یک سازمان است، و در این جدول، هر رکورد شامل شناسه کارمند و شناسه مدیر مستقیم آن کارمند است. با استفاده از self join، میتوانیم به راحتی روابط سلسله مراتبی بین کارمندان را برقرار کنیم.
این نوع Join میتواند برای سناریوهای مختلف دیگری نیز مفید باشد، مانند پیدا کردن زیرمجموعههایی از دادهها، مقایسه رکوردها در زمینههای مختلف و غیره. با استفاده از self join، میتوانید روابط پیچیدهتری را در دادهها برقرار کنید و عملیاتهای پیچیدهتری را انجام دهید.
sql
SELECT e1.name AS employee_name, e2.name AS manager_name
FROM employees e1
JOIN employees e2 ON e1.manager_id = e2.employee_id

شماره ۶ :Cross Join (یا همچنین Cartesian Join) یک نوع خاص از عملیات اتصال (join) در SQL است که تمام رکوردهای یک جدول را با تمام رکوردهای دیگر جدول دیگر اتصال میدهد. در واقع، Cross Join حاصلضرب (Cartesian product) بین دو جدول را تولید میکند.
وقتی از عملیات Cross Join استفاده میشود، تعداد رکوردهای نهایی برابر حاصلضرب تعداد رکوردهای جدول اول و تعداد رکوردهای جدول دوم خواهد بود. به عبارت دیگر، هر رکورد در جدول اول با تمام رکوردهای جدول دوم اتصال داده میشود.
برای مثال، فرض کنید دو جدول "کارمندان" و "دپارتمانها" داریم. جدول "کارمندان" حاوی اطلاعات کارمندان است و جدول "دپارتمانها" حاوی اطلاعات دپارتمانها است. با استفاده از عملیات Cross Join، میتوانیم تمام ترکیبهای ممکن بین کارمندان و دپارتمانها را به دست آوریم.
SELECT *
FROM employees
CROSS JOIN departments
در این کوئری، با استفاده از عبارت `CROSS JOIN`، تمام رکوردهای جدول "کارمندان" با تمام رکوردهای جدول "دپارتمانها" اتصال داده میشود. نتیجه این عملیات، تمام ترکیبهای ممکن بین کارمندان و دپارتمانها است.
نکته مهم در استفاده از عملیات Cross Join این است که تعداد رکوردهای نهایی به سرعت افزایش مییابد و ممکن است برای جداول با تعداد رکوردهای بزرگ، نتایج بسیار بزرگی به دست آید. بنابراین، برای جداول بزرگ توصیه میشود از عملیات Cross Join با احتیاط استفاده کنید و در صورت نیاز، شرایط و فیلترهای مناسبی را در استعلام خود اعمال کنید تا حجم نتایج کوچکتر شود.
@Code_Crafters