SQL JOIN – Czym są złączenia JOIN w SQL Server?
Złączenia SQL JOIN to złączenia poziome. W poprzednim rozdziale poznaliśmy proste złączenie z relacją wprowadzaną w klauzuli WHERE. Przykład był jedynie uproszczeniem. Takie samo złączenie możemy wykonać korzystając ze złączeń JOIN. Profesjonalnie napisany kod SQL zawiera te właśnie złączenia. Złączenia JOIN możemy podzielić na dwie podstawowe grupy: wewnętrzne i zewnętrzne. Ogólna postać wszystkich złączeń JOIN jest następująca:
SELECT (KOLUMNY)
FROM TABELA_1
(RODZAJ ZŁĄCZENIA) JOIN TABELA_2
on TABELA_1.ID = TABELA_2.ID
go
Jak widzimy po frazie ON określamy relacje, za pomocą których łączymy ze sobą tabele lub widoki. JOIN w SQL Server daje nam możliwość łączenia tabel, widoków przechowywanych w różnych schematach, różnych bazach a także na różnych serwerach np za pomocą linków bazodanowych.
JOIN w SQL Server – Złączenie wewnętrzne INNER JOIN
Złączenie wewnętrzne to tzw. INNER JOIN. Jest to inna postać złączenia, którą opisaliśmy w poprzednim rozdziale kursu SQL. INNER JOIN zwraca wynik zapytania w postaci rekrodów, dla których w obu tabelach dopasowane są relację. Pokazuje część wspólną. Złączenie wewnętrzne (INNER) JOIN możesz zapisywać w kodzie SQL po prostu frazą JOIN. Wynik obu zapytań będzie taki sam.
Zapiszmy przykład z poprzedniego rozdziału za pomocą złączenia INNER JOIN. Samą relację w złączeniach JOIN określamy po wybraniu tabeli, którą dołączamy jako drugą. Relacja zapisywana jest po frazie ON. np. ON TABELA_1.ID = TABELA_2.ID
USE AdventureWorks2014
GO
SELECT *
FROM AdventureWorks2014.Production.ProductCategory A
INNER JOIN AdventureWorks2014.Production.ProductSubcategory B
on A.ProductCategoryID = B.ProductCategoryID
go
JOIN w SQL Server – Złączenie zewnętrzne LEFT OUTER JOIN
LEFT JOIN lub też zamiennie LEFT OUTER JOIN to złączenie zewnętrzne. Wynikiem zapytania będą wszystkie rekordy z tabeli 1 i tylko te rekordy z tabeli 2, które możemy dopasować. W przypadku, gdy rekord z tabeli 2 nie zostanie dopasowany, wyświetlona zostanie wartość NULL.
Zróbmy krótki przykład z użyciem LEFT JOIN. Połączmy ze sobą tabele SalesPerson i SalesTerritory. Obie tabele możemy połączyć ze sobą za pomocą kolumny TerritoryID. Najważniejsze jest to, że nie wszystkie rekordy z tabeli SalesTerritory można dopasować do tabeli SalesPerson.
USE AdventureWorks2014;
GO
SELECT a.BusinessEntityID,
b.CountryRegionCode
FROM
Sales.SalesPerson a
LEFT JOIN Sales.SalesTerritory b
ON a.TerritoryID = b.TerritoryID
;
JOIN w SQL Server – Złączenie zewnętrzne RIGHT OUTER JOIN
RIGHT OUTER JOIN lub zamiennie RIGHT JOIN jest dokładną odwrotnością złączenia LEFT. W przypadku łączenia kolejno tabeli 1 i tabeli 2, zostają zwrócone wszystkie rekordy z tabeli 2 i tylko te rekordy z tabeli 1, które możemy dopasować. Podobnie jak w przypadku poprzedniego przykładu, rekordy niedopasowane otrzymają wartość NULL.
Zróbmy krótki przykład i stwórzmy złączenie RIGHT JOIN podobnie jak w poprzednim punkcie:
USE AdventureWorks2014;
GO
SELECT
A.ProductReviewID,
B.Name
FROM Production.ProductReview A
RIGHT OUTER JOIN
Production.Product B
ON B.ProductID = A.ProductID;
JOIN w SQL Server – Warunek w klauzuli FROM
Wiemy już, że warunki w kodzie SQL możemy wprowadzać w klauzuli WHERE. Warunki dla danych z tabeli możemy wprowadzać także w klauzuli FROM zaraz za relacją pomiędzy tabelami. Jedyne, co musimy zrobić, to dopisać frazę AND po relacji między tabelami. Same warunki wprowadzamy analogicznie jak w klauzuli WHERE. Poniżej przykład. Dane z tabeli Production.ProductCategory ograniczamy w kolumnie Name do wartości „Bikes”. Warunki w klauzuli FROM i WHERE możemy stosować jednocześnie.
USE AdventureWorks2014;
GO
SELECT a.Name, b.Name FROM
Production.ProductSubcategory A
LEFT JOIN Production.ProductCategory B
ON A.ProductCategoryID = B.ProductCategoryID
AND B.Name = 'Bikes'
JOIN w SQL Server – Złączenie zewnętrzne FULL OUTER JOIN
FULL OUTER JOIN lub w skrócie FULL JOIN to złączenie które nie tylko pokazuje wszystkie dopasowane dane z obydwu tabel, ale także dane niedopasowane. W miejscu niedopasowania zapytanie zwróci nam wartość NULL.
USE AdventureWorks2014;
GO
SELECT a.Name, b.Name FROM
Production.ProductSubcategory A
FULL JOIN Production.ProductCategory B
ON A.ProductCategoryID = B.ProductCategoryID
AND B.Name = 'Bikes'
and A.Name = 'Mountain Bikes'
Jak widzisz, w poprzednim punkcie poznaliśmy warunek zapisywany w klauzuli JOIN. Właśnie w takich przypadkach możemy ten warunek wykorzystać.
JOIN w SQL Server – Złączenie krzyżowe CROSS JOIN – złączenie kartezjańskie
Złączenie kartezjańskie CROSS JOIN poznaliśmy już w poprzednim rozdziale szkolenia SQL. Wtedy wykonaliśmy złączenie w klauzuli WHERE bez użycia JOIN’a. Ten sam skrypt możemy zapisać z użyciem złączenia CROSS JOIN. Wynikiem zapytania będą wszystkie rekordy z tabeli 1 połączone ze wszystkimi rekordami z tabeli 2. W przypadku tego złączenia nie określamy relacji. Wszystkie rekordy i tak zostaną w tym wypadku połączone.
USE AdventureWorks2014;
GO
SELECT *
FROM AdventureWorks2014.Production.ProductCategory A
CROSS JOIN AdventureWorks2014.Production.ProductSubcategory B
go
Przykłady wykorzystania MsSQL i kurs SQL Server zamieszczam pod tym adresem: SQL Server kurs.
3 komentarze “Złączenia JOIN w SQL Server”
dzięki, fajnie wyjaśnione
Czy złączenie CROSS JOIN ma jakieś zastosowanie?
Tak, są przypadki, gdy np łączymy SQL z Excelem lub innym programem prezentującym ostatecznie nasze dane. Właśnie w prezentacji ma to swoje zastosowanie. Zamieszczę w najbliższym czasie przykład i dam Ci znać.