Elham Beydaghi
Elham Beydaghi
خواندن ۳ دقیقه·۳ سال پیش

انواع Join در پایگاه داده

سلام دوستان!

امروز میخوام در مورد join ها صحبت کنم. قبل از اون شما باید با مفهوم جدول و ستون مشترک در پایگاه داده آشنا باشین. میتونم جدول رو به یک کلاس مدرسه ( رابطه در مدل رابطه ای ) تشبیه کنم که سطرهای اون ( تاپل ها در مدل رابطه ای ) دانش آموزا هستن و ستون هاش مثلا اسم یا کد ملی یا اسم معلم ( خصیصه در مدل رابطه ای ) میتونن باشن. حالا فرض کنین یه جدول دیگه داریم که اسم معلم ها با کلاسایی که دارن پیش مدیر نگهداری میشه. الان اسم معلما تو جدول دانش آموزا و اسم معلما تو جدول مدیر ستون مشترک ما هستن. یعنی دو تا ستون که مفهومشون و اینکه به چی اشاره میکنن یه چیزه و الزاما اگه اسم دو تا ستون از دوتا جدول مختلف یکسان باشه، دلیل نمیشه ستون مشترک باشن. حالا بریم سراغ خود join: یه عملیات SQL هست که برای ساختن ارتباط بین دو تا جدول به کار میره و ساخت این ارتباط با ستون مشترک امکان پذیره. پیچیده ترین کوئری ها ( پرس و جو ها ) در دیتابیس ها از join تشکیل میشن. اینجا چند تا سوال مطرح میشه، 1.اینکه join ها چند تا مدلن و 2. چجوری پیاده سازی میشن. (الگوریتم های پیاده سازیشون) 3. چجوری این جدولا روی دیسک ذخیره میشن که تو این نوشته میخوام سوال اولو جواب بدیم و سوالای دیگه ایشالله نوشته های بعدی :)

برای اینکه راحت تر درک کنین حرفامو از نمودار ون کمک میگیریم :))

انواع join طبق استاندارد ANSI
انواع join طبق استاندارد ANSI


تو شکل بالا هرکدوم از دایره ها یه جدوله. قسمت اشتراکشون، در حقیقت الحاق یا همون join دو تا سطر از دو جدوله که مقدار ستون مشترکشون یکسانه و با الحاقشون یه سطر تشکیل میدن تو جدول نهایی.

self join:

دو تا ستون EMP_ID و EMP_SUPV از لحاظ مفهومی میتونن ستون مشترک تو self join  تلقی شن. چون هر کارمند هم میتونه زیر دست یه کارمند دیگه باشه و هم مدیر یه کارمند دیگه:)
دو تا ستون EMP_ID و EMP_SUPV از لحاظ مفهومی میتونن ستون مشترک تو self join تلقی شن. چون هر کارمند هم میتونه زیر دست یه کارمند دیگه باشه و هم مدیر یه کارمند دیگه:)


یک جدول با خودش الحاق میشه، مثل جدول بالا. نتیجه این جوین همون سطرهایی میشن که با فلشای قرمز و آبی الحاقشون نشون داده شده.


right/left (outer) join :

left join
left join


اگه به شکل بالا خوب دقت کنین میبینین که مقادیر ستون مشترک + مقادیر غیر مشترک جدول سمت چپ به عنوان خروجی دستور left outer join نمایش داده شدن. دقت کنین که تو همون سطرهایی که جدول چپ مقدار داره ولی جدول راست مقدار نداره، null رو تو همون جاهایی که مقدار نداره میزاریم.

دستور right join هم مثل left هست فقط به جای اینکه مقادیر غیر مشترک چپ رو بیاریم، راستیه رو میاریم و به همون ترتیب بالا.

inner join :

inner join
inner join


تو این نوع از join فقط و فقط سطرهایی به عنوان جدول نهایی اعلام میشن که مقادیرشون تو ستون مشترک یکسان باشه. برنامه نویسا باید دقت کنن که ستون مشترک اصلا null نداشته باشه وگرنه بدون اینکه ارور بگیریم دیتاهامون رو از دست میدیم. یعنی دستور سطرهای NULL دار رو حذف میکنه. این دستور تو اکثر دیتابیسا خیلی به درد بخور نیس چون شرط integration رو به شرایط ACID اضافه میکنه.حالا شما میگی اینا چین که گفتی؟ تو پست های بعدی میگم خدمتون.

Cross join:

cross join
cross join


این نوع از join همون حاصل ضرب دکارتی عه که تو دبیرستان یادش گرفتیم. شکل بالا رو هم اگه نگاه کنین، هر سطر از tables با تمامی سطرهای size الحاق شده. این دستور برای برنامه نویس هایی که سمت سرور کار میکنن مفیده.


full join:

full join
full join


اگه یادتون باشه که left/right join چطوری کار میکرد، درک این join راحت تره واستون. اینجا ما هردوتا left/right join رو داریم. این شکلی که هم سطرهایی که مقادیر ستون مشترکشون یکسانه به عنوان خروجی چاپ میشن، هم سطرهایی که ستون مشترکشون مقدار یکسان نداره چاپ میشن،یعنی مثلا سطر دوم table سمت چپ با اینکه id یکسانی با ستون مشترک table سمت راست نداره، نوشته شده و بعدش مقدار ستون num2 این سطر تو خروجی null شده.

همین!

سوالی چیزی داشتین بپرسین حتما.

پینوشت 1: inner join چند حالت دیگه شبیه سازی میشه که مفصلا میگم (مثل natural join , Equi-join)

پینوشت 2: برای استفاده از هر join دقیقا همون نوع join رو بنویسین و دو طرفش اسم table ها رو قرار بدین.


joinsql
در تلاش برای computer scientist شدن:)
شاید از این پست‌ها خوشتان بیاید