در شمارههای پیش در مورد SQL و کاربرد آن صحبت کردهایم، SQL یک زبان پرسوجوست. این زبان یک زبان اسکریپتی برای نشان پرس وجوهای پیچیده در پایگاه دادههای رابطهای کاربرد دارد. این زبان دارای ساختاری ساده است.
در این شماره قصد داریم مبحث 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 را میگذارد.