راهنمای کامل اتصال جداول در SQL: انواع JOIN و مثالهای کاربردی
SQL JOIN (جوین اس کیو ال) یک ابزار ضروری برای ترکیب ردیفها از دو یا چند جدول بر اساس یک ستون مشترک بین آنها است. این قابلیت به شما امکان میدهد تا دادهها را از جداول مختلف به صورت منطقی بازیابی کرده و نمای جامعی از اطلاعات مرتبط ایجاد کنید. اتصال جداول سنگ بنای کوئریهای پیچیده پایگاه داده و عملیات گزارشگیری است. در ادامه به بررسی انواع مختلف JOIN و کاربرد هر یک با مثالهای واضح میپردازیم.
برای درک بهتر نحوه کار JOINها، ابتدا دو جدول ساده به نامهای `Employee` (کارمندان) و `Department` (دپارتمانها) ایجاد میکنیم و دادههای نمونه را در آنها وارد میکنیم:
CREATE TABLE Employee (
EmployeeID int PRIMARY KEY,
FirstName varchar(50),
LastName varchar(50),
DepartmentID int
);
INSERT INTO Employee (EmployeeID, FirstName, LastName, DepartmentID) VALUES
(1, 'John', 'Doe', 101),
(2, 'Jane', 'Smith', 102),
(3, 'Peter', 'Jones', 101),
(4, 'Anna', 'Williams', 103),
(5, 'Mike', 'Brown', NULL);
CREATE TABLE Department (
DepartmentID int PRIMARY KEY,
DepartmentName varchar(50)
);
INSERT INTO Department (DepartmentID, DepartmentName) VALUES
(101, 'Sales'),
(102, 'Marketing'),
(103, 'HR'),
(104, 'IT');
این کوئریها دو جدول `Employee` و `Department` را با ستونهای مشخص شده ایجاد کرده و سپس چند ردیف داده را در آنها وارد میکنند. جدول `Employee` شامل اطلاعات کارمندان از جمله ID، نام، نام خانوادگی و ID دپارتمان آنها است. جدول `Department` نیز شامل ID و نام دپارتمانها است. دقت کنید که برای کارمند شماره 5، `DepartmentID` مقدار NULL دارد، که در مثالهای بعدی تاثیر آن را مشاهده خواهید کرد.
INNER JOIN چیست؟
`INNER JOIN` ردیفها را از دو جدول برمیگرداند که یک تطابق (مقدار مشترک) در ستونهای مشخص شده در هر دو جدول داشته باشند. به عبارت دیگر، فقط رکوردهایی نمایش داده میشوند که در هر دو جدول ارتباط متناظر داشته باشند.
SELECT E.FirstName, E.LastName, D.DepartmentName
FROM Employee E
INNER JOIN Department D ON E.DepartmentID = D.DepartmentID;
این کوئری نام و نام خانوادگی کارمندان را به همراه نام دپارتمان مرتبط با آنها، از هر دو جدول `Employee` و `Department` برمیگرداند، به شرطی که `DepartmentID` در هر دو جدول یکسان باشد. کارمندانی که `DepartmentID` آنها NULL است (مانند Mike Brown) یا دپارتمان آنها در جدول `Department` وجود ندارد (مانند DepartmentID 105 در صورت وجود)، در نتیجه این کوئری نمایش داده نمیشوند.
LEFT JOIN (یا LEFT OUTER JOIN) چیست؟
`LEFT JOIN` تمامی ردیفها را از جدول سمت چپ (جدول `Employee` در این مثال) برمیگرداند و ردیفهای منطبق را از جدول سمت راست (جدول `Department`) باز میگرداند. اگر هیچ تطابقی در جدول سمت راست پیدا نشود، ستونهای جدول سمت راست برای آن ردیف NULL خواهند بود. این نوع JOIN تضمین میکند که تمام دادههای جدول سمت چپ نمایش داده شوند.
SELECT E.FirstName, E.LastName, D.DepartmentName
FROM Employee E
LEFT JOIN Department D ON E.DepartmentID = D.DepartmentID;
این کوئری تمام کارمندان را نشان میدهد، حتی اگر دپارتمان آنها در جدول `Department` وجود نداشته باشد یا `DepartmentID` آنها NULL باشد. برای کارمندانی که دپارتمان مرتبطی ندارند، `DepartmentName` به صورت NULL نمایش داده میشود.
RIGHT JOIN (یا RIGHT OUTER JOIN) چیست؟
`RIGHT JOIN` تمامی ردیفها را از جدول سمت راست (جدول `Department` در این مثال) برمیگرداند و ردیفهای منطبق را از جدول سمت چپ (جدول `Employee`) باز میگرداند. اگر هیچ تطابقی در جدول سمت چپ پیدا نشود، ستونهای جدول سمت چپ برای آن ردیف NULL خواهند بود. این JOIN تضمین میکند که تمام دادههای جدول سمت راست نمایش داده شوند.
SELECT E.FirstName, E.LastName, D.DepartmentName
FROM Employee E
RIGHT JOIN Department D ON E.DepartmentID = D.DepartmentID;
این کوئری تمام دپارتمانها را نمایش میدهد، حتی اگر هیچ کارمندی به آن دپارتمان اختصاص داده نشده باشد. در این حالت، `FirstName` و `LastName` برای آن دپارتمان به صورت NULL خواهد بود (مثلاً برای دپارتمان IT که کارمندی در آن نیست).
FULL JOIN (یا FULL OUTER JOIN) چیست؟
`FULL JOIN` تمامی ردیفها را از هر دو جدول برمیگرداند. اگر در یکی از جداول تطابقی پیدا نشود، ستونهای مربوط به جدول دیگر برای آن ردیف NULL خواهند بود. این JOIN ترکیب `LEFT JOIN` و `RIGHT JOIN` است و اطمینان میدهد که همه دادهها از هر دو طرف، چه دارای تطابق باشند و چه نباشند، نمایش داده شوند.
SELECT E.FirstName, E.LastName, D.DepartmentName
FROM Employee E
FULL OUTER JOIN Department D ON E.DepartmentID = D.DepartmentID;
این کوئری تمام کارمندان (حتی آنهایی که دپارتمان ندارند) و تمام دپارتمانها (حتی آنهایی که کارمند ندارند) را نمایش میدهد. ردیفهایی که تطابق ندارند، در ستونهای جدول دیگر مقدار NULL خواهند داشت.
CROSS JOIN چیست؟
`CROSS JOIN` که به آن ضرب دکارتی نیز میگویند، هر ردیف از جدول اول را با هر ردیف از جدول دوم ترکیب میکند. نتیجه این JOIN شامل تمام ترکیبهای ممکن از ردیفهای دو جدول است و نیازی به یک ستون مشترک برای اتصال ندارد. این نوع JOIN معمولاً برای تولید تمام جفتهای ممکن از دو مجموعه داده استفاده میشود.
SELECT E.FirstName, E.LastName, D.DepartmentName
FROM Employee E
CROSS JOIN Department D;
این کوئری یک ترکیب از هر کارمند با هر دپارتمان را برمیگرداند. اگر 5 کارمند و 4 دپارتمان داشته باشیم، نتیجه 20 ردیف خواهد بود که هر کارمند یک بار با هر دپارتمان نمایش داده میشود.