یکی از مهمترین دستوراتی که در SQL میتوان نام برد، دستور JOIN است که این دستور اساساً برای ترکیب و بازیابی دادهها از دو یا چند جدول مورد استفاده قرار میگیرد. در یک پایگاهداده، رابطهای در دنیای واقعی، دادهها در تعداد زیادی جداول ساختار مییابند و به این دلیل، دائماً باید به این جداول متصل شد. چهار نوع اساسی عضویت در SQL Server وجود دارد: Inner، Outer، Self و Cross join. برای اینکه یک مرور سریع در مورد همهی این پیوستنها داشته باشید در زیر آنها را بررسی میکنیم:
در شکل ۶۵-۳ یک شمای کلی از نحوهی ارتباط دستورات JOIN را مشاهده میکنید که هر کدام توضیح مخصوص به خود را دارند.
شکل ۶۵-۳ بررسی دستور JOIN
توانایی ترکیب نتایجِ حاصل از سطرهای مرتبط از چندین جدول، قسمت مهمی در طراحی سیستم پایگاه دادهای رابطهای است. در SQL Server این امر با دستور join انجام میشود. این ماهیت سیستمهای پایگاهدادهای رابطهای سنتی است که برخی از جدولها حاوی اطلاعات مربوط به جداول دیگر با مقدار کلیدی مشترک هستند. با استفاده از پیوستن SQL، میتوانید بهراحتی از طریق چندین جدول با این کلیدهای مشترک، پرسوجوهایی را در مجموعه دادههای مرتبط انجام دهید.
در ادامه نوعهای مختلف SQL JOIN را که در شکل ۴۳-۳ مشخص شده است را با هم بررسی میکنیم:
۱- SQL inner join
این دستور یکی از سادهترین دستورات JOIN است که نتیجهی خروجی آن، سطری از هر دو جدول است که در آن شرایط پیوستگی یکی باشد؛ در شکل ۶۶-۳ شمای کلی این دستور را مشاهده میکنید.
شکل ۶۶-۳SQL inner join
دستورات کلی Inner Joinبهصورت زیر است:
SELECT ColumnList from LeftTable L
INNER join RightTable R
ON L.Column=R.Column
۲- SQL self join
این دستور باعث میشود، یک جدول با خودش Join شود که در ادامه، نحوهی کار آن را بررسی خواهیم کرد.
شکل ۶۷-۳ نمای کلی دستور بهصورت زیر است:
SELECT column_name(s)
FROM table1 T1, table1 T2
WHERE condition
شکل ۶۷-۳ SQL self join
۳- SQL cross join
این نوع JOIN حاصلضرب دکارتی سطرهای تعیینشده در دستورjoin را در خروجی نمایش میدهد. این دستور، سطرهایی را تولید میکند که ترکیبی از سطر جدول اول و دوم است که نمای کلی آن را در شکل ۶۸-۳ مشاهده میکنید.
شکل ۶۸-۳ SQL cross Join
- SQL outer join
این دستور شامل سه دستور LEFT OUTER, RIGHT OUTER, FULL است که هرکدام برای کار خاص طراحی شدهاند.
دستور LEFT OUTER JOIN
شکل کلی این دستور بهصورت زیر است:
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
این دستور، تمام اطلاعات را از جدول سمت چپ، یعنی جدول اول و اطلاعات منطبق را از جدول دوم در خروجی چاپ میکند و اگر هم عدم تطابق ایجاد شود، نتیجهی صفر را از جدول سمت راست برمیگرداند؛ در شکل ۶۹-۳ این موضوع مشخص شده است.
شکل ۶۹ -۳ SQL Full outer
مثال دستور INNER JOIN
برای اینکه بیشتر با این دستورات آشنا شویم یک مثال را با هم بررسی میکنیم؛ برای شروع نیاز به دو جدول داریم تا بتوانیم عملیات JOIN را بر روی آنها انجام دهیم.
جدول ۹-۳ Customers
CustomerID | Customer Name | Contact Name | Address | City | postalcode | country | Price |
۱ | Maria | Alfred Schmidt | Obere Str. 57 | Frankfurt | ۱۲۲۰۹ | Germany | ۱۰ |
۲ | Ana | Juan | Avda. de la Constitución 2222 | México | ۰۵۰۲۱ | Mexico | ۱۱ |
۳ | Antonio | Juan | Mataderos 2312 | México | ۰۵۰۲۳ | Mexico | ۲۵ |
۴ | Thomas | Thomas Hardy | ۱۲۰ Hanover Sq. | London | WA1 1DP | UK | ۳۶ |
۵ | Christina | Christina | Berguvsvägen 8 | Luleå | S-958 22 | Sweden | ۵۲ |
۶ | Cardinal | Tom B. Erichsen | Skagen 21 | Stavanger | ۴۰۰۶ | Norway | ۸۸ |
۷ | Farshid | Babajani | Seied Khandan | Tehran | ۸۸۴۳ | Iran | ۹ |
۸ | Azadeh | Tishebarsar | Monikh | Frankfurt | ۵۵۶۵ | Germany | ۲۰ |
جدول ۱۰- ۳ Order
OrderID | CustomerID | OrderDate |
۱۰۳۰۸ | ۸ | ۱۹۹۶-۰۹-۱۸ |
۱۰۳۰۹ | ۶ | ۱۹۹۶-۰۹-۱۹ |
۱۰۳۱۰ | ۴ | ۱۹۹۶-۰۹-۲۰ |
دو جدول ۹-۳ و ۱۰-۳ را مشاهده میکنید که باید در SQL آنها را ایجاد کنیم تا بتوانیم عملیات Join را بر روی آنها انجام دهیم.
همان طور که در شکل ۷۰-۳ مشاهده میکنید، دو جدول مورد نظر در SQL ایجاد شدهاند.
شکل ۷۰-۳ ایجاد جدول
با استفاده از دستور زیر میتوانیم بین دو جدول ارتباط داخلی برقرار کنیم:
SELECT Customers.[Customer Name],Orders.OrderID
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.[Customer Name];
در خط اول با دستور SELECT، ستونهای خروجی را که قرار است چاپ شوند را مشخص میکنیم که ستون Customer Name از جدول Customers و ستون OrderID از جدول Orders چاپ خواهد شد.
در خط دوم جدول Customers انتخاب میشود و در خط سوم مشخص میکنیم که باید با جدول Orders ارتباط INNER JOIN برقرار کند؛ در خط چهارم باید شرط برقراری ارتباط را مشخص کنیم که با دستور ON این کار را انجام میدهیم و بعد از آن، CustomerID از جدول Customers را با ستون CustomerID از جدول Orders را مساوی قرار میدهیم؛ این بدان معنا است که اگر در این دو ستون، عبارت مساوی هم قرار داشته باشد، آن سطر در خروجی چاپ خواهد شد؛ در خط آخر نیز با دستور ORDER BY، ستون Customer Name را منظم میکنیم تا در خروج، نمای بهتری داشته باشد.
اگر به شکل ۷۱-۳ توجه کنید، مشاهده خواهید کرد سه سطر در خروجی اپ شده است و آن هم به دلیل برابر بودن اعداد در ستونهای Customer ID در هر دو جدول است.
شکل ۷۱-۳ بررسی دستور JOIN
نکته: دستور JOIN و INNER JOIN یک کار را انجام میدهند، اما دستور INNER JOIN دارای عملکرد بهتری نسبت به دستور JOIN است و کار را در سریعترین زمان ممکن انجام میدهد.
مثال دستور SELF JOIN
همان طور که گفتیم این دستور با خودش ارتباط برقرار میکند؛ برای تست این موضوع از جدول Customers استفاده میکنیم و دستور زیر را اجرا میکنیم:
SELECT A.[Customer Name] AS CustomerName1, B.[Customer Name] AS CustomerName2, A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City
ORDER BY A.City;
در دستور بالا و در خط اول، سه ستون در خروجی چاپ خواهد شد که دستور AS، یک ستون جدید در خروجی نمایش میدهد؛ در قسمت FROM، یک جدول به دو قسمت تبدیل شده است که یکی Customers A و دیگری Customers B است؛ در قسمت WHERE شرطی قرار دادیم و گفتیم که در صورتی که A.CustomerID برابر نباشد با B.CustomerID و همچنین شهر جدول A با شهر جدول B یکی باشد شرط درست است و باید در خروجی چاپ شود که در خط آخر نیز طبق ستون A.City خروجی منظم خواهد شد.
در شکل ۷۲-۳ خروجی دستورات بالا را مشاهده میکنید که سه ستون ایجاد و خروجی طبق شرطی که قرار دادیم، نمایشداده شده است.
شکل ۷۲-۳ بررسی دستور SELF JOIN
مثال دستور CROSS JOIN
همان طور که گفتیم، این دستور با استفاده از ضرب دکارتی خروجی را مشخص میکند.
SELECT *
FROM Customers
CROSS JOIN Orders;
در دستور بالا با دستور SELECT * باید همه ی ستونهای جدول Customers در خروجی نمایش داده شوند، اما در خط آخر با دستور CROSS JOIN، تمام سطرهای جدول اول را ضرب در جدول Orders میکنیم که خروجی مانند شکل ۷۳-۳ خواهد شد.
همان طور که در شکل ۷۳-۳ مشاهده میکنید، هر کدام از سطرهای جدول Customers ضرب در هر کدام از سطرهای جدول Orders خواهد شد که نتیجهی آن یک جدول بزرگ از اطلاعات است.
شکل۷۳-۳ خروجی دستور CROSS JOIN
مثال دستور OUTER JOIN
این دستور همان طور که گفتیم از چندین قسمت تشکیل شده:LEFT OUTER, RIGHT OUTER, FULL:OUTER که آنها را با هم بررسی میکنیم.
مثال دستور LEFT JOIN
دستور زیر را اجرا کنید:
SELECT Customers.[Customer Name], Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.[Customer Name];
در دستور بالا، در خط اول دستور SELECT ستون Customer Name را از جدول Customers و ستون OrderID را از جدول Orders در خروجی چاپ خواهد کرد؛ در خط دوم جدول Customers انتخاب و در خط سوم با استفاده از دستور LEFT JOIN میگوییم که ستون Customers.CustomerID برابر با Orders.CustomerID باشد؛ این دستور تمام اطلاعات جدول Customers را در صورت تطبیق در خروجی چاپ خواهد کرد و اگر در جدول دوم، یعنی Orders مقداری وجود نداشته باشد، کلمهی null را برمیگرداند.
همان طور که در شکل ۷۴-۳ مشاهده میکنید، خروجی به درستی نمایش داده شده است.
شکل ۷۴-۳ بررسی دستور OUTER JOIN
مثال دستور RIGHT JOIN
برای انجام این دستور، دو جدول ۱۱-۳ و ۱۲-۳ را در SQL ایجاد کنید:
جدول ۱۱-۳ Orders
OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
۱۰۳۰۸ | ۲ | ۷ | ۱۹۹۶-۰۹-۱۸ | ۳ |
۱۰۳۰۹ | ۳۷ | ۳ | ۱۹۹۶-۰۹-۱۹ | ۱ |
۱۰۳۱۰ | ۷۷ | ۸ | ۱۹۹۶-۰۹-۲۰ | ۲ |
جدول ۱۲-۳ Employees
EmployeeID | LastName | FirstName | BirthDate | Photo |
۱ | Davolio | Nancy | ۱۲/۸/۱۹۶۸ | EmpID1.pic |
۲ | Fuller | Andrew | ۲/۱۹/۱۹۵۲ | EmpID2.pic |
۳ | Leverling | Janet | ۸/۳۰/۱۹۶۳ | EmpID3.pic |
بعد از ایجاد جدول باید دستورات زیر را اجرا کنید:
SELECT Orders.OrderID, Employees.LastName, Employees.FirstName
FROM Orders
RIGHT JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
ORDER BY Orders.OrderID;
در خط اول، سه ستون از دو جدول مشخص شده است و در ادامه به جدول Orders و جدول Employess متصل میشود که شرط RIGHT JOIN در جدول Employess پیادهسازی شده است، با این شرایط که Orders.EmployeeID = Employees.EmployeeID باشد؛ در شکل ۷۵-۳ این موضوع را مشاهده میکنید.
شکل ۷۵-۳ بررسی دستور RIGHT JOIN
مثال دستور Full JOIN
این دستور به طور کامل، خروجی هر دو جدول را طبق شرطی که در دستور زیر مشاهده میکنید، در خروجی شکل ۷۶-۳ نمایش میدهد.
SELECT Employees.FirstName, Orders.OrderID
FROM Employees
FULL OUTER JOIN Orders ON Employees.EmployeeID=Orders.CustomerID
ORDER BY Orders.EmployeeID;
شکل ۷۶-۳ بررسی دستور Full JOIN