Podczas pracy z bazą danych może być konieczne zebranie danych z kilku różnych tabel. W tym artykule dowiesz się, jak to zrobić.
Pisałem już o złączeniach SQL tutaj i tutaj, ale poświęćmy chwilę, aby najpierw przyjrzeć się działaniu złączenia, a zwłaszcza składni specyficznej dla MySQL.
Oświadczenie SQL Join
Join to instrukcja, która pozwala połączyć dwie tabele, dopasowując wiersze, które są ze sobą powiązane, i zachowując tylko te wiersze, które można dopasować, a nie wiersze niesparowane.
SELECT * FROM table1
INNER JOIN table2
ON table1.id = table2.id;
SELECT ... FROM
instrukcja wskazuje, która jest pierwszą tabelą, następnie nazwa drugiej tabeli jest zapisywana zaraz po INNER JOIN
słowa kluczowe.
Sposób łączenia obu tabel jest opisany w ON
oświadczenie. W tym przypadku dwie tabele są łączone przy użyciu relacji table1.id = table2.id
.
Możliwe jest użycie wielu instrukcji join, aby połączyć więcej niż jeden stół w tym samym czasie.
SELECT *
FROM table1
INNER JOIN table2
ON table1.id = table2.id
INNER JOIN table3
ON table2.id = table3.id;
Aby to zrobić, dodaj drugi INNER JOIN
oświadczenie i drugi ON
oświadczenie wskazujące trzecią tabelę i drugą relację.
Porozmawiajmy przez chwilę o relacjach, jakie możesz mieć między stołami i dlaczego warto połączyć trzy stoły.
Relacje między tabelami w SQL
Jeśli masz tabele, które są ze sobą powiązane, ich relacje mogą być jednego z różnych typów.
jeden do wielu
W relacji jeden-do-wielu jeden wiersz pierwszej tabeli może być powiązany z wieloma wierszami drugiej tabeli.
W relacyjnej bazie danych można to zaimplementować, gdy druga tabela ma first_table_id
kolumna, która mówi, z którym wierszem pierwszej tabeli ten wiersz jest powiązany.
wiele-do-jednego
W relacji wiele-do-jednego jeden wiersz pierwszej tabeli może być powiązany z jednym wierszem drugiej tabeli, a jeden wiersz drugiej tabeli może być powiązany z wieloma wierszami pierwszej tabeli.
W relacyjnej bazie danych można to zaimplementować, gdy pierwsza tabela ma second_table_id
kolumna, która mówi, z którym wierszem drugiej tabeli ten wiersz jest powiązany.
wielu-do-wielu
W tym przypadku wiele wierszy jest powiązanych z wieloma wierszami.
Tego rodzaju relacji nie można przedstawić tak, jak w przypadku tabel SQL — należy dodać tabelę sprzężenia między dwiema tabelami, aby między tabelami istniały tylko relacje wiele-do-jednego i jeden-do-wielu.
Każdy wiersz tabeli w środku reprezentuje jedną relację między wierszami lewej tabeli i wierszami prawej tabeli.
W praktyce w MySQL ta środkowa tabela będzie miała kolumnę dla first_table_id
i kolumna dla second_table_id
, a każda kombinacja jest unikalna.
Dołączanie do tabel SQL w praktyce
Wyobraźmy sobie, że mamy bazę danych organizacji, w której mamy tabelę z zespołami (ich nazwy i inne informacje identyfikujące) oraz tabelę z projektami (nazwa, postęp itd.).
id | nazwa_zespołu | specjalność |
---|---|---|
1 | Miotacze bananów | Banany |
2 | Przegryzacze do drewna | Obgryzanie drewna |
3 | Różowe słonie | Tapanie po ziemi |
4 | Puszyste ziemniaki | Praca i spanie |
id | nazwa_projektu | postęp |
---|---|---|
1 | Budowa tamy | Potrzebne jest trochę więcej gryzienia drewna i tupania na ziemi |
2 | Ciasto bananowe | Ktoś zjada wszystkie banany |
3 | Badanie snu | Za dużo snu, za mało badań |
Ponieważ zespół może pracować nad wieloma projektami, a nad projektem może pracować wiele zespołów, istnieje również trzecia tabela, która śledzi dopasowania zespołu do projektów.
identyfikator projektu | identyfikator_grupy |
---|---|
1 | 2 |
1 | 3 |
2 | 1 |
3 | 1 |
3 | 2 |
3 | 3 |
3 | 4 |
Możemy użyć JOIN
oświadczenie, aby zebrać wszystko razem, gdy musimy wyświetlić informacje z tabel w sposób czytelny dla człowieka, na przykład:
SELECT
teams.team_name AS team_name,
projects.project_name AS project_name
FROM TABLE teams
INNER JOIN matches
ON teams.id = matches.team_id
INNER JOIN matches
ON matches.project_id = projects.id
ORDER BY teams.id;
Wybieramy, które kolumny z każdej tabeli mają być wyświetlane za pomocą SELECT
oświadczenie.
Określamy, w jaki sposób wiersze tabel mają być łączone z ON
oświadczenie.
I porządkujemy wiersze w preferowany przez nas sposób za pomocą ORDER BY
oświadczenie.
ON
oświadczenia teams.id = matches.team_id
i matches.projects_id = projects.id
oznaczają, że wiersze są łączone przy użyciu wierszy z matches
stół. Każdy wiersz tabeli wyjściowej ma nazwę projektu i nazwę zespołu połączone za pomocą par identyfikatora projektu i identyfikatora zespołu w matches
tabela.
Tabela wyjściowa będzie wyglądać jak poniżej.
Nazwa_zespołu | Nazwa projektu |
---|---|
Miotacze bananów | Ciasto bananowe |
Miotacze bananów | Badanie snu |
Przegryzacze do drewna | Budowa tamy |
Przegryzacze do drewna | Badanie snu |
Różowe słonie | Budowa tamy |
Różowe słonie | Budowa tamy |
Puszyste ziemniaki | Badanie snu |
Nie ma kolumny bezpośrednio z matches
stół. matches
tabela nie jest pokazywana w danych wyjściowych, ale jest używana jako instrukcje łączenia wierszy teams
i projects
tabele.
Wniosek
JOIN
instrukcja pozwala połączyć jeden lub więcej stołów. Musi być używany w połączeniu z ON
instrukcja do określenia relacji między wierszami tabeli a wierszami innej tabeli.
W tym artykule nauczyłeś się używać JOIN
oświadczenie o połączeniu trzech różnych stołów.