در اینجا قصد داریم مبحث Join یا الحاقات را در این زبان بررسی كنیم كه البته بد نیست پیش از آن قدری در مورد ساختارهای رابطهای بحث میكنیم.
همانطور كه در شماره پیش گفته شد پایگاه دادههای رابطهای از یك یا چند مجموعه تشكیل شده است كه این مجموعهها با یكدیگر در ارتباط هستند و هر مجموعه نیز از چند Tuple یا زوج مرتب تشكیل شده است. هر زوج مرتب نشان دهنده یك صفت از یك موجودیت داده است و هر مجموعه، نشان دهنده یك موجودیت دادهای كه در دنیای واقعی برای آن معنایی وجود دارد. این كه یك پایگاه داده از چه موجودیتهایی تشكیل شده است، به طراحی و تحلیل شما از یك سیستم در دنیای واقعی بستگی دارد.
همانطور كه گفتیم برای دسترسی به دادهها در یك پایگاه داده رابطهای به یك زبان پرسوجو نیاز داریم كه همان SQL است. این زبان میتواند از یك مجموعه دادهها را استخراج كند، اما بعضی وقتها برای دسترسی به دادههای مختلف نیاز است كه ما این دادهها را از چند مجموعه بیاوریم.
این كه مجموعهها چگونه با هم در ارتباط هستند و آیا این روابط منطقیاند یا نه، بستگی به طراحی شما و نرمال سازی پایگاه داده شما دارد.
برای این كه بیشتر با مفاهیم الحاقها در SQL آشنا شویم، با یك مثال توضیح میدهیم. فرض كنید در پایگاه داده خود 2 مجموعه به صورت زیر داریم:
1 ـ Employee كه اطلاعات كارمندان را نگه میدارد كه شامل 2 فیلد (صفت یا زوج مرتب) است. اولی نام كارمند، دومی شماره دپارتمانی كه كارمند در آن كار میكند.
2 ـ Department كه اطلاعات دپارتمانها را در خود نگهداری میكند و این جدول (مجموعه) دارای 2 فیلد است، یكی به نام شماره دپارتمان و دیگری نام دپارتمان.
رابطه بین این دو جدول یك به چند است، یعنی هر دپارتمان دارای چند كارمند است، ولی هر كارمند فقط در یك دپارتمان میتواند مشغول به كار باشد.
بسیار خب حالا ما انواع الحاقها را در این جدولها و رابطهها پیاده میكنیم.
1 ـ Cross Join: گفتیم پایگاه داده ما شامل یك سری مجموعه است كه از قوانین مجموعهها پیروی میكنند. اگر 2 جدول را با هم Cross Join كنیم، نتیجه حاصلضرب دكارتی 2 مجموعه خواهد بود، یعنی به این صورت كه به ازای هر سطر از مجموعه اول تمامی سطرها در مجموعه دوم در خروجی میآیند. در زبان SQL به صورت زیر نوشته میشود:
SELECT * From Employee Department
یا
SELECT * From Employee CROSS JOIN Department
2 ـ Inner Join: مانند همان Cross Join عمل میكند، اما با این تفاوت كه سطرهایی را در خروجی میآورد كه در یك صفت مقدار مشترك داشته باشند. منظور از صفت مشترك چیست؟ در پایگاه داده رابطهای مفهومی به نام كلید اصلی وجود دارد كه عناصر و سطرهای آن بر اساس آن مقدار دارای یكتایی باشند.
برای نشان دادن رابطه بین 2 جدول از یك صفت به عنوان كلید خارجی استفاده میكنیم. به طور ساده كلید خارجی صفتی است كه در یك جدول كلید اصلی باشد و در یك جدول كلید نباشد و فقط نشان دهنده رابطه باشد. اگر كلیدهای خارجی در یك جدول را با كلیدهای اصلی در یك جدول دیگر برابر قرار دهیم، همان Inner Join است. در SQL به صورت زیر نوشته میشود.
SELECT * FROM Employee Department WHERE Employee.DepId = Department.Id
یا
SELECT * FROM Employee INNER JOIN Department ON Employee.DepId = Department.Id
3 ـ Left Join: مانند Inner Join است با این تفاوت كه عناصری كه تمامی عناصر را از جدول اول در خروجی میآورد و به ازای سطرهایی در جدول اول كه دارای مقداری متناظر در جدول دوم نیستند، مقدار Null را قرار میدهد. در SQL به صورت زیر نوشته میشود:
SELECT * FROM Employee LEFT JOIN Department ON Employee.DepId = Department.Id
4 ـ Right Join: همان كاری را انجام میدهد كه Left Join انجام میدهد، اما با این تفاوت كه به جای این كه با جدول اول كار كند، با جدول دوم كار میكند. یعنی اول عناصری را كه در فیلد مشترك برابر هستند، در خروجی میآورد سپس باقی سطرها را از جدول دوم مینویسد و به ازای سطرهایی از جدول دوم ـ كه متناظری در جدول اول ندارند ـ مقدار آنها را برابر NULL قرار میدهد.
5 ـ FULL JOIN: كاری كه این الحاق میكند تركیبی از Left Join و Right Join است، ابتدا سطرهایی از 2 جدول را كه در فیلد مشترك برابر هستند، در خروجی میآورد. سپس عناصری را كه در جدول اول سطر متناظری در جدول ندارند میآورد و به ازای مقادیر فیلدهای جدول دوم، مقدار آنها را برابر NULL قرار میدهند. سپس همین كار را برای جدول دوم انجام میدهد، یعنی سطرهایی را كه فیلد مشترك در جدول اول ندارند در خروجی میآورد و به ازای مقادیر صفتهای جدول اول، مقدار NULL را میگذارد.
امیربهاءالدین سبطالشیخ