دستور SQL Join

 

در این مطلب دستور SQL Join را به صورت دیاگرام تصویری خواهید دید. در راهنماهای فارسی SQL جستجو کردم و دیدم دستور SQL Join به صورت تصویری بیان نشده است. دیاگرام‌های مختلفی را هم دیدم و اغلب‌شان به طور کامل دستور SQL Join را نگفته بودند. این مطلب در سایت کدپروجکت هم به صورت مفصل توضیح داده و هم این که فایل‌های مثال اجرا شده را برای دانلود گذاشته بود. این مطلب را ترجمه کرده‌ام.

نمودارهای ون را با استفاده از ویزیو آفیس ۲۰۱۳ ترسیم کرده‌ام. روش کار را اینجا توضیح داده‌ام.

در این مطلب ۷ دستور بازیابی اطلاعات دو جدول مرتبط را به جز Cross Join و Self Referencing Join را خواهم گفت. دستورات به شرح زیر اند:

  1. INNER JOIN
  2. LEFT JOIN
  3. RIGHT JOIN
  4. OUTER JOIN
  5. LEFT JOIN EXCLUDING INNER JOIN
  6. RIGHT JOIN EXCLUDING INNER JOIN
  7. OUTER JOIN EXCLUDING INNER JOIN

در عین حال موارد ۵، ۶ و ۷ را

LEFT EXCLUDING JOIN
RIGHT EXCLUDING JOIN
OUTER EXCLUDING JOIN

خواهم نامید. ممکن است بعضی از شما بگویید که موارد ۵، ۶ و ۷ دستور Join بین دو جدول نباشند. با این حال بخاطر سادگی بحث من به این‌ها هم اشاره خواهم کرد چون شما دستور SQL Join را در هر یک از این‌ها استفاده می‌کنید، فقط برخی رکوردها را با دستور Where از خروجی نهایی حذف می‌کنید.

دو جدول A و B را در مثال‌ها استفاده کرده‌ام که محتویات آن‌ها را در ادامه می‌بینید. PK=Primary Key یا همان کلید اولیه است. Value هم یک فیلد فرضی است که مقدار رشته‌ای دارد.

TABLE_A
  PK Value
---- ----------
   ۱ FOX
   ۲ COP
   ۳ TAXI
   ۶ WASHINGTON
   ۷ DELL
   ۵ ARIZONA
   ۴ LINCOLN
  ۱۰ LUCENT

TABLE_B
  PK Value
---- ----------
   ۱ TROT
   ۲ CAR
   ۳ CAB
   ۶ MONUMENT
   ۷ PC
   ۸ MICROSOFT
   ۹ APPLE
  ۱۱ SCOTCH

 

 

دستور SQL Inner Join

 

 

sql inner join command

این دستور SQL Join ساده‌ترین و قابل فهم ترین و در واقع عمومی‌ترین است. این کوئری تمام رکوردهای جدول سمت چپ (Table A) را که رکوردهای منطبق در جدول سمت راست (Table B) دارند، برمی‌گرداند. دستور SQL Join برای حالت Inner Join به شکل زیر نوشته می‌شود:

SELECT <select_list> 
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key

اجرای دستور SQL Inner Join با دو جدول مثال به شکل زیر خواهد بود:

-- INNER JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
       B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
INNER JOIN Table_B B
ON A.PK = B.PK

A_PK A_Value    B_Value    B_PK
---- ---------- ---------- ----
   ۱ FOX        TROT          1
   ۲ COP        CAR           2
   ۳ TAXI       CAB           3
   ۶ WASHINGTON MONUMENT      6
   ۷ DELL       PC            7

(۵ row(s) affected)

دستور SQL Left Join

این کوئری تمام رکوردهای جدول سمت چپ (Table A) بدون توجه به این که در جدول سمت راست (Table B) باشند، برمی‌گرداند. علاوه بر این رکوردهای منطبق از جدول سمت راست را هم شامل خواهد شد. دستور SQL Join برای حالت Left Join به شکل زیر است:

SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key

نتیجه اجرای دستور SQL Left Join با جدول‌های مثال به شکل زیر است:

-- LEFT JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
LEFT JOIN Table_B B
ON A.PK = B.PK

A_PK A_Value    B_Value    B_PK
---- ---------- ---------- ----
   ۱ FOX        TROT          1
   ۲ COP        CAR           2
   ۳ TAXI       CAB           3
   ۴ LINCOLN    NULL       NULL
   ۵ ARIZONA    NULL       NULL
   ۶ WASHINGTON MONUMENT      6
   ۷ DELL       PC            7
  ۱۰ LUCENT     NULL       NULL

(۸ row(s) affected)

 

دستور SQL Join در حالت Left Excluding Join

این کوئری تمام رکوردهای جدول سمت چپ (Table A) که در جدول سمت راست (Table B) نیستند، نشان خواهد داد. دستور SQL Join برای این حالت به شکل زیر نوشته می‌شود:

SELECT <select_list> 
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

نتیجه اجرای دستور بالا به شکل زیر است:

-- LEFT EXCLUDING JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
LEFT JOIN Table_B B
ON A.PK = B.PK
WHERE B.PK IS NULL

A_PK A_Value    B_Value    B_PK
---- ---------- ---------- ----
   ۴ LINCOLN    NULL       NULL
   ۵ ARIZONA    NULL       NULL
  ۱۰ LUCENT     NULL       NULL
