Tradycyjnie pobierasz dane z dwóch lub więcej tabel za pomocą WHERE
klauzula w zapytaniu. Ale w relacyjnym systemie baz danych (RDBMS) można to osiągnąć za pomocą jednego SELECT
zapytanie. To jest prawdziwa moc systemów relacyjnych baz danych. W tym przewodniku poznasz połączenia SQL, potężny sposób porównywania i wybierania wierszy i tabel.
Co to jest złącze SQL?
W SQL join
klauzula rozszerza możliwości porównywania i wybierania wierszy z tabel. Wykorzystuje algebraiczny proces łączenia wierszy z dwóch lub więcej tabel na podstawie powiązanej kolumny w tych tabelach. Zgodnie ze standardową definicją SQL ANSI, istnieje pięć typów złączeń — złącza krzyżowe , Łączenia wewnętrzne , Połączenia lewe (zewnętrzne) , Połączenia prawe (zewnętrzne) i Pełne (zewnętrzne) złączenia . Te połączenia są implementowane we wszystkich systemach relacyjnych baz danych i są omówione w poniższych sekcjach.
Uwaga Sprzężenia mogą być wykonywane na dowolnej liczbie tabel w danym zapytaniu. Dla zwięzłości i jasności ten przewodnik omawia sprzężenia zastosowane do dwóch tabel.
Ten przewodnik wykorzystuje dwie tabele, Employees
i Address
, aby zademonstrować łączenia SQL. Każda z tych tabel zawiera następujące definicje kolumn i dane:
-
Tabela pracowników
Identyfikator pracownika Nazwa pracownika 1 Jan 2 Maryi 3 Robert -
Tabela adresowa
Identyfikator Stan 1 Nowy Jork 2 New Jersey 3 Idaho 4 Hawaje
Uwaga O ile nie wspomniano inaczej, wszystkie polecenia w tym przewodniku działają dobrze zarówno na MySQL i PostgreSQL bazy danych.
Połączenia krzyżowe SQL
Znany również jako złącze kartezjańskie , Połączenia krzyżowe występują, gdy określisz wiele tabel jako źródło dla SELECT
lista kolumn. W takim przypadku pomijasz WHERE
wyrażenie sprzężenia klauzuli, aby dopasować wiersze. Zestaw wyników zawiera wiersz dla każdej kombinacji wierszy między tabelami. W scenariuszu z dwiema tabelami każdy wiersz w jednej tabeli jest sparowany z każdym wierszem w drugiej tabeli. Otrzymany produkt jest znany jako produkt kartezjański z dwóch tabel. Składnia łączenia krzyżowego jest następująca:
(# Rows in Table A) TIMES (# of Rows in Table B)
UwagaW teorii zbiorów iloczyn kartezjański jest operacją mnożenia, która generuje wszystkie uporządkowane pary danych zbiorów. Rozważmy na przykład ustawienie
A
z elementami{a,b}
i ustawB
z elementami{1,2,3}
. Produkt kartezjańskiA
iB
jest oznaczony przezAxB
a wynik jest następujący:AxB ={(a,1), (a,2), (a,3), (b,1), (b,2), (b,3)}
Składnia SQL dla łączenia krzyżowego jest następująca:
SELECT ColumnName_1,
ColumnName_2,
ColumnName_N
FROM [Table_1]
CROSS JOIN [Table_2]
Z powyższej składni, Column_1
, Column_2
, Column_N
reprezentują kolumny w tabeli, a CROSS JOIN
klauzula służy do łączenia dwóch tabel, Table_1
i Table_2
. Z powyższych przykładowych tabel, jeśli chcesz wykonać połączenie krzyżowe na Employees
i Address
tabele, użyj następującego kodu SQL:
SELECT EmployeeName, State
FROM Employees
CROSS JOIN Address
Wynik powyższego kodu SQL jest podobny do następującego:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| John | New Jersey |
| John | Idaho |
| John | Hawaii |
| John | New York |
| Mary | New York |
| Mary | New Jersey |
| Mary | Idaho |
| Mary | Hawaii |
| Robert | New York |
| Robert | New Jersey |
| Robert | Idaho |
| Robert | Hawaii |
+------------+----------------+
Połączenie wewnętrzne SQL
Sprzężenie wewnętrzne zwraca wiersze, które mają pasujące wartości w obu tabelach. Jeśli nie ma pasujących rekordów, w wynikach nie są zwracane żadne wiersze.
Składnia SQL dla Inner Join jest następująca:
SELECT ColumnName_1,
ColumnName_2,
ColumnName_N
FROM Table_1
INNER JOIN Table_2
ON Table_1.key = Table_2.key;
W powyższym przykładzie key
jest odpowiednim kluczem w tabelach. Jeśli potrzebujesz wykonać wewnętrzne sprzężenie na Employees
i Address
tabele, użyj następującego kodu SQL:
SELECT EmployeeName, State
FROM Employees
INNER JOIN Address
ON Employees.EmployeeId = Address.Id
Wynik powyższego kodu SQL jest podobny do następującego:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
+------------+----------------+
Połączenie lewe (zewnętrzne) SQL
Left Join zwraca pełny zestaw wierszy z lewej tabeli wraz z pasującymi wierszami z prawej tabeli. Jeśli nie ma pasujących rekordów, to NULL
wartości są zwracane z odpowiedniej tabeli.
Uwaga Niektóre implementacje relacyjnych baz danych używają słów kluczowych „Left Outer Join”, w przeciwieństwie do „Left Join”, ale są one funkcjonalnie równoważne.
Składnia SQL dla Left Join jest następująca:
SELECT * FROM Table_1
LEFT JOIN Table_2
ON Table_1.key = Table_2.key
W powyższym przykładzie key
jest odpowiednim kluczem w tabelach. Jeśli potrzebujesz wykonać lewe dołączenie na Employees
i Address
tabele, użyj następującego kodu SQL:
SELECT EmployeeName, State
FROM Employees
LEFT JOIN Address
ON Employees.EmployeeId = Address.Id
Wynik powyższego kodu SQL jest następujący:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
| Robert | NULL |
+------------+----------------+
Połączenie prawe SQL (zewnętrzne)
Right Join zwraca pełny zestaw wierszy z prawej tabeli i pasujące wiersze z lewej tabeli. Jest to również znane jako prawe połączenie zewnętrzne. Jeśli nie ma pasujących rekordów, to NULL
wartości są zwracane z prawej tabeli, dla odpowiednich wierszy w lewej tabeli.
Uwaga Niektóre implementacje relacyjnych baz danych używają słów kluczowych „Right Outer Join”, w przeciwieństwie do „Right Join”, ale są one funkcjonalnie równoważne.
Składnia SQL dla prawego łączenia jest następująca:
SELECT * FROM Table_1
RIGHT JOIN Table_2
ON Table_1.key = Table_2.key
Z powyższego kodu, key
jest odpowiednim kluczem w tabelach. Jeśli potrzebujesz wykonać prawidłowe dołączenie na Employees
i Address
tabele, użyj następującego kodu SQL:
SELECT EmployeeName, State
FROM Employees
RIGHT JOIN Address
ON Employees.EmployeeId = Address.Id
Wynik powyższego kodu SQL jest następujący:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
| NULL | Idaho |
| NULL | Hawaii |
+------------+----------------+
Pełne (zewnętrzne) łączenie SQL
Full Join zwraca wszystkie wiersze z lewej tabeli, wszystkie wiersze z prawej tabeli. Jest to również znane jako pełne połączenie zewnętrzne. Pełne złączenie zwraca również wszystkie pasujące rekordy z obu tabel, jeśli są dostępne. Jeśli nie ma pasujących rekordów, to NULL
wartości są zwracane z lewej tabeli. Zwraca również NULL
wartości z prawej tabeli.
Uwaga Niektóre implementacje relacyjnych baz danych używają słów kluczowych „Full Outer Join”, w przeciwieństwie do „Full Join”, ale są one funkcjonalnie równoważne.
Składnia SQL dla pełnego dołączenia jest następująca:
SELECT * FROM Table1
FULL JOIN Table2
ON Table1.key = Table2.key
W powyższym kodzie key
jest odpowiednim kluczem w tabelach. Jeśli potrzebujesz wykonać pełne dołączenie na Employees
i Address
tabele, użyj następującego kodu SQL:
SELECT EmployeeName, State
FROM Employees
FULL JOIN Address
ON Employees.EmployeeId = Address.Id
Wynik powyższego kodu SQL jest następujący:
+--------------+--------------+
| EmployeeName | State |
+---------------+-------------+
| John | New York |
| Mary | New Jersey |
| Robert | NULL |
| NULL | Idaho |
| NULL | Hawaii |
+------------+----------------+
Uwaga Podczas obliczeń Join, jeśli porównasz dane tabeli zNULL
wartości, nie pasują do siebie. StądNULL
wartości są zwracane tylko jako część wyników łączenia i są ignorowane podczas obliczeń łączenia.
Porównanie wydajności złączeń SQL
Biorąc pod uwagę powyższe tabele przykładowe, Inner Join jest zazwyczaj najszybszą z pięciu klauzul Join pod względem wydajności bazy danych. Lewe sprzężenie i prawe sprzężenie są najszybsze w zależności od rozmiaru dwóch tabel. Pełne łączenie jest zwykle wolniejsze niż lewe łączenie lub prawe łączenie. Połączenie krzyżowe, zależne od kartezjańskiego produktu obu tabel, jest zazwyczaj najwolniejsze pod względem wydajności bazy danych. Określona hierarchia wydajności może się różnić w zależności od długości kolumny tabeli, typu danych kolumny i definicji kluczy.
Wniosek
Użycie złączeń SQL rozszerza funkcjonalność możliwości porównywania wierszy tabeli w porównaniu z tradycyjnym WHERE
zapytania klauzulowe. Sprzężenia są cennym mechanizmem do zastosowania logiki algebraicznej do dwóch lub więcej tabel.