مقدمه
در این مقاله قصد دارم تمام حالت های که جداول شما در بین آنها پیوند به وجود می آید را از طریق مفهومی به نام 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
قرار داده ام تا بتوانید از آنها الگو بگیرید، امیدوارم این مقاله برای شما مفید باشد.