در آموزش قبلی یاد گرفتیم که چگونه با استفاده از کلیدهای اصلی و خارجی، بین جداول ارتباط یکبهچند و چندبهچند ایجاد کنیم. اما یک سوال اساسی باقی ماند: پایگاه داده ما اکنون تکهتکه شده است؛ مشتریان در یک جدول، سفارشات در جدول دوم و محصولات در جدول سوم هستند.
چگونه میتوانیم این تکههای پازل را کنار هم قرار دهیم و یک گزارش یکپارچه (مثلاً نام مشتری در کنار نام محصولی که خریده) تهیه کنیم؟
پاسخ این سوال، قلب تپندهی زبان SQL است: دستور JOIN.
📑 Table of Contents
دستور JOIN چیست؟
کلیدهای خارجی (Foreign Keys) به پایگاه داده قوانین را دیکته میکنند (مثلاً میگویند یک سفارش حتماً باید متعلق به یک مشتری معتبر باشد). اما وقتی میخواهیم دادهها را برای خواندن و گزارشگیری فراخوانی کنیم، به دستوری نیاز داریم که این جداول را به صورت موقت به هم بچسباند. دستور JOIN دقیقاً همین کار را میکند: رکوردهای دو یا چند جدول را بر اساس یک فیلد مشترک (معمولاً کلید اصلی و خارجی) با هم ترکیب میکند.
در Microsoft Access (و به طور کلی در SQL)، سه نوع JOIN بسیار پرکاربرد داریم که در ادامه آنها را کالبدشکافی میکنیم.
۱. اشتراک قطعی: INNER JOIN
پرکاربردترین نوع اتصال است. INNER JOIN فقط و فقط رکوردهایی را برمیگرداند که در هر دو جدول معادل داشته باشند. اگر این اتصال را شبیه به نمودار ون (Venn Diagram) در ریاضیات در نظر بگیرید، INNER JOIN دقیقاً بخش اشتراک دو دایره است.
مثال کاربردی: میخواهیم لیست مشتریانی که سفارش ثبت کردهاند را همراه با تاریخ سفارششان ببینیم.
SELECT Customers.CustomerName, Orders.OrderDate
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
تحلیل کد:
- بخش
FROM Customers INNER JOIN Orders: به اکسس میگوید جدول مشتریان را با جدول سفارشات پیوند بزن. - بخش
ON ...: شرط اتصال را مشخص میکند. به زبان ساده یعنی: «رکوردها را جایی به هم وصل کن که آیدی مشتری در جدول مشتریان، دقیقاً برابر با آیدی مشتری در جدول سفارشات باشد».
نکته: مشتریانی که تا به حال هیچ سفارشی ندادهاند، در این خروجی نمایش داده نمیشوند.
۲. اولویت با جدول سمت چپ: LEFT JOIN
گاهی اوقات ما همه رکوردهای جدول اول (سمت چپ) را میخواهیم، حتی اگر در جدول دوم (سمت راست) هیچ رکوردی برای آنها ثبت نشده باشد. اینجاست که LEFT JOIN (یا LEFT OUTER JOIN) به کار میآید.
مثال کاربردی: میخواهیم لیست تمام مشتریان را ببینیم، و اگر سفارشی داشتهاند تاریخ آن را هم روبروی نامشان درج کنیم. اگر سفارشی نداشتهاند، جای آن خالی (NULL) بماند.
SELECT Customers.CustomerName, Orders.OrderDate
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
این کوئری برای پیدا کردن «مشتریان غیرفعال» (کسانی که فیلد سفارششان خالی است) فوقالعاده کاربردی است و در تحلیل داده به شدت استفاده میشود.
۳. اولویت با جدول سمت راست: RIGHT JOIN
عملکرد RIGHT JOIN دقیقاً برعکس LEFT JOIN است. تمام رکوردهای جدول دوم (سمت راست) را میآورد و فقط رکوردهای مشترک از جدول اول (سمت چپ) را به آن میچسباند.
SELECT Customers.CustomerName, Orders.OrderDate
FROM Customers
RIGHT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
واقعیت تخصصی: در دنیای واقعی برنامهنویسی، بسیار کم از RIGHT JOIN استفاده میشود، زیرا برنامهنویسان ترجیح میدهند جای جداول را در کد عوض کنند و باز هم از LEFT JOIN استفاده کنند تا خوانایی کد بالا برود. اما برای درک کامل منطق SQL، شناخت آن ضروری است.
خلاصه بصری: درک JOIN با نمودار ون
برای اینکه تفاوت این سه نوع اتصال برای همیشه در ذهنتان بماند، بهترین راه استفاده از نمودار ون (Venn Diagram) است. در تصویر زیر، فرض کنید هر دایره نشاندهنده یک جدول است. بخشهای برجسته و رنگی نشان میدهند که در هر دستور JOIN، دقیقاً کدام بخش از دادهها (رکوردهای مشترک یا کل رکوردهای یک سمت) در خروجی نهایی واکشی میشوند:

