مقدمه

در این مقاله قصد دارم تمام حالت های که جداول شما در بین آنها پیوند به وجود می آید را از طریق مفهومی به نام SQL Joins توضیح دهم. حتما در طراحی دیتابیس به این قضیه برخورده اید که در بین جداول شما روابطی از طریق شناسه ها برقرار می شود، خب در اینجا هر جدول ممکن است به تنهایی اطلاعاتش کامل نباشد و بخواهد با Join شدن با جداول دیگر اطلاعات خود را کامل کند. خب من در این مقاله قصد دارم تمام حالت های که برای پیوند خوردن بین جداول شما به وجود می آید را به صورت کامل شرح دهم.

تذکر: این مقاله برای کسانی مفید می باشد که با یکی از دیتابیس ها مثل SQL Server آشنا باشند و مفاهیم اولیه و نوشتن Query را تا حد قابل قبولی بداند.

انواع SQL Joins

1. Inner Join

2. Left Join

3. Right Join

4. Full Outer Join

5. Left Outer Join

6. Right Outer Join

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

در تمام مثال های بالا ما دو جدول Users و Logs را مبنا قرار می دهیم که از طریق آنها شروع به نوشتن Query می کنیم و اطلاعات داخل آنها در دو تصویر زیر تا اخر مقال مبنا می باشد.

Table Users

Table Logs

Inner Join

هنگامی که روی دو جدول Inner Join میزنیم اطلاعاتی در خروجی به ما برگرداننده می شود که باهم دیگر اشتراک دارند به عنوان مثال شما در ریاضی هنگامی که دو مجموعه ای A={5,3,6,8,4} , B={1,2,5,6,3} را دارید اشتراک آنها می شود C={5,3,6}.

الگوی استفاده از این مفهوم به صورت زیر می باشد :

SELECT [columns]
FROM `table_1`
INNER JOIN `table_2` ON [join_condition]

نکته: اگر در جایی دیدید که کلمه INNER در دستور SQL بالا وجود ندارد و فقط JOIN استفاده شده است آن هم در واقع کار همان INNER JOIN را انجام میدهد تفاوتی ندارد.

حال می خواهیم برای دو جدول users , logs مثالی بزنیم، همانطور که از اسم جداول پیدا است جدول users مشخصات کاربر را نگه میدارد و جدول logs یکسری گزارشات مربوط به فعالیت کاربر را نگه میدارد از قبیل (ورود، خروج، ثبت مقاله و غیره ..).

به عنوان مثال میخواهیم دو جدول users , logs و باهم Inner Join کنیم و ببنیم اشتراک آنها در خروجی به چه شکل می شود به دستور زیر دقت کنید :

SELECT users.name, logs.titile FROM users INNER JOIN logs ON users.id = logs.user_id;

با توجه به کوئری بالا اشتراک دو تا جدول بر اساس ستون‌های id و user_id، خروجی به صورت زیر خواهد بود :‌

به همین سادگی دیدید که ما توانستیم از طریق این مفهوم دو جدول را باهم ترکیب کنیم و هر کجا که شناسه مشترک وجود دارد نمایش دهیم، اگر به جدول اطلاعات مراجع کنید فقط 5=id=2 , id در جدول users برنگشت چون وجه اشتراکی در جدول logs ندارد و user_id در آن نیامده است.

Left Join

هنگامی که از LEFT JOIN استفاده می کنیم به این معنی می باشد که تمام اطلاعات جدول سمت چپ را خواهیم داشت ولی از جدول سمت راست فقط اطلاعاتی را داریم که شامل شرط Join باشند، از این حرف به این نتیجه میرسیم که اطلاعات جدول سمت چپ بدون در نظر گرفتن شرط برگرداننده می شوند و جدول سمت راست شامل شرط Join می باشد.

همانطور که مشاهده می کنید جدول A به همراه اشتراکش با جدول B توی قسمت آبی رنگ قرار گرفته است.

شکل دستور به صورت زیر می باشد :‌

SELECT [columns]
FROM `table_1`
LEFT JOIN `table_2`
ON [join_condition]

نکته: توی کوئری بالا، جدول سمت چپ table_1 هست که بعد از FROM اومده و جدول سمت راست table_2 هست که بعد از LEFT JOIN امده است.

