در MySQL و سایر پایگاههای داده رابطهای، برای ترکیب دادههای دو یا چند جدول مرتبط از JOIN استفاده میشود.
این عملیات به ما امکان میدهد که اطلاعات مرتبط را از جداول مختلف به صورت یکپارچه نمایش دهیم.
در این مقاله، انواع مختلف JOIN در MySQL، نحوه استفاده از آنها و مثالهای کاربردی را بررسی خواهیم کرد.
۱. چرا از JOIN استفاده میکنیم؟
در یک پایگاه داده، دادهها معمولاً در جداول جداگانه نگهداری میشوند تا از افزونگی جلوگیری شده و یکپارچگی دادهها حفظ شود. برای استخراج اطلاعات از چندین جدول، نیاز به ترکیب آنها داریم که این کار با JOIN انجام میشود.
مثال ساده:
فرض کنید دو جدول داریم:
- customers (مشتریان) → اطلاعات مشتریان
- orders (سفارشات) → سفارشهای ثبتشده توسط مشتریان
هر مشتری چندین سفارش دارد، اما هر سفارش فقط به یک مشتری تعلق دارد. برای نمایش نام مشتری همراه با اطلاعات سفارشات، باید این دو جدول را ترکیب کنیم که JOIN این کار را انجام میدهد.
۲. انواع JOIN در MySQL
نوع JOIN | توضیح |
---|---|
INNER JOIN | فقط رکوردهایی را که در هر دو جدول دارای تطابق هستند، برمیگرداند. |
LEFT JOIN | تمام رکوردهای جدول سمت چپ و دادههای منطبق از جدول سمت راست را نمایش میدهد. |
RIGHT JOIN | تمام رکوردهای جدول سمت راست و دادههای منطبق از جدول سمت چپ را نمایش میدهد. |
FULL JOIN | تمام رکوردهای هر دو جدول را نمایش میدهد (در MySQL مستقیماً پشتیبانی نمیشود). |
CROSS JOIN | حاصلضرب کارتزین (ترکیب همه رکوردهای دو جدول) را برمیگرداند. |
۳. نحوه استفاده از انواع JOIN در MySQL
۳.۱. INNER JOIN (اتصال داخلی)
INNER JOIN فقط رکوردهایی را که در هر دو جدول دارای تطابق هستند، نمایش میدهد.
SELECT customers.name, orders.order_id, orders.order_date
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;
✅ نتیجه:
- فقط مشتریانی نمایش داده میشوند که سفارش ثبت کردهاند.
- اگر یک مشتری هیچ سفارشی نداشته باشد، نمایش داده نمیشود.
۳.۲. LEFT JOIN (اتصال از سمت چپ)
LEFT JOIN تمام رکوردهای جدول سمت چپ (customers) را نمایش داده و در صورت وجود دادههای منطبق در جدول orders، آنها را اضافه میکند.
SELECT customers.name, orders.order_id, orders.order_date
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;
✅ نتیجه:
- تمام مشتریان نمایش داده میشوند، حتی اگر سفارشی نداشته باشند.
- در صورتی که سفارشی برای یک مشتری وجود نداشته باشد، مقادیر مربوط به سفارش NULL خواهد بود.
۳.۳. RIGHT JOIN (اتصال از سمت راست)
RIGHT JOIN برعکس LEFT JOIN عمل میکند؛ تمام رکوردهای جدول سمت راست (orders) نمایش داده شده و دادههای منطبق از جدول سمت چپ (customers) اضافه میشوند.
SELECT customers.name, orders.order_id, orders.order_date
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;
✅ نتیجه:
- تمام سفارشها نمایش داده میشوند، حتی اگر مشتری مرتبط در جدول customers وجود نداشته باشد.
- اگر سفارشی بدون مشتری ثبت شده باشد، مقدار نام مشتری NULL خواهد بود.
۳.۴. FULL JOIN (اتصال کامل – Full Outer Join)
FULL JOIN تمام رکوردهای هر دو جدول را نمایش میدهد، حتی اگر در جدول دیگر تطابقی وجود نداشته باشد.
MySQL بهطور مستقیم از FULL JOIN پشتیبانی نمیکند، اما میتوان آن را با UNION ترکیب کرد:
SELECT customers.name, orders.order_id, orders.order_date
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
UNION
SELECT customers.name, orders.order_id, orders.order_date
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;
✅ نتیجه:
- تمام مشتریان و تمام سفارشها نمایش داده میشوند.
- اگر سفارشی برای یک مشتری ثبت نشده باشد، مقدار مربوط به سفارش NULL خواهد بود.
- اگر سفارشی وجود داشته باشد که مشتری آن حذف شده باشد، مقدار مربوط به نام مشتری NULL خواهد بود.
۳.۵. CROSS JOIN (اتصال ضرب دکارتی)
CROSS JOIN هر رکورد از جدول اول را با تمام رکوردهای جدول دوم ترکیب میکند.
SELECT customers.name, orders.order_id
FROM customers
CROSS JOIN orders;
✅ نتیجه:
- اگر customers شامل ۵ رکورد و orders شامل ۳ رکورد باشد، خروجی ۵ × ۳ = ۱۵ رکورد خواهد بود.
- CROSS JOIN معمولاً بدون شرط استفاده نمیشود، زیرا حجم دادهها را بهشدت افزایش میدهد.
۴. مقایسه انواع JOIN با یک مثال عملی
فرض کنید دو جدول داریم:
جدول customers (مشتریان)
customer_id | name |
---|---|
1 | علی احمدی |
2 | زهرا مرادی |
3 | رضا نوری |
جدول orders (سفارشات)
order_id | customer_id | order_date |
---|---|---|
101 | 1 | 2024-03-10 |
102 | 1 | 2024-03-15 |
103 | 2 | 2024-03-20 |
خروجی انواع JOIN
JOIN Type | نتیجه |
---|---|
INNER JOIN | فقط مشتریان دارای سفارش (علی و زهرا) نمایش داده میشوند. |
LEFT JOIN | تمام مشتریان نمایش داده میشوند، حتی اگر سفارشی نداشته باشند. |
RIGHT JOIN | تمام سفارشها نمایش داده میشوند، حتی اگر مشتری آنها حذف شده باشد. |
FULL JOIN | تمام مشتریان و تمام سفارشها نمایش داده میشوند. |
CROSS JOIN | ترکیب تمام مشتریان با تمام سفارشات. |
۵. نتیجهگیری
JOIN در MySQL یکی از مهمترین ابزارها برای اتصال جداول و اجرای پرسوجوهای پیچیده است. با استفاده از INNER JOIN، LEFT JOIN، RIGHT JOIN، FULL JOIN و CROSS JOIN میتوان اطلاعات مرتبط را از چندین جدول ترکیب کرد و نمایش داد.
نکات کلیدی:
✅ INNER JOIN: فقط رکوردهای منطبق را نمایش میدهد.
✅ LEFT JOIN: همه رکوردهای جدول چپ را نمایش میدهد، حتی اگر تطابقی نداشته باشد.
✅ RIGHT JOIN: همه رکوردهای جدول راست را نمایش میدهد، حتی اگر تطابقی نداشته باشد.
✅ FULL JOIN: تمام رکوردهای هر دو جدول را نمایش میدهد (با UNION شبیهسازی میشود).
✅ CROSS JOIN: همه رکوردهای جدول اول را با همه رکوردهای جدول دوم ترکیب میکند.
با استفاده صحیح از JOIN، میتوانید دادههای پایگاه داده خود را بهینه و کارآمد مدیریت کنید. 🚀