W tym artykule przyjrzymy się bliżej połączeniom SQL Server JOIN. Przeanalizujemy wszystkie obsługiwane typy SQL Server JOIN wraz ze składnią, ilustracjami wizualnymi i przykładami.
Jak wszyscy wiemy, dane tabelaryczne to rdzeń każdej bazy danych SQL. Aby efektywnie z niego korzystać, administratorzy baz danych muszą regularnie wyodrębniać rekordy z kilku tabel w oparciu o określone warunki. I do tego właśnie służą SQL JOIN.
JOIN to klauzula SQL używana do pobierania dane z co najmniej dwóch tabel na podstawie logicznych relacji między tabelami. Połączenia wskazują, w jaki sposób SQL Server powinien wykorzystywać dane z jednej tabeli do wybierania wierszy w innej tabeli.
Różne typy sprzężeń w SQL
SQL Server obsługuje różne typy sprzężeń, w tym INNER JOIN , SAMO DOŁĄCZ , POŁĄCZENIE KRZYŻOWE i ZŁĄCZENIE ZEWNĘTRZNE . W rzeczywistości każdy typ sprzężenia definiuje sposób, w jaki dwie tabele są powiązane w zapytaniu. Z kolei OUTER JOINS można podzielić na LEWE OUTER JOINS , PRAWE POŁĄCZENIA ZEWNĘTRZNE i PEŁNE ZŁĄCZENIA ZEWNĘTRZNE .
Aby lepiej zademonstrować, jak działają JOIN, utworzymy dwie tabele.
CREATE TABLE AdventureWorks2019.dbo.users (
auid INT IDENTITY
,username VARCHAR(50) NOT NULL
,password VARCHAR(50) NOT NULL
,createdate DATETIME NOT NULL
,isActive TINYINT NOT NULL
);
CREATE TABLE AdventureWorks2019.dbo.userprofile (
apid INT NOT NULL
,auid INT NOT NULL
,firstname VARCHAR(50) NOT NULL
,lastname VARCHAR(50) NOT NULL
,email VARCHAR(100) NOT NULL
,phone VARCHAR(45) NOT NULL
);
Następnie musimy wstawić dane do utworzonych tabel.
USE AdventureWorks2019
GO
Insert into dbo.users
(auid, username,password, createdate, isActive)
values
(1,'admin','pswrd123', GETDATE(), 1);
Insert into dbo.userprofile
(apid, auid, firstname, lastname, email, phone)
values
(1,1,'Jack', 'Wolf', '[email protected]','600075764216');
Insert into dbo.users
(auid,username,password, createdate, isActive)
values
(2, 'admin1','pass506', GETDATE(), 1);
Insert into dbo.userprofile
(apid, auid, firstname, lastname, email, phone)
values
(2, 3, 'Tom', 'Collins', '[email protected]','878511311054');
Insert into dbo.users
(auid, username,password, createdate, isActive)
values
(4,'fox12','[email protected]', GETDATE(), 1);
Insert into userprofile
(apid, auid, firstname, lastname, email, phone)
values
(4,5,'Bill', 'Fonskin', '[email protected]','450985764216');
Insert into dbo.users
(auid,username,password, createdate, isActive)
values
(6, 'lexus1267','98hnfRT6', GETDATE(), 1);
Insert into dbo.userprofile
(apid, auid, firstname, lastname, email, phone)
values
(7, 7, 'John', 'Hopkins', '[email protected]','878511311054');
WEWNĘTRZNE DOŁĄCZENIE SQL
Instrukcja INNER JOIN zwraca rekordy, które mają pasujące wartości w obu tabelach.
Składnia klauzuli SQL INNER JOIN jest następująca:
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
Złączenia zewnętrzne SQL
W przeciwieństwie do klauzul INNER JOIN, OUTER JOIN zwraca nie tylko pasujące rekordy, ale także niepasujące rekordy. W przypadku, gdy w połączonej tabeli znajdują się niepasujące wiersze, zostaną dla nich pokazane wartości NULL.
Istnieją następujące dwa typy OUTER JOIN w SQL Server:SQL LEFT JOIN i SQL RIGHT JOIN. Przyjrzyjmy się bliżej każdemu z nich.
LEWE DOŁĄCZENIE SQL
SQL LEFT JOIN zwraca wszystkie rekordy z lewej tabeli (tabela A) i pasujące rekordy z prawej tabeli (tabela B). Wynik to 0 rekordów z prawej strony, jeśli nie ma dopasowania.
Składnia klauzuli SQL LEFT JOIN jest następująca:
SELECT column_name(s)
FROM tableA
LEFT JOIN tableB
ON tableA.column_name = tableB.column_name;
PRAWY DOŁĄCZ DO SQL
Słowo kluczowe RIGHT JOIN zwraca wszystkie rekordy z prawej tabeli (tabela 2) oraz pasujące rekordy z lewej tabeli (tabela 1). Wynik to 0 rekordów od lewej strony, jeśli nie ma dopasowania.
Składnia klauzuli SQL RIGHT JOIN jest następująca:
SELECT column_name(s)
FROM tableA
RIGHT JOIN tableB
ON tableA.column_name = tableB.column_name;
Pełne złącze zewnętrzne SQL
FULL OUTER JOIN zwraca wszystkie rekordy, gdy istnieje dopasowanie w rekordach lewej (tabela A) lub prawej (tabela B) tabeli.
Składnia klauzuli SQL FULL OUTER JOIN jest następująca:
SELECT column_name(s)
FROM tableA
FULL OUTER JOIN tableB
ON tableA.column_name = tableB.column_name
WHERE condition;
POŁĄCZENIE KRZYŻOWE SQL
SQL CROSS JOIN, znany również jako JOIN kartezjański, pobiera wszystkie kombinacje wierszy z każdej tabeli. W tego typu JOIN zestaw wyników jest zwracany przez pomnożenie każdego wiersza tabeli A przez wszystkie wiersze tabeli B, jeśli nie zostanie wprowadzony żaden dodatkowy warunek.
Aby lepiej zrozumieć CROSS JOIN, spójrzmy na poniższy diagram Venna.
Składnia SQL CROSS JOIN jest następująca:
SELECT *
FROM tableA
CROSS JOIN tableB;
Samodzielne dołączenie SQL
Self-join jest zwykłym JOIN, ale stół jest łączony ze sobą. Oznacza to, że każdy wiersz tabeli jest łączony ze sobą iz każdym innym wierszem tabeli.
Składnia SQL self JOIN jest następująca:
SELECT column_name(s)
FROM table1 T1, table1 T2
WHERE condition;
Wniosek
Wiedza i doświadczenie w posługiwaniu się klauzulami SQL JOIN to podstawowe umiejętności każdego DBA czy analityka. Dzięki doskonałej funkcji uzupełniania kodu dbForge Studio dla SQL Server może zaoszczędzić Twój czas i wysiłek przy pisaniu nawet najbardziej skomplikowanych klauzul JOIN. Nie musisz pamiętać o setkach nazw kolumn lub aliasów, dbForge Studio for SQL wyświetli pełną klauzulę SQL JOIN. Bogata funkcjonalność narzędzia sprawia, że projektowanie złożonych zapytań SQL i zarządzanie warunkami JOIN jest szybkie, łatwe i wygodne.