فصل 12 از 24 درس 1 از 1

JOINها در SQL Server

JOINها در SQL Server

بخشی از آموزش جامع SQL Server

محتوای درس JOINها در SQL Server

T-SQL | INNER، LEFT، CROSS و SELF JOIN

JOIN داده‌های نرمال‌شده در چند Table را در یک Result Set ترکیب می‌کند. نوع JOIN و محل Predicate در ON یا WHERE روی معنای خروجی اثر مستقیم دارد.

متن این فصل با رویکرد مرجع فنی و قابل استفاده در پروژه واقعی تنظیم شده است؛ مثال‌ها در امتداد مدل StoreDb نوشته شده‌اند و اصطلاحات اصلی SQL Server و T-SQL به‌صورت یکدست به‌کار می‌روند.

1. مفاهیم و قراردادهای اصلی

JOIN داده‌های نرمال‌شده در چند Table را در یک Result Set ترکیب می‌کند. نوع JOIN و محل Predicate در ON یا WHERE روی معنای خروجی اثر مستقیم دارد.

در طراحی پایگاه داده، Syntax تنها بخشی از مسئله است. نوع داده، Constraint، الگوی دسترسی، Transaction و هزینه اجرای Query باید هم‌زمان با نیاز Domain در نظر گرفته شوند.

مفهومکارکرد
INNER JOINفقط Matchها
LEFT JOINحفظ سمت چپ
RIGHT JOINحفظ سمت راست
FULL JOINحفظ هر دو سمت
CROSS JOINحاصل ضرب
SELF JOINJoin Table با خودش

2. ساختار و Syntax پایه

Aliasهای کوتاه و نام Columnهای صریح خوانایی Query را بالا می‌برند. در LEFT JOIN، شرط مربوط به سمت راست که باید Row بدون Match را حفظ کند معمولاً در ON قرار می‌گیرد.

SELECT
    o.Id AS OrderId,
    o.OrderDate,
    c.FirstName,
    c.LastName
FROM dbo.Orders AS o
INNER JOIN dbo.Customers AS c
    ON c.Id = o.CustomerId;

3. سناریوی StoreDb

برای گزارش Product همراه Category، LEFT JOIN باعث می‌شود Product بدون Category نیز در خروجی بماند. این رفتار با INNER JOIN متفاوت است.

نمونه‌های این فصل بر مدل فروشگاهی StoreDb بنا شده‌اند تا ارتباط مفاهیم میان فصل‌ها حفظ شود و Queryها در یک Context یکپارچه قابل بررسی باشند.

SELECT
    p.Id,
    p.Name,
    c.Name AS CategoryName
FROM dbo.Products AS p
LEFT JOIN dbo.Categories AS c
    ON c.Id = p.CategoryId;

4. اصول طراحی و Performance

طراحی پایدار باید هم صحت داده و هم هزینه اجرای عملیات را پوشش دهد. انتخاب ساده‌تر زمانی ترجیح دارد که Contract داده را روشن‌تر و رفتار Optimizer را قابل پیش‌بینی‌تر نگه دارد.

  • Join Keyها Type سازگار داشته باشند.
  • Index روی Foreign Keyهای پرتکرار بررسی شود.
  • Predicate سمت Optional در LEFT JOIN با دقت جای‌گذاری شود.
  • Join چند Child ممکن است Row Explosion ایجاد کند.

5. خطاهای رایج و نکات ایمنی

دستورهای SQL می‌توانند مستقیماً داده و ساختار را تغییر دهند؛ بنابراین بازبینی Context، تعداد Rowهای هدف و اثر Transaction قبل از اجرای تغییرات اهمیت عملی دارد.

  • Cartesian Product به دلیل ON ناقص.
  • تبدیل LEFT JOIN به INNER با WHERE روی سمت راست.
  • SELECT * در چند Table با Column تکراری.
  • Aggregate پس از Join چندبه‌چند بدون کنترل Duplicate.

6. چک‌لیست نهایی فصل

  • نوع JOIN بر اساس معنای خروجی انتخاب شده است.
  • ON کامل و قابل فهم است.
  • Duplicate ناشی از Cardinality تحلیل شده است.
  • Outer Join در برابر NULL به‌درستی رفتار می‌کند.

7. جمع‌بندی

خروجی این فصل باید به تصمیمی قابل اتکا در طراحی یا Query منجر شود؛ صحت داده، قابلیت نگهداری و رفتار Performance سه معیار ثابت برای ارزیابی نمونه‌ها هستند.