راهنمای جامع کوئری FROM در SQL: انواع JOIN و کاربردها
عبارت FROM در SQL برای مشخص کردن جدول یا جداولی استفاده میشود که دادهها را از آنها بازیابی میکنید. این بخش یکی از اجزای اصلی دستور SELECT است، زیرا به سیستم مدیریت پایگاه داده (DBMS) میگوید که دادهها را از کجا پیدا کند. در این مقاله، به بررسی عمیق عبارت FROM در SQL Server میپردازیم، با ارائه مثالهای کاربردی و بحث در مورد جنبههای مختلف استفاده از آن.
عبارت FROM اغلب شامل عملیات JOIN برای ترکیب دادهها از چندین جدول است. درک نحوه استفاده مؤثر از عبارت FROM با انواع مختلف JOIN برای نوشتن کوئریهای SQL کارآمد و دقیق بسیار حیاتی است. در ادامه به جزئیات بیشتری میپردازیم.
INNER JOIN
یک INNER JOIN فقط ردیفهایی را برمیگرداند که مقادیر منطبق در هر دو جدول داشته باشند. این رایجترین نوع JOIN است و زمانی استفاده میشود که میخواهید دادههایی را بازیابی کنید که بر اساس یک شرط JOIN مشخص، در هر دو جدول وجود دارند.
مثال نحو (Syntax Example) زیر نشان میدهد که چگونه میتوان با استفاده از INNER JOIN، اطلاعات مشتریان و سفارشات آنها را ترکیب کرد:
SELECT
c.CustomerID,
c.FirstName,
c.LastName,
o.OrderID,
o.OrderDate
FROM Customers c
INNER JOIN Orders o ON c.CustomerID = o.CustomerID;
در این مثال، تنها سفارشاتی نمایش داده میشوند که مشتری مرتبط با آنها در جدول Customers وجود داشته باشد و بالعکس.
LEFT JOIN (LEFT OUTER JOIN)
یک LEFT JOIN، تمام ردیفها را از جدول سمت چپ (اولین جدولی که در FROM ذکر شده است) برمیگرداند و ردیفهای منطبق را از جدول سمت راست بازیابی میکند. اگر هیچ تطابقی در جدول سمت راست پیدا نشود، ستونهای جدول سمت راست برای آن ردیفها مقدار NULL خواهند داشت. این JOIN زمانی کاربرد دارد که میخواهید تمام دادههای یک جدول را حفظ کرده و در صورت وجود، اطلاعات مرتبط از جدول دیگر را به آن اضافه کنید.
مثال زیر نحوه استفاده از LEFT JOIN را برای نمایش تمام مشتریان، حتی آنهایی که هیچ سفارشی ثبت نکردهاند، نشان میدهد:
SELECT
c.CustomerID,
c.FirstName,
c.LastName,
o.OrderID,
o.OrderDate
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID;
در نتیجه این کوئری، تمام مشتریان لیست میشوند و برای مشتریانی که سفارشی ندارند، ستونهای مربوط به سفارش با NULL پر خواهند شد.
RIGHT JOIN (RIGHT OUTER JOIN)
یک RIGHT JOIN، تمام ردیفها را از جدول سمت راست برمیگرداند و ردیفهای منطبق را از جدول سمت چپ بازیابی میکند. اگر هیچ تطابقی در جدول سمت چپ یافت نشود، ستونهای جدول سمت چپ برای آن ردیفها مقدار NULL خواهند داشت. این عمل دقیقاً برعکس LEFT JOIN است.
با استفاده از RIGHT JOIN، میتوانیم تمام سفارشات را مشاهده کنیم، حتی آنهایی که ممکن است مشتری مرتبط با آنها در جدول Customers وجود نداشته باشد (که البته در یک سیستم با یکپارچگی ارجاعی قوی معمول نیست، اما برای درک مفهوم JOIN مفید است):
SELECT
c.CustomerID,
c.FirstName,
c.LastName,
o.OrderID,
o.OrderDate
FROM Customers c
RIGHT JOIN Orders o ON c.CustomerID = o.CustomerID;
در این حالت، تمام سفارشات نمایش داده میشوند و اگر سفارشی مشتری مرتبط در جدول Customers نداشته باشد، ستونهای مربوط به مشتری با NULL پر میشوند.
FULL JOIN (FULL OUTER JOIN)
یک FULL JOIN، تمام ردیفها را از هر دو جدول برمیگرداند، چه تطابقی پیدا شود و چه نشود. اگر در یکی از جداول تطابقی پیدا نشود، ستونهای جدول دیگر برای آن ردیفها با NULL پر میشوند. این نوع JOIN زمانی استفاده میشود که میخواهید تمام دادههای ممکن را از هر دو جدول ترکیب کنید.
مثال زیر نشان میدهد که چگونه میتوان با استفاده از FULL JOIN، تمام مشتریان و تمام سفارشات را، صرفنظر از وجود تطابق بین آنها، نمایش داد:
SELECT
c.CustomerID,
c.FirstName,
c.LastName,
o.OrderID,
o.OrderDate
FROM Customers c
FULL JOIN Orders o ON c.CustomerID = o.CustomerID;
این کوئری تمام مشتریان و تمام سفارشات را نشان میدهد. اگر مشتری سفارشی نداشته باشد، اطلاعات سفارش NULL خواهد بود و اگر سفارشی مشتری مرتبط نداشته باشد، اطلاعات مشتری NULL خواهد بود.
CROSS JOIN
یک CROSS JOIN، ضرب دکارتی دو جدول را برمیگرداند؛ به این معنی که هر ردیف از جدول اول با هر ردیف از جدول دوم ترکیب میشود. این نوع JOIN معمولاً برای تولید تمام ترکیبات ممکن بین دو مجموعه داده استفاده میشود و در اکثر موارد بدون شرط ON استفاده میشود.
SELF JOIN
یک SELF JOIN، زمانی استفاده میشود که یک جدول با خودش JOIN میشود. این کار با استفاده از اَلیاسها (aliases) برای جدول انجام میشود تا سیستم مدیریت پایگاه داده بتواند آن را به عنوان دو جدول جداگانه در نظر بگیرد. SELF JOIN معمولاً برای یافتن روابط سلسله مراتبی در یک جدول، مانند سلسله مراتب مدیر-کارمند، یا مقایسه ردیفهای یکسان در یک جدول استفاده میشود.
استفاده از WHERE clause با JOINs
شما میتوانید از عبارت WHERE برای فیلتر کردن نتایج یک کوئری که شامل JOIN است، استفاده کنید. عبارت WHERE بعد از عبارت FROM و JOINها اعمال میشود و به شما امکان میدهد نتایج را بر اساس شرایط خاصی محدود کنید.
مثال زیر نشان میدهد که چگونه میتوان با استفاده از INNER JOIN و سپس فیلتر کردن نتایج با WHERE، فقط سفارشاتی را نمایش داد که مبلغی بیشتر از یک مقدار مشخص دارند:
SELECT
c.CustomerID,
c.FirstName,
c.LastName,
o.OrderID,
o.OrderDate,
o.c_Amount -- فرض کنید این ستون مبلغ سفارش است
FROM Customers c
INNER JOIN Orders o ON c.CustomerID = o.CustomerID
WHERE o.c_Amount > 100;
در این مثال، پس از پیوستن جداول Customers و Orders، تنها سفارشاتی نمایش داده میشوند که مبلغ (Amount) آنها از 100 بیشتر باشد. این کار به بهینهسازی و دقت بیشتر در بازیابی دادهها کمک میکند.