MySQL Dołącz: Wewnętrzny, Zewnętrzny, Lewy, Prawy, Krzyżowy
⚡ Inteligentne podsumowanie
MySQL JOINS łączą wiersze z dwóch lub więcej powiązanych tabel w jeden zestaw wyników. Ten materiał wyjaśnia JOINS CROSS, INNER, LEFT, RIGHT i OUTER z zapytaniami uruchamialnymi, przykładowymi danymi i przejrzystymi tabelami wyjściowymi do praktycznej pracy z bazami danych.

Czym są DOŁĄCZENIA?
Złączenia pomagają w pobieraniu danych z dwóch lub więcej tabel bazy danych.
Tabele są ze sobą powiązane za pomocą kluczy podstawowych i obcych.
Uwaga: JOIN to najbardziej niezrozumiały temat wśród osób uczących się SQL. Dla uproszczenia i ułatwienia zrozumienia, do ćwiczenia przykładu użyjemy nowej bazy danych. Jak pokazano poniżej.
Każdy z poniższych przykładów wykorzystuje te dwie tabele. identyfikator_filmu kolumna w członkowie wskazuje na id kolumna w filmy — relacja, do której pasuje każde JOIN.
członkowie
| id | pierwsze imię | nazwisko | identyfikator_filmu |
|---|---|---|---|
| 1 | Adam | Kowal | 1 |
| 2 | Ravi | Kumar | 2 |
| 3 | Susan | Davidson | 5 |
| 4 | Jenny | Adrianna | 8 |
| 5 | Lee | Pong | 10 |
filmy
| id | tytuł | kategoria |
|---|---|---|
| 1 | ASSASSIN'S CREED: EMBERS | Animacje |
| 2 | Prawdziwa stal (2012) | Animacje |
| 3 | Alvin i wiewiórki | Animacje |
| 4 | Przygody Tin Tin | Animacje |
| 5 | Bezpieczny (2012) | Działania |
| 6 | Bezpieczny dom (2012) | Działania |
| 7 | GIA | 18 + |
| 8 | Termin 2009 | 18 + |
| 9 | Brudny obrazek | 18 + |
| 10 | Marley i ja | Romans |
Dlaczego powinniśmy używać połączeń JOIN?
Zanim przyjrzymy się poszczególnym typom połączeń JOIN, warto wiedzieć, dlaczego połączenie JOIN jest lepszym rozwiązaniem niż wykonywanie kilku zapytań.
Teraz możesz pomyśleć, dlaczego używamy JOIN, skoro możemy wykonać to samo zadanie, uruchamiając zapytania. Zwłaszcza jeśli masz pewne doświadczenie w programowaniu baz danych, wiesz, że możemy uruchamiać zapytania jedno po drugim i wykorzystywać dane wyjściowe każdego z nich w kolejnych zapytaniach. Oczywiście, że jest to możliwe. Ale używając JOIN, możesz wykonać całą pracę, używając tylko jednego zapytania z dowolnymi parametrami wyszukiwania. Z drugiej strony MySQL może osiągnąć lepszą wydajność z JOINami, ponieważ może korzystać z indeksowania. Po prostu użycie pojedynczego zapytania JOIN zamiast uruchamiania wielu zapytań zmniejsza obciążenie serwera. Zamiast tego używaj wielu zapytań, co prowadzi do większej liczby transferów danych między MySQL i aplikacje (oprogramowanie). Ponadto wymaga to większej manipulacji danymi również po stronie aplikacji.
Wiadomo, że stać nas na więcej MySQL i wydajność aplikacji przy użyciu połączeń JOIN.
Rodzaje połączeń JOIN
MySQL Obsługuje kilka typów JOIN, z których każdy odpowiada na inne pytanie dotyczące tych samych dwóch tabel. Poniższa tabela je porównuje; następnie każdy typ jest zaprezentowany za pomocą zapytania i jego wyniku.
| Typ JOIN | Zwrócono wiersze | Czy w wyniku są wartości NULL? | Typowe zastosowanie |
|---|---|---|---|
| KRZYŻ DOŁĄCZ | Każdy wiersz tabeli A sparowany z każdym wierszem tabeli B | Nie | Generowanie wszystkich możliwych kombinacji |
| INNER JOIN | Tylko wiersze spełniające warunek w obu tabelach | Nie | Członkowie, którzy faktycznie wypożyczyli film |
| LEFT JOIN | Wszystkie wiersze z lewej tabeli, plus dopasowania z prawej | Tak, po prawej stronie | Wszystkie filmy, nawet te nigdy nie wypożyczane |
| WŁAŚCIWE DOŁĄCZENIE | Wszystkie wiersze z prawej tabeli, plus dopasowania z lewej | Tak, po lewej stronie | Wszystkie filmy, nawet bez przypisanego członka |
KRZYŻ DOŁĄCZ
Cross JOIN to najprostsza forma JOIN, która dopasowuje każdy wiersz z jednej tabeli bazy danych do wszystkich wierszy drugiej.
Innymi słowy, daje nam kombinacje każdego wiersza pierwszej tabeli ze wszystkimi rekordami w drugiej tabeli.
Załóżmy, że chcemy uzyskać zestawienie wszystkich rekordów członków ze wszystkimi rekordami filmów. Możemy użyć skryptu pokazanego poniżej, aby uzyskać pożądane rezultaty.
SELECT * FROM `movies` CROSS JOIN `members`
Wykonanie powyższego skryptu w MySQL Workbench daje nam następujące wyniki.
| id | title | id | first_name | last_name | movie_id | |
|---|---|---|---|---|---|---|
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 1 | Adam | Smith | 1 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 2 | Ravi | Kumar | 2 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 3 | Susan | Davidson | 5 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 4 | Jenny | Adrianna | 8 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 6 | Lee | Pong | 10 |
| 2 | Real Steel(2012) | Animations | 1 | Adam | Smith | 1 |
| 2 | Real Steel(2012) | Animations | 2 | Ravi | Kumar | 2 |
| 2 | Real Steel(2012) | Animations | 3 | Susan | Davidson | 5 |
| 2 | Real Steel(2012) | Animations | 4 | Jenny | Adrianna | 8 |
| 2 | Real Steel(2012) | Animations | 6 | Lee | Pong | 10 |
| 3 | Alvin and the Chipmunks | Animations | 1 | Adam | Smith | 1 |
| 3 | Alvin and the Chipmunks | Animations | 2 | Ravi | Kumar | 2 |
| 3 | Alvin and the Chipmunks | Animations | 3 | Susan | Davidson | 5 |
| 3 | Alvin and the Chipmunks | Animations | 4 | Jenny | Adrianna | 8 |
| 3 | Alvin and the Chipmunks | Animations | 6 | Lee | Pong | 10 |
| 4 | The Adventures of Tin Tin | Animations | 1 | Adam | Smith | 1 |
| 4 | The Adventures of Tin Tin | Animations | 2 | Ravi | Kumar | 2 |
| 4 | The Adventures of Tin Tin | Animations | 3 | Susan | Davidson | 5 |
| 4 | The Adventures of Tin Tin | Animations | 4 | Jenny | Adrianna | 8 |
| 4 | The Adventures of Tin Tin | Animations | 6 | Lee | Pong | 10 |
| 5 | Safe (2012) | Action | 1 | Adam | Smith | 1 |
| 5 | Safe (2012) | Action | 2 | Ravi | Kumar | 2 |
| 5 | Safe (2012) | Action | 3 | Susan | Davidson | 5 |
| 5 | Safe (2012) | Action | 4 | Jenny | Adrianna | 8 |
| 5 | Safe (2012) | Action | 6 | Lee | Pong | 10 |
| 6 | Safe House(2012) | Action | 1 | Adam | Smith | 1 |
| 6 | Safe House(2012) | Action | 2 | Ravi | Kumar | 2 |
| 6 | Safe House(2012) | Action | 3 | Susan | Davidson | 5 |
| 6 | Safe House(2012) | Action | 4 | Jenny | Adrianna | 8 |
| 6 | Safe House(2012) | Action | 6 | Lee | Pong | 10 |
| 7 | GIA | 18+ | 1 | Adam | Smith | 1 |
| 7 | GIA | 18+ | 2 | Ravi | Kumar | 2 |
| 7 | GIA | 18+ | 3 | Susan | Davidson | 5 |
| 7 | GIA | 18+ | 4 | Jenny | Adrianna | 8 |
| 7 | GIA | 18+ | 6 | Lee | Pong | 10 |
| 8 | Deadline(2009) | 18+ | 1 | Adam | Smith | 1 |
| 8 | Deadline(2009) | 18+ | 2 | Ravi | Kumar | 2 |
| 8 | Deadline(2009) | 18+ | 3 | Susan | Davidson | 5 |
| 8 | Deadline(2009) | 18+ | 4 | Jenny | Adrianna | 8 |
| 8 | Deadline(2009) | 18+ | 6 | Lee | Pong | 10 |
| 9 | The Dirty Picture | 18+ | 1 | Adam | Smith | 1 |
| 9 | The Dirty Picture | 18+ | 2 | Ravi | Kumar | 2 |
| 9 | The Dirty Picture | 18+ | 3 | Susan | Davidson | 5 |
| 9 | The Dirty Picture | 18+ | 4 | Jenny | Adrianna | 8 |
| 9 | The Dirty Picture | 18+ | 6 | Lee | Pong | 10 |
| 10 | Marley and me | Romance | 1 | Adam | Smith | 1 |
| 10 | Marley and me | Romance | 2 | Ravi | Kumar | 2 |
| 10 | Marley and me | Romance | 3 | Susan | Davidson | 5 |
| 10 | Marley and me | Romance | 4 | Jenny | Adrianna | 8 |
| 10 | Marley and me | Romance | 6 | Lee | Pong | 10 |
INNER JOIN
CROSS JOIN zwraca wszystkie możliwe pary, co rzadko jest pożądane. INNER JOIN zawęża wynik do par, które są faktycznie powiązane.
Wewnętrzne JOIN służy do zwracania wierszy z obu tabel spełniających podany warunek.
Załóżmy, że chcesz uzyskać listę członków, którzy wypożyczyli filmy, wraz z tytułami wypożyczonych przez nich filmów. Możesz w tym celu po prostu użyć połączenia INNER JOIN, które zwróci wiersze z obu tabel spełniające zadane warunki.
SELECT members.`first_name` , members.`last_name` , movies.`title` FROM members ,movies WHERE movies.`id` = members.`movie_id`
Wykonanie powyższego skryptu Give
| first_name | last_name | title |
|---|---|---|
| Adam | Smith | ASSASSIN'S CREED: EMBERS |
| Ravi | Kumar | Real Steel(2012) |
| Susan | Davidson | Safe (2012) |
| Jenny | Adrianna | Deadline(2009) |
| Lee | Pong | Marley and me |
Należy pamiętać, że powyższy skrypt wyników można również zapisać w następujący sposób, aby osiągnąć te same wyniki.
SELECT A.`first_name` , A.`last_name` , B.`title` FROM `members` AS A INNER JOIN `movies` AS B ON B.`id` = A.`movie_id`
Zewnętrzne ŁĄCZENIA
Połączenie INNER JOIN automatycznie usuwa wiersze, które nie mają partnera. Gdy te niepasujące wiersze mają znaczenie, połączenie OUTER JOIN jest właściwym wyborem.
MySQL Połączenia zewnętrzne JOIN zwracają wszystkie rekordy pasujące do obu tabel.
Może wykryć rekordy, które nie pasują do połączonej tabeli. To powraca NULL wartości rekordów połączonej tabeli, jeśli nie znaleziono dopasowania.
Brzmi zagmatwanie? Przyjrzyjmy się przykładowi –
LEFT JOIN
Załóżmy teraz, że chcesz uzyskać tytuły wszystkich filmów wraz z nazwiskami członków, którzy je wypożyczyli. Wiadomo, że niektórych filmów nikt nie wypożyczał. Możemy po prostu skorzystać LEFT JOIN w celu.
LEFT JOIN zwraca wszystkie wiersze z tabeli po lewej stronie, nawet jeśli w tabeli po prawej nie znaleziono żadnych pasujących wierszy. Jeżeli w tabeli po prawej stronie nie znaleziono żadnych dopasowań, zwracana jest wartość NULL.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B ON B.`movie_id` = A.`id`
Wykonanie powyższego skryptu w MySQL Workbench podaje wynik. W zwróconym wyniku, który jest wymieniony poniżej, widać, że dla filmów, które nie są wypożyczone, pola nazw członków mają wartości NULL. Oznacza to, że nie znaleziono tabeli członków pasującej do tego konkretnego filmu.
| title | first_name | last_name |
|---|---|---|
| ASSASSIN'S CREED: EMBERS | Adam | Smith |
| Real Steel(2012) | Ravi | Kumar |
| Safe (2012) | Susan | Davidson |
| Deadline(2009) | Jenny | Adrianna |
| Marley and me | Lee | Pong |
| Alvin and the Chipmunks | NULL | NULL |
| The Adventures of Tin Tin | NULL | NULL |
| Safe House(2012) | NULL | NULL |
| GIA | NULL | NULL |
| The Dirty Picture | NULL | NULL |
WŁAŚCIWE DOŁĄCZENIE
PRAWE DOŁĄCZENIE jest oczywiście przeciwieństwem LEWEGO DOŁĄCZENIA. RIGHT JOIN zwraca wszystkie kolumny z tabeli po prawej stronie, nawet jeśli w tabeli po lewej stronie nie znaleziono pasujących wierszy. Jeżeli w tabeli po lewej stronie nie znaleziono żadnych dopasowań, zwracana jest wartość NULL.
W naszym przykładzie załóżmy, że musisz uzyskać nazwiska członków i wypożyczone przez nich filmy. Teraz mamy nowego członka, który nie wypożyczył jeszcze żadnego filmu
SELECT A.`first_name` , A.`last_name`, B.`title` FROM `members` AS A RIGHT JOIN `movies` AS B ON B.`id` = A.`movie_id`
Wykonanie powyższego skryptu w MySQL workbench daje następujące wyniki.
| first_name | last_name | title |
|---|---|---|
| Adam | Smith | ASSASSIN'S CREED: EMBERS |
| Ravi | Kumar | Real Steel(2012) |
| Susan | Davidson | Safe (2012) |
| Jenny | Adrianna | Deadline(2009) |
| Lee | Pong | Marley and me |
| NULL | NULL | Alvin and the Chipmunks |
| NULL | NULL | The Adventures of Tin Tin |
| NULL | NULL | Safe House(2012) |
| NULL | NULL | GIA |
| NULL | NULL | The Dirty Picture |
Klauzule „ON” i „USING”.
Wszystkie dotychczasowe zapytania dopasowały wiersze do klauzuli ON. MySQL oferuje krótszą alternatywę, gdy dopasowane kolumny mają tę samą nazwę.
W powyższych przykładach zapytań JOIN użyliśmy klauzuli ON w celu dopasowania rekordów pomiędzy tabelami.
Klauzula USING może być również użyta w tym samym celu. Różnica z ZA POMOCĄ jest to musi mieć identyczne nazwy dopasowanych kolumn w obu tabelach.
W tabeli „filmy” dotychczas używaliśmy jej klucza podstawowego o nazwie „id”. Odnosiliśmy się do tego w tabeli „członkowie” pod nazwą „movie_id”.
Zmieńmy nazwę pola „id” tabel „filmy” na „id_filmu”. Robimy to, aby mieć identyczne, dopasowane nazwy pól.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Następnie użyjmy USING z powyższym przykładem LEFT JOIN.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B USING ( `movie_id` )
Oprócz użycia ON oraz UŻYWANIE z połączeniami możesz użyć wielu innych MySQL klauzule jak GRUPUJ WEDŁUG, GDZIE a nawet działa jak SUMA, AVG, itp.