کابوس پرانتزها در Access (اتصال بیش از دو جدول)
اگر از دیتابیسهایی مثل SQL Server یا MySQL استفاده کنید، اتصال سه جدول پشت سر هم بسیار ساده است و فقط کافیست دستورات JOIN را زیر هم بنویسید. اما موتور پردازشی Microsoft Access (معروف به ACE/JET) در این زمینه به شدت سختگیر است!
در اکسس، هر عملیات JOIN فقط میتواند دو خروجی را با هم ترکیب کند. بنابراین وقتی پای جدول سوم به میان میآید، باید با استفاده از پرانتز () به اکسس بگویید اول کدام دو جدول را با هم ترکیب کند، و سپس نتیجهی آنها را با جدول سوم پیوند بزند.
بیایید به همان کوئریِ گیجکنندهای که در انتهای مقاله رابطه چندبهچند دیدیم برگردیم و آن را کالبدشکافی کنیم:
SELECT
Orders.OrderID,
Products.ProductName,
OrderDetails.Quantity
FROM
(Orders INNER JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID)
INNER JOIN Products ON OrderDetails.ProductID = Products.ProductID;
چه اتفاقی افتاد؟
- اکسس ابتدا وارد پرانتز میشود: جدول
Ordersو جدول واسطOrderDetailsرا به هم وصل میکند. - این ترکیب در حافظه به عنوان یک «جدول موقتِ واحد» در نظر گرفته میشود.
- حالا اکسس بیرون از پرانتز میآید و این جدول موقت را با جدول
Productsپیوند (INNER JOIN) میزند.
هشدار: اگر در اکسس پرانتزها را برای اتصال سه جدول یا بیشتر فراموش کنید، با خطای Syntax error in JOIN operation مواجه خواهید شد. یکی از بزرگترین چالشهای مبتدیان در اکسس همین خطاست!
نگاهی به پشت صحنه: JOIN در محیط Design View
اگر تمام این کدها برایتان پیچیده به نظر میرسد، نگران نباشید. وقتی در محیط Query Design اکسس جداول را اضافه میکنید و فیلدها را به سمت هم میکشید (Drag & Drop)، اکسس خطوط ارتباطی ایجاد میکند.
اگر روی این خطوط ارتباطی دوبار کلیک کنید (پنجره Join Properties)، سه گزینه میبینید:
- نمایش فقط رکوردهای مشترک (همان
INNER JOIN) - نمایش همه رکوردها از جدول اول (همان
LEFT JOIN) - نمایش همه رکوردها از جدول دوم (همان
RIGHT JOIN)
وقتی شما این گزینهها را تغییر میدهید، اکسس به صورت خودکار کدهای SQL که در این مقاله یاد گرفتیم را در پسزمینه برایتان مینویسد!
در آموزش بعدی از این سرفصل، به سراغ عملیات ویرایش و حذف دادهها خواهیم رفت تا یاد بگیریم چگونه با استفاده از دستورات UPDATE و DELETE اطلاعات جداولمان را تغییر داده یا رکوردهای اضافی را با استفاده از کوئری حذف کنیم.
بیشتر بخوانید
آموزش SQL در Microsoft Access: انواع ارتباط بین جداول و ایجاد رابطه چندبهچند با جدول واسط
آموزش SQL: ارتباط بین جداول و کلید خارجی (Foreign Key)
آموزش SQL در Microsoft Access: کاربرد جزء WHERE در SQL
آموزش SQL در Microsoft Access: دستور SELECT و اجزاء مختلف آن
آموزش SQL در Microsoft Access: ایندکسها و مدیریت آنها
آموزش SQL در Microsoft Access: کلید اصلی (Primary Key)
آموزش SQL در Microsoft Access: ایجاد/افزودن دادهها در جداول