فرض کنید میخواهیم اطلاعات کاربری های که فعالیت داشتن رو داشته باشیم و به این نکته توجه کنید که ممکن یک کاربر هیچ فعالیتی نداشته باشد، اگر از INNER JOIN استفاده کنیم فقط کاربر های رو میاره که فقط فعالیت دارن ولی اون کاربر های که هیچ فعالیتی ندارن و نمایش نمیده پس بسته به نیازمون که میخوایم تمام کاربر های که فعالیت دارن یا ندارن و نمایش بدهیم از Left Join استفاده می کنیم.

SELECT users.name, logs.titile FROM users LEFT JOIN logs ON users.id = logs.user_id;

همانطور که در خروجی بالا مشاهده می کنید تمام دیتاها نمایش داده می شود، حتی اون های که در جدول logs وجه مشترکی هم نداشتن برگشتن ولی ستون title مقدار null گرفته اند.

Right Join

هنگامی که از RIGHT JOIN استفاده می کنیم به این معنی می باشد که تمام اطلاعات جدول سمت راست را خواهیم داشت ولی از جدول سمت چپ فقط اطلاعاتی را داریم که شامل شرط Join باشند، از این حرف به این نتیجه میرسیم که اطلاعات جدول سمت راست بدون در نظر گرفتن شرط برگرداننده می شوند و جدول سمت چپ شامل شرط Join می باشد.

همانطور که مشاهده می کنید جدول B به همراه اشتراکش با جدول A توی قسمت آبی رنگ قرار گرفته است.

دستور این جوین به صورت زیر هست:

SELECT [columns]
FROM `table_1`
RIGHT JOIN `table_2`
ON [join_condition]

همانطور که قبلا گفتیم توی کوئری بالا، جدول سمت چپ table_1 هست که بعد از FROM اومده و جدول سمت راست table_2 هست که بعد از RIGHT JOIN امده است.

فرض کنید میخواهیم اطلاعات فعالیت کاربران را داشته باشیم و به این نکته توجه کنید که ممکن یک کاربر هیچ فعالیتی نداشته باشد یا حذف شده باشد، اگر از INNER JOIN استفاده کنیم فقط فعالیت مشترک برای ما نمایش میده، در این صورت همه گزارش‌ها رو بدون در نظر گرفتن موجود بودن کاربر خواهیم داشت بطوری که برای گزارش‌های بدون کاربر، خروجی null خواهد بود.

SELECT users.name, logs.titile FROM users RIGHT JOIN logs ON users.id = logs.user_id;

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

Full Outer Join

SELECT * FROM A FULL OUTER JOIN B ON A.KEY = B.KEY

جداول A , B را انتخاب کرده و مقادیر کلیدی جدول A و جدول B را مقایسه می کند و همه سوابق A , B را برمی گرداند و NULL را برای مقادیری که وجود ندارند در هر دو طرف پر می کند.

Left Outer Join

SELECT * FROM A LEFT OUTER JOIN B ON A.KEY = B.KEY WHERE B.KEY IS NULL

این مفهوم همان Left Join می باشد که A ، با رکوردهای منطبق در B مقایسه می شود و سمت چپ تمام مقادیرش بر میگردد و سمت راست توسط شرط join با مقادیر مشترکش چک می شود و در صورت وجود نداشتن مقدار NULL خواهد گرفت.

Right Outer Join

SELECT * FROM A RIGHT OUTER JOIN B ON A.KEY = B.KEY WHERE A.KEY IS NULL

این مفهوم همان Right Join می باشد که B ، با رکوردهای منطبق در A مقایسه می شود و سمت راست تمام مقادیرش بر میگردد و سمت چپ توسط شرط join با مقادیر مشترکش چک می شود و در صورت وجود نداشتن مقدار NULL خواهد گرفت.

جمع بندی

در این مقاله قصد داشتم حالت های join که در بین جداول شما به وجود می آید را شرح دهم تا بتوانید این مفهوم کاربردی را در پروژه های خود بکار گیرید، حتما مباحث مربوط به Query های دیتابیس را یاد بگیرد چونکه جایگاه شغلی خوبی دارد و حتما در طراحی پروژه های شما خیلی کمک میکند، من در اینجا فایلی رو لینک میکنم (Sample Command SQL) که بیشتر الگو های کاربردی کار با دستورات SQL را به صورت Template قرار داده ام تا بتوانید از آنها الگو بگیرید، امیدوارم این مقاله برای شما مفید باشد.