(۳ row(s) affected)

 

دستور SQL Right Join

این کوئری تمام رکوردهای جدول سمت راست (Table B) بدون توجه به این که در جدول سمت چپ (Table A) باشند، برمی‌گرداند. به علاوه، رکوردهای منطبق از جدول سمت چپ را هم شامل خواهد شد. دستور SQL Join برای حالت Left Join به شکل زیر است:

SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key

نتیجه اجرای دستور SQL Right Join با دو جدول مثال به شکل زیر خواهد بود:

-- RIGHT JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
RIGHT JOIN Table_B B
ON A.PK = B.PK

A_PK A_Value    B_Value    B_PK
---- ---------- ---------- ----
   ۱ FOX        TROT          1
   ۲ COP        CAR           2
   ۳ TAXI       CAB           3
   ۶ WASHINGTON MONUMENT      6
   ۷ DELL       PC            7
NULL NULL       MICROSOFT     8
NULL NULL       APPLE         9
NULL NULL       SCOTCH       11

(۸ row(s) affected)

دستور SQL Join در حالت Right Excluding Join

این کوئری تمام رکوردهای جدول سمت راست (Table B) که در جدول سمت چپ (Table A) نیستند، نشان خواهد داد. دستور SQL Join برای این حالت به شکل زیر نوشته می‌شود:

SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL

نتیجه اجرای دستور با دو جدول مثال به شکل زیر است:

-- RIGHT EXCLUDING JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
RIGHT JOIN Table_B B
ON A.PK = B.PK
WHERE A.PK IS NULL

A_PK A_Value    B_Value    B_PK
---- ---------- ---------- ----
NULL NULL       MICROSOFT     8
NULL NULL       APPLE         9
NULL NULL       SCOTCH       11

(۳ row(s) affected)

دستور SQL Outer Join

sql-outer-join-command
این دستور با عنوان Full Outer Join و Full Join نیز نامیده می‌شود. این کوئری تمام رکوردهای دو جدول را با اتصال رکوردهایی از جدول سمت چپ (Table A) که منطبق با رکوردهای جدول سمت راست (Table B) باشند نشان می‌دهد. دستور آن به شکل زیر است:

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key

نتیجه اجرای دستور SQL Outer Join با دو جدول مثال به شکل زیر است:

-- OUTER JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.PK = B.PK

A_PK A_Value    B_Value    B_PK
---- ---------- ---------- ----
   ۱ FOX        TROT          1
   ۲ COP        CAR           2
   ۳ TAXI       CAB           3
   ۶ WASHINGTON MONUMENT      6
   ۷ DELL       PC            7
NULL NULL       MICROSOFT     8
NULL NULL       APPLE         9
NULL NULL       SCOTCH       11
   ۵ ARIZONA    NULL       NULL
   ۴ LINCOLN    NULL       NULL
  ۱۰ LUCENT     NULL       NULL

(۱۱ row(s) affected)

 

دستور SQL Join در حالت  Outer Excluding JOIN

این کوئری تمام رکوردهای جدول سمت چپ (Table A) و تمام رکوردهای جدول سمت راست (Table B) را که منبطق نباشند بر می‌گرداند. به زبان ریاضی اگر بگوییم اشتراک A و B را از اجتماع A و B حذف می‌کند و باقیمانده را برمی‌گرداند. دستور SQL آن به شکل زیر است:

SELECT <select_list>

FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL OR B.Key IS NULL

نتیجه اجرای دستور SQL Excluding Outer Join با دو جدول مثال به شکل زیر است:

-- OUTER EXCLUDING JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.PK = B.PK
WHERE A.PK IS NULL
OR B.PK IS NULL

A_PK A_Value    B_Value    B_PK
---- ---------- ---------- ----
NULL NULL       MICROSOFT     8
NULL NULL       APPLE         9
NULL NULL       SCOTCH       11
   ۵ ARIZONA    NULL       NULL
   ۴ LINCOLN    NULL       NULL
  ۱۰ LUCENT     NULL       NULL

(۶ row(s) affected)
 

sql-outer-join-command

توجه داشته باشید در حالت Outer Join اول رکوردهای Inner Join برگردانده می‌شوند، سپس رکوردهای Right Join و در آخر رکوردهای Left Join. این شیوه حداقل در Microsoft SQL Server بدون نیاز به عبارت Order By اجرا می‌شود.

نکات بیشتر در خصوص دستور SQL Join

در لینک زیر دستور SQL Join به شکلی دیگر نمایش داده شده است. نویسنده، شیوه‌ی استفاده شده در این مطلب یعنی نمودار ون و نظریه مجموعه‌ها را، دارای اشکالاتی می‌داند و با شکل‌های دیگر آن را یاد داده است. در صورتی که فرصتی دست بدهد ممکن است آن را هم ترجمه کنم و به همین مطلب اضافه کنم:

Say NO to Venn Diagrams When Explaining JOINs

برای اطلاعات بیشتر در خصوص دستور SQL Join می‌توانید به لینک ویکیپدیا مراجعه کنید. در زمان نگارش نخست این مطلب، هنوز لینک ویکیپدیای مربوط به دستور SQL Join به فارسی ترجمه نشده است. اگر تازه وارد و جویای نام و اعتبار هستید و البته نگارش و انشای‌تان خوب است، توصیه می‌کنم مطلب ویکیپدیا را ترجمه کنید.

لینک‌های منبع: