سلام دوستان!
امروز میخوام در مورد join ها صحبت کنم. قبل از اون شما باید با مفهوم جدول و ستون مشترک در پایگاه داده آشنا باشین. میتونم جدول رو به یک کلاس مدرسه ( رابطه در مدل رابطه ای ) تشبیه کنم که سطرهای اون ( تاپل ها در مدل رابطه ای ) دانش آموزا هستن و ستون هاش مثلا اسم یا کد ملی یا اسم معلم ( خصیصه در مدل رابطه ای ) میتونن باشن. حالا فرض کنین یه جدول دیگه داریم که اسم معلم ها با کلاسایی که دارن پیش مدیر نگهداری میشه. الان اسم معلما تو جدول دانش آموزا و اسم معلما تو جدول مدیر ستون مشترک ما هستن. یعنی دو تا ستون که مفهومشون و اینکه به چی اشاره میکنن یه چیزه و الزاما اگه اسم دو تا ستون از دوتا جدول مختلف یکسان باشه، دلیل نمیشه ستون مشترک باشن. حالا بریم سراغ خود join: یه عملیات SQL هست که برای ساختن ارتباط بین دو تا جدول به کار میره و ساخت این ارتباط با ستون مشترک امکان پذیره. پیچیده ترین کوئری ها ( پرس و جو ها ) در دیتابیس ها از join تشکیل میشن. اینجا چند تا سوال مطرح میشه، 1.اینکه join ها چند تا مدلن و 2. چجوری پیاده سازی میشن. (الگوریتم های پیاده سازیشون) 3. چجوری این جدولا روی دیسک ذخیره میشن که تو این نوشته میخوام سوال اولو جواب بدیم و سوالای دیگه ایشالله نوشته های بعدی :)
برای اینکه راحت تر درک کنین حرفامو از نمودار ون کمک میگیریم :))
تو شکل بالا هرکدوم از دایره ها یه جدوله. قسمت اشتراکشون، در حقیقت الحاق یا همون join دو تا سطر از دو جدوله که مقدار ستون مشترکشون یکسانه و با الحاقشون یه سطر تشکیل میدن تو جدول نهایی.
self join:
یک جدول با خودش الحاق میشه، مثل جدول بالا. نتیجه این جوین همون سطرهایی میشن که با فلشای قرمز و آبی الحاقشون نشون داده شده.
right/left (outer) join :
اگه به شکل بالا خوب دقت کنین میبینین که مقادیر ستون مشترک + مقادیر غیر مشترک جدول سمت چپ به عنوان خروجی دستور left outer join نمایش داده شدن. دقت کنین که تو همون سطرهایی که جدول چپ مقدار داره ولی جدول راست مقدار نداره، null رو تو همون جاهایی که مقدار نداره میزاریم.
دستور right join هم مثل left هست فقط به جای اینکه مقادیر غیر مشترک چپ رو بیاریم، راستیه رو میاریم و به همون ترتیب بالا.
inner join :
تو این نوع از join فقط و فقط سطرهایی به عنوان جدول نهایی اعلام میشن که مقادیرشون تو ستون مشترک یکسان باشه. برنامه نویسا باید دقت کنن که ستون مشترک اصلا null نداشته باشه وگرنه بدون اینکه ارور بگیریم دیتاهامون رو از دست میدیم. یعنی دستور سطرهای NULL دار رو حذف میکنه. این دستور تو اکثر دیتابیسا خیلی به درد بخور نیس چون شرط integration رو به شرایط ACID اضافه میکنه.حالا شما میگی اینا چین که گفتی؟ تو پست های بعدی میگم خدمتون.
Cross join:
این نوع از join همون حاصل ضرب دکارتی عه که تو دبیرستان یادش گرفتیم. شکل بالا رو هم اگه نگاه کنین، هر سطر از tables با تمامی سطرهای size الحاق شده. این دستور برای برنامه نویس هایی که سمت سرور کار میکنن مفیده.
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 ها رو قرار بدین.