MySQL POŁĄCZENIA Poradnik: WEWNĘTRZNY, ZEWNĘTRZNY, LEWY, PRAWY, KRZYŻ
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 zajmujących się SQL. W trosce o prostotę i łatwość zrozumienia będziemy używać nowej bazy danych do ćwiczenia próbki. Jak pokazano niżej
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 |
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 |
Rodzaje złączeń
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
Wewnętrzne JOIN służy do zwracania wierszy z obu tabel spełniających podany warunek.
Załóżmy, że chcesz uzyskać listę użytkowników, którzy wypożyczyli filmy, wraz z tytułami wypożyczonych przez nich filmów. Można do tego po prostu użyć INNER JOIN, która zwraca wiersze z obu tabel spełniające podane 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
MySQL Zewnętrzne JOIN zwracają wszystkie pasujące rekordy z 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 mylące? Spójrzmy na przykład –
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 daje. Możesz zobaczyć, że w zwróconym wyniku, który jest wymieniony poniżej, w przypadku filmów, które nie są wypożyczone, pola nazw członków mają wartości NULL. Oznacza to, że żaden pasujący członek nie znalazł tabeli członków dla 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”.
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 i UŻYWANIE z połączeniami możesz użyć wielu innych MySQL klauzule jak GRUPUJ WG, GDZIE a nawet działa jak SUMA, AVG, itp.
Dlaczego powinniśmy używać złączeń?
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.
Podsumowanie
- JOINS pozwalają nam łączyć dane z więcej niż jednej tabeli w jeden zestaw wyników.
- JOINS mają lepszą wydajność w porównaniu do zapytań podrzędnych
- INNER JOINS zwraca tylko wiersze spełniające podane kryteria.
- OUTER JOINS może również zwracać wiersze, w których nie znaleziono żadnych dopasowań. Niedopasowane wiersze są zwracane ze słowem kluczowym NULL.
- Główne typy JOIN obejmują Inner, Left Outer, Right Outer, Cross JOINS itp.
- Często używaną klauzulą w operacjach JOIN jest „ON”. Klauzula „USING” wymaga, aby pasujące kolumny miały tę samą nazwę.
- JOINS można również stosować w innych klauzulach, takich jak GROUP BY, WHERE, SUB QUERIES, FUNKCJE AGREGATOWE itp.