بررسی انواع دستورات JOIN

25 اسفند 1397
درسنامه درس 15 از سری آموزش زبان SQL
SQL-Language-join-commands

با سلام و احترام خدمت شما همراهان روکسو، همانطور که از جلسه ی قبل به یاد دارید در زبان SQL کلیدواژه ای به نام JOIN وجود دارد که خود شامل چند نوع مختلف می شد: INNER JOIN و LEFT JOIN و RIGHT JOIN و FULL JOIN و SELF JOIN. امروز ما قصد بررسی تمام این دستورات را داریم.

دستور INNER JOIN

این دستور ردیف هایی را انتخاب می کند که در هر دو جدول وجود داشته باشند. به شکل زیر دقت کنید:

توضیح بصری دستور INNER JOIN
توضیح بصری دستور INNER JOIN

این دستور دارای ساختار کلی زیر است:

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

مثال های INNER JOIN

اگر بین ستون ها مقادیر قابل انطباقی وجود داشته باشد دستور INNER JOIN تمام ردیف ها را از هر دو جدول می گیرد. بنابراین اگر ردیف هایی در جدول Orders باشند که مقادیر منطبقی در جدول Customers نداشته باشند به نمایش در نمی آیند.

مثال اول - کد زیر تمام سفارشات را به همراه اطلاعات مشتری انتخاب می کند:

SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

اجرای این دستور در پایگاه داده ی Northwind

مثال دوم - کد زیر سه جدول را با هم ادغام می کند؛ این کد تمام سفارشات را به همراه اطلاعات مشتری و اطلاعات ارسال کننده انتخاب می کند:

SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName
FROM ((Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)
INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);

اجرای این دستور در پایگاه داده ی Northwind

دستور LEFT JOIN

این دستور تمام ردیف ها را از جدول سمت چپ (جدول 1) انتخاب کرده و سپس ردیف های منطبق را از جدول سمت راست می گیرد. اگر هیچ مقدار منطبقی وجود نداشته باشد، نتیجه ی جدول سمت راست NULL خواهد بود.

توضیح بصری دستور LEFT JOIN
توضیح بصری دستور LEFT JOIN

این دستور دارای ساختار کلی زیر است:

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

مثال های LEFT JOIN

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

نکته: در برخی از پایگاه های داده به جای دستور LEFT JOIN از LEFT OUTER JOIN استفاده می شود.

مثال: کد زیر تمام مشتری ها را به همراه سفارشات شان (اگر سفارشی داشته باشند) انتخاب می کند:

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName;

اجرای این دستور در پایگاه داده ی Northwind

دستور RIGHT JOIN

این دستور تمام ردیف ها را از جدول سمت راست (جدول 2) انتخاب کرده و سپس ردیف های منطبق را از جدول سمت چپ می گیرد. اگر هیچ مقدار منطبقی وجود نداشته باشد، نتیجه ی جدول سمت چپ NULL خواهد بود.

توضیح بصری دستور RIGHT JOIN
توضیح بصری دستور RIGHT JOIN

این دستور دارای ساختار کلی زیر است:

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;

مثال های LEFT JOIN

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

نکته: در برخی از پایگاه های داده به جای دستور RIGHT JOIN از RIGHT OUTER JOIN استفاده می شود.

مثال: کد زیر تمام کارمندان را به همراه سفارشات شان (اگر سفارشی داشته باشند) انتخاب می کند:

SELECT Orders.OrderID, Employees.LastName, Employees.FirstName
FROM Orders
RIGHT JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
ORDER BY Orders.OrderID;

اجرای این دستور در پایگاه داده ی Northwind

دستور FULL OUTER JOIN

اگر مقدار قابل انطباقی در جدول 1 یا 2 وجود داشته باشد تمام ردیف ها را بر میگرداند.

هشدار: دستور FULL OUTER JOIN می تواند result-set های بسیار بزرگی را برگرداند. هنگام استفاده از آن مراقب باشید.

توضیح بصری دستور FULL OUTER JOIN
توضیح بصری دستور FULL OUTER JOIN

این دستور دارای ساختار کلی زیر است:

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name;

مثال های FULL OUTER JOIN

دستور FULL OUTER JOIN تمام ردیف ها را از جدول سمت چپ به همراه تمام ردیف های جدول سمت راست را بر میگرداند. اگر ردیف هایی در جدول سمت چپ باشند که در جدول دیگر مقادیر قابل انطباقی نداشته باشند و یا بالعکس، باز هم نمایش داده می شوند.

ابتدا نگاهی به قسمتی از جدول Customers بیندازیم:

Country PostalCode City Address ContactName CustomerName CustomerID
Germany 12209 Berlin Obere Str. 57 Maria Anders Alfreds Futterkiste 1
Mexico 05021 México D.F. Avda. de la Constitución 2222 Ana Trujillo Ana Trujillo Emparedados y helados 2
Mexico 05023 México D.F. Mataderos 2312 Antonio Moreno Antonio Moreno Taquería 3

و قسمتی از جدول Orders:

ShipperID OrderDate EmployeeID CustomerID OrderID
3 1996-09-18 7 2 10308
1 1996-09-19 3 37 10309
2 1996-09-20 8 77 10310

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

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL OUTER JOIN Orders ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;

خروجی این کد بسیار بزرگ است. قسمتی از این خروجی به شکل زیر خواهد بود:

OrderID CustomerName
Alfreds Futterkiste
10308 Ana Trujillo Emparedados y helados
10365 Antonio Moreno Taquería
10382
10351

قسمت هایی که خالی هستند، اشتباه تایپی نیستند. در این موارد سفارشی وجود نداشته است.

حالت Self JOIN

self JOIN در واقع یک JOIN معمولی است با این تفاوت که جدول با خودش ادغام می شود.

این دستور دارای ساختار کلی زیر است:

SELECT column_name(s)
FROM table1 T1, table1 T2
WHERE condition;

مثال های self JOIN

مثال: کد زیر مشتریانی را انتخاب می کند که از یک شهر باشند:

SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City 
ORDER BY A.City;

اجرای این دستور در پایگاه داده ی Northwind

خلاصه ی مقاله

در این قسمت با انواع مختلف دستور JOIN آشنا شدیم که شامل INNER JOIN و LEFT JOIN و RIGHT JOIN و FULL JOIN و SELF JOIN بودند. سپس برای هر کدام مثال هایی زدیم تا جای اشتباه و شبهه باقی نماند. امیدوارم از این قسمت لذت برده باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش زبان SQL توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما (1 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

حامد حاجوی
26 آذر 1400
آیا "استخراج اطلاعات تمام مشتریان به همراه اطلاعات سفارشات" با "استخراج اطلاعات تمام سفارشات به همراه اطلاعات مشتریان" فرقی داره؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.