W poprzedniej części tej serii MySQL pokazałem, jak można pobierać dane za pomocą klauzul MySQL. W tej części dowiemy się o funkcjach Joins w MySQL, dlaczego są one używane i jak z nich korzystać. Zaczynajmy.
Jak połączyć dwie tabele w MySQL
Połączenia MySQL umożliwiają dostęp do danych z wielu tabel. Złączenie MySQL jest wykonywane, gdy w instrukcji SQL są łączone co najmniej dwie tabele. Złączania MySQL obejmują:Złączenie wewnętrzne MySQL (znane również jako Złączenie proste), Złączenie lewe zewnętrzne (zwane również Złączeniem Lewym, zwraca pasujące rekordy z lewej tabeli), Złączenie prawe (zwraca pasujące rekordy z prawej tabeli) i Full Join (zwraca pasujące rekordy ze wszystkich tabel). Korzystając z połączeń MySQL JOIN, będziesz mógł dołączyć do więcej niż dwóch stołów.
W MySQL złącze wewnętrzne jest złączeniem domyślnym. W przypadku danych słów kluczowych w tym momencie wybiera wszystkie wiersze z obu tabel, o ile istnieje współrzędna między kolumnami w obu tabelach.
W przeciwieństwie do SQL, MySQL nie traktuje Outer Join jako oddzielnego typu Join. Aby uzyskać takie same wyniki, jak w przypadku połączenia zewnętrznego, musisz dołączyć do połączenia lewego i prawego zewnętrznego.
Ile tabel można połączyć w MySQL
Zgodnie z oficjalną dokumentacją MySQL 8.0, maksymalna liczba tabel w instrukcji JOIN to 61. Należy jednak pamiętać, że instrukcje JOIN mogą wymagać dużej ilości zasobów serwera, gdy liczba tabel rośnie. Jeśli tak jest w przypadku Twojego zapytania, zdecydowanie zalecam podzielenie go na wiele zapytań, aby zmniejszyć obciążenie serwera.
Zacznijmy od dodania nowej tabeli do naszej bazy, która będzie zawierała wiadomość wraz z identyfikatorem użytkownika, który wysłał tę wiadomość, nazwijmy ją wiadomościami. Schemat naszej tabeli to:
UTWÓRZ „wiadomości” TABELI (
`id` int(11) NIE NULL,
`message` varchar(255) NOT NULL
)
Będziemy używać tej samej funkcji selectdata które stworzyliśmy w naszym crud.php plik. Teraz zacznijmy od dołączenia do tych dwóch stołów. Możesz także wypełnić swój stół, aby móc go ćwiczyć.
Przestań marnować czas na serwery
Cloudways zajmuje się zarządzaniem serwerem za Ciebie, dzięki czemu możesz skupić się na tworzeniu świetnych aplikacji i dbaniu o zadowolenie klientów.
Rozpocznij bezpłatnieŁączenie wewnętrzne
Inner Join łączy tabelę w taki sposób, że pokazuje tylko te wyniki, które pasują do podanego warunku i ukrywa inne. Struktura zapytań typu Inner Join to:
WYBIERZ nazwy kolumn
Z tabeli1
Tabela INNER JOIN2
ON table1.column_name=table2.column_name;
Połączenie wewnętrzne i połączenie proste są takie same. Możesz również napisać swoje zapytanie w ten sposób:
WYBIERZ nazwy kolumn
Z tabeli1
DOŁĄCZ do tabeli2
ON table1.column_name=table2.column_name;
Teraz pobierzmy nazwę i wiadomość z naszej bazy danych za pomocą złączenia wewnętrznego. Zapytanie będzie takie
$sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message From myguests INNER JOIN messages ON myguests.id = messages.id";
KONKAT Funkcja służy do łączenia dwóch kolumn ciągów w MySQL. Teraz otwórz swój index.php, który utworzyliśmy wcześniej, skopiuj do niego następujący kod.
<table> <tr> <td> Name</td> <td> Email</td> <td> Message</td> <!-- <td> Message</td> <td> Date</td>!--> </tr> <?php include 'crud.php'; $sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message From myguests INNER JOIN messages ON myguests.id = messages.id"; $result = selectdata($sql); if($result != "zero") { while($row = $result->fetch_assoc()) { echo "<tr>"; echo "<td>" . $row['name'] . "</td>"; echo "<td>" . $row['email'] . "</td>"; if($row['message'] === null){echo "<td>" . 'null'. "</td>";} else { echo "<td>" . $row['message']. "</td>"; } ; echo "</tr>"; } } else { echo $result; } ?> </table> ?>
Po uruchomieniu tej strony na serwerze hostingowym PHP, wynik będzie wyglądał następująco:
Jak widać, zwrócił tylko te wyniki, które pasują do identyfikatora użytkownika i gdzie wiadomości nie jest pusta.
PRAWY DOŁĄCZ
RIGHT JOIN łączy dwie tabele w taki sposób, że zwraca całą wartość z prawej i dopasowaną wartość z lewej tabeli, a także zwraca wartość null z lewej tabeli, gdy nie znaleziono dopasowania. Struktura RIGHT JOIN to:
WYBIERZ nazwy kolumn
Z tabeli1
TABELA RIGHT JOIN2
ON table1.column_name=table2.column_name;
Teraz pobierzmy nazwę i wiadomość z naszej bazy danych, tworząc wiadomości w naszej prawej tabeli i moi goście w naszym lewym stole.
$sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message From myguests RIGHT JOIN messages ON messages.id = myguests.id";
Teraz otwórz index.php i zastąp $sql zapytanie z ww. Gdy go uruchomisz, Twój wynik będzie następujący:
Jeśli spojrzysz na wiadomości tabeli, zobaczysz kilka identyfikatorów, które nie będą pasować do żadnego identyfikatora użytkownika, dlatego to zapytanie zwraca wartość null w kolumnie nazwa i e-mail, gdzie nie znajdzie żadnego dopasowania w lewej kolumnie.
LEWO DOŁĄCZ
LEFT Joins łączy dwie tabele w taki sposób, że zwraca całą wartość z lewej i dopasowaną wartość z prawej tabeli, a także zwraca wartość null z prawej tabeli, gdy nie znaleziono dopasowania. Struktura LEFT JOIN to:
WYBIERZ nazwy kolumn
Z tabeli1
LEFT JOIN tabela2
ON table1.column_name=table2.column_name;
Teraz pobierzmy nazwę i wiadomość z naszej bazy danych, tworząc wiadomości w nasz odpowiedni stolik i moi goście w nasz lewy stół.
$sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message From myguests LEFT JOIN messages ON messages.id = myguests.id";
Teraz otwórz index.php i zapytaj w miejsce $sql z powyższym. Gdy go uruchomisz, Twój wynik będzie następujący:
Jeśli spojrzysz na wiadomości tabeli, znajdziesz identyfikatory, które nie będą pasować do żadnego identyfikatora użytkownika, dlatego to zapytanie zwraca wartość null w kolumnie Wiadomość, gdzie nie znajdzie żadnego dopasowania w prawej kolumnie.
ZWIĄZEK
UNION w MySQL służy do łączenia wielu kolumn z różnych tabel w jedną kolumnę. Struktura zapytania UNION do wybierania unikalnych wartości to:
SELECT nazwa(y) kolumn FROM tabela1
ZWIĄZEK
SELECT nazwa(y) kolumn FROM tabela2;
A do wybierania powtarzających się wartości z kolumn jest:
SELECT nazwa(y) kolumn FROM tabela1
ZŁĄCZ WSZYSTKIE
SELECT nazwa(y) kolumn FROM tabela2;
Teraz pobierzmy identyfikatory z naszych tabel.
$sql = "SELECT id FROM myguests UNION SELECT id FROM messages";
Teraz otwórz index.php i zastąp $sql zapytanie z ww. Po uruchomieniu Twój wynik będzie następujący:
Zapytanie dostarczyło nam wszystkich unikalnych identyfikatorów, które znajdują się w obu tabelach.
Dołączanie krzyżowe lub produkt kartezjański
Ten typ JOIN zwraca iloczyn kartezjański wierszy z tabel w Join. Zwróci tabelę składającą się z rekordów, które łączą każdy wiersz z pierwszej tabeli z każdym wierszem drugiej tabeli.
Składnia Cross JOIN to,
SELECT column-name-list from table-name1 CROSS JOIN table-name2;
Dołącz do siebie
Self JOIN to zwykłe łączenie, ale tabela jest łączona ze sobą.
SELECT column_name(s) FROM table1 T1, table1 T2 WHERE condition;
PEŁNE ZŁĄCZENIE ZEWNĘTRZNE
Słowo kluczowe FULL OUTER JOIN zwraca wszystkie rekordy, gdy istnieje dopasowanie w lewych (tabela1) lub prawych (tabela2) rekordach tabeli.
Uwaga:FULL OUTER JOIN może potencjalnie zwrócić bardzo duże zestawy wyników!
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
Dołącz do wielu tabel
Z poprzednich blogów dowiedziałeś się, jak łączyć ze sobą dwie tabele za pomocą różnych zapytań sprzężenia SQL. Ale jeśli pracujesz nad dużą aplikacją, tj. budujesz sklep e-commerce i tworzysz w nim wiele tabel, takich jak klienci, zamówienia i produkty, z pewnością może pojawić się złożoność łączenia tabel. Aby to rozwiązać, musisz zdobyć wszystkie produkty zamówione przez konkretnych klientów. Schemat jest taki sam, więc nie deklaruję go tutaj. Zobaczmy zapytanie:
SELECT * FROM table1 LEFT JOIN table2 ON table2.id = table1.id LEFT JOIN table3 ON table3.id = table1.id
Najpierw łączymy tabelę 1 i tabelę 2, które dostarczają tabelę tymczasową z połączonymi danymi z tabeli 1 i 2, która jest w tym momencie połączona z tabelą 3. To równanie może być rozszerzone na więcej niż 3 tabele do N tabel. Musisz tylko upewnić się, że zapytanie SQL powinno zawierać instrukcję łączenia N-1, aby połączyć N tabel.
Powyższe zapytanie pozwoli dopasować wiersze z tabeli 1 (w każdym razie) do wierszy dwóch pozostałych tabel. Użycie LEFT JOIN pozwala połączyć tabelę 2 i 3 z tabelą 1 (nie tylko tabelę 2 z tabelą 1 i tabelę 3 z tabelą2).
Możesz również dodać warunki, takie jak WHERE, AND i ORDERBY
SELECT * FROM table1 LEFT JOIN table2 ON table2.id = table1.id LEFT JOIN table3 ON table3.id = table2.id WHERE month = 'numberHere' AND (table2.email IS NOT NULL OR table3.email IS NOT NULL) ORDER BY submitdate DESC
Wniosek:
W tym samouczku dowiedzieliśmy się wiele o złączeniach, które są używane w relacyjnych bazach danych. Połączenia są używane nie tylko dla dwóch stołów, ale możesz połączyć więcej niż dwa stoły przy użyciu tej samej techniki. W ósmej i ostatniej części tej serii MySQL omówię, jak używać wyrażeń regularnych (REGEX) do pobierania i sortowania danych w MySQL. W tym celu zasubskrybuj nasz biuletyn na blogu, a także zapisz się do naszego zarządzanego stosu PHP i rozpocznij testowanie tych samouczków na naszych serwerach zoptymalizowanych pod kątem PHP.
Często Zadawane PytaniaP. Jak połączyć ze sobą dwa stoły?
Odp: Łączenie dwóch tabel w SQL można wykonać na cztery główne sposoby:Łączenie wewnętrzne (zwraca wiersze z pasującymi kolumnami), Łączenie lewe (WSZYSTKIE rekordy w lewej tabeli i pasujące rekordy w prawej tabeli), Łączenie prawe (WSZYSTKIE rekordy w prawej tabeli i pasujące rekordy w lewej tabeli) oraz Union (usuwa duplikaty).
P. Jakiego polecenia SQL możesz użyć, aby połączyć dwa stoły?
Odp: Dwie tabele można połączyć za pomocą instrukcji INNER JOIN, która zwraca pasujące rekordy z obu tabel.
P. Jak połączyć dwie tabele w SQL bez złączeń?
Odp: Możesz użyć poniższej instrukcji, aby połączyć tabele bez faktycznego używania instrukcji JOIN
SELECT * FROM TableA a, TableB b