SQL Server Training with AdventureWorks Sample Database

آموزش گام‌به‌گام SQL Server با دیتابیس نمونه‌ی AdventureWorks | از مبتدی تا پیشرفته | (قسمت ۵)


درس ۵: ترکیب داده‌ها با JOIN

🎯 هدف درس:

در این درس یاد می‌گیرید چگونه داده‌های مربوط به چند جدول را با استفاده از انواع مختلف JOIN با هم ترکیب کنید. دستور JOIN برای ارتباط دادن جداول مرتبط از طریق کلیدهای مشترک به‌کار می‌رود و یکی از مهم‌ترین بخش‌های SQL محسوب می‌شود.

📘 مفهوم نظری:

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

۱. INNER JOIN — فقط رکوردهای مشترک:

SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person AS p
INNER JOIN HumanResources.Employee AS e
  ON p.BusinessEntityID = e.BusinessEntityID;

کاربرد: فقط رکوردهایی را نشان می‌دهد که در هر دو جدول مقدار تطبیق‌داده‌شده دارند.

۲. LEFT JOIN — تمام رکوردهای جدول چپ + رکوردهای تطبیق‌داده‌شده از راست:

SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person AS p
LEFT JOIN HumanResources.Employee AS e
  ON p.BusinessEntityID = e.BusinessEntityID;

کاربرد: همه افراد نمایش داده می‌شوند، حتی اگر کارمند نباشند (مقدار NULL در ستون‌های Employee).

۳. RIGHT JOIN — برعکس LEFT JOIN:

SELECT e.JobTitle, p.FirstName, p.LastName
FROM HumanResources.Employee AS e
RIGHT JOIN Person.Person AS p
  ON p.BusinessEntityID = e.BusinessEntityID;

کاربرد: تمام رکوردهای جدول سمت راست نمایش داده می‌شوند، حتی اگر در سمت چپ همتایی نداشته باشند.

۴. FULL OUTER JOIN — ترکیب کامل هر دو طرف:

SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person AS p
FULL OUTER JOIN HumanResources.Employee AS e
  ON p.BusinessEntityID = e.BusinessEntityID;

کاربرد: تمام رکوردهای هر دو جدول، چه تطبیق داده شده باشند چه نه، نمایش داده می‌شوند.

۵. CROSS JOIN — ضرب دکارتی دو جدول:

SELECT TOP (10) p.FirstName, e.JobTitle
FROM Person.Person AS p
CROSS JOIN HumanResources.Employee AS e;

کاربرد: ترکیب همه رکوردهای جدول اول با همه رکوردهای جدول دوم (تعداد زیاد نتایج).

۶. SELF JOIN — اتصال جدول به خودش:

SELECT A.BusinessEntityID AS EmployeeID,
       A.LoginID,
       B.LoginID AS ManagerLogin
FROM HumanResources.Employee AS A
INNER JOIN HumanResources.Employee AS B
  ON A.ManagerID = B.BusinessEntityID;

کاربرد: مقایسه یا ایجاد ارتباط درون یک جدول (مثلاً کارمند و مدیرش).

۷. استفاده از نام‌های مستعار (Alias) برای خوانایی بهتر:

SELECT p.FirstName, p.LastName, a.AddressLine1
FROM Person.Person AS p
JOIN Person.Address AS a
  ON p.BusinessEntityID = a.AddressID;

کاربرد: کوتاه‌سازی نام جداول برای کوئری‌های پیچیده.

۸. ترکیب چند JOIN در یک کوئری:

SELECT p.FirstName, p.LastName, e.JobTitle, d.Name AS Department
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
  ON p.BusinessEntityID = e.BusinessEntityID
JOIN HumanResources.Department AS d
  ON e.DepartmentID = d.DepartmentID;

کاربرد: ترکیب سه یا چند جدول برای تحلیل‌های پیچیده‌تر.

۹. فیلتر روی JOIN:

SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person AS p
INNER JOIN HumanResources.Employee AS e
  ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.JobTitle LIKE '%Manager%';

۱۰. ترتیب اجرای JOINها در Query Optimizer:

SQL Server ترتیب JOINها را بهینه‌سازی می‌کند، بنابراین نیازی نیست همیشه ترتیب نوشتاری با ترتیب اجرایی یکی باشد. با این حال، مرتب نوشتن کد به خوانایی و کارایی کمک می‌کند.

🧠 تمرین‌های عملی:

  • تمرین ۱: نمایش نام و عنوان شغلی افراد با استفاده از INNER JOIN بین Person و Employee.
  • تمرین ۲: فهرست تمام افراد (حتی غیرکارمندها) با LEFT JOIN.
  • تمرین ۳: اتصال Employee با Department و نمایش نام، سمت، و بخش هر فرد.
  • تمرین ۴: استفاده از SELF JOIN برای یافتن مدیر هر کارمند.
  • تمرین ۵ (چالشی): ترکیب سه جدول (Person, Employee, Department) و فیلتر مدیران (JobTitle LIKE ‘%Manager%’).

💡 پاسخ تمرین‌های عملی:

-- تمرین ۱
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
  ON p.BusinessEntityID = e.BusinessEntityID;

-- تمرین ۲
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person AS p
LEFT JOIN HumanResources.Employee AS e
  ON p.BusinessEntityID = e.BusinessEntityID;

-- تمرین ۳
SELECT p.FirstName, p.LastName, e.JobTitle, d.Name AS Department
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
  ON p.BusinessEntityID = e.BusinessEntityID
JOIN HumanResources.Department AS d
  ON e.DepartmentID = d.DepartmentID;

-- تمرین ۴
SELECT A.BusinessEntityID AS EmployeeID,
       A.LoginID,
       B.LoginID AS ManagerLogin
FROM HumanResources.Employee AS A
JOIN HumanResources.Employee AS B
  ON A.ManagerID = B.BusinessEntityID;

-- تمرین ۵ (چالشی)
SELECT p.FirstName, p.LastName, e.JobTitle, d.Name AS Department
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
  ON p.BusinessEntityID = e.BusinessEntityID
JOIN HumanResources.Department AS d
  ON e.DepartmentID = d.DepartmentID
WHERE e.JobTitle LIKE '%Manager%';

📚 جمع‌بندی درس:

در این درس یاد گرفتیم که با استفاده از انواع مختلف JOIN می‌توان داده‌های مرتبط از چند جدول را ترکیب کرد. INNER JOIN فقط رکوردهای مشترک را می‌آورد، LEFT و RIGHT JOIN همه رکوردهای یک سمت را نگه می‌دارند و FULL OUTER JOIN هر دو را. همچنین با SELF JOIN و CROSS JOIN آشنا شدیم که کاربردهای خاص دارند. در درس بعد به سراغ زیرکوئری‌ها و کوئری‌های تو در تو می‌رویم.

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *