När du arbetar med din databas kan du behöva sätta ihop data från några olika tabeller. Den här artikeln visar dig hur.
Jag har redan skrivit om SQL-kopplingar här och här, men låt oss ta en stund för att se över hur en koppling fungerar först, och särskilt syntaxen som är specifik för MySQL.
SQL Join Statement
Join är ett uttalande som låter dig sätta ihop två tabeller, matcha rader som är relaterade till varandra och bara behålla de rader som kan matchas, inte att behålla oparade rader.
SELECT * FROM table1
INNER JOIN table2
ON table1.id = table2.id;
SELECT ... FROM
sats anger vilken som är den första tabellen, sedan skrivs det andra tabellnamnet precis efter INNER JOIN
nyckelord.
Hur de två tabellerna ska sammanfogas skrivs i ON
påstående. I det här fallet sammanfogas de två tabellerna med relationen table1.id = table2.id
.
Det är möjligt att använda flera join-satser tillsammans för att sammanfoga mer än en tabell samtidigt.
SELECT *
FROM table1
INNER JOIN table2
ON table1.id = table2.id
INNER JOIN table3
ON table2.id = table3.id;
För att göra det lägger du till en andra INNER JOIN
och en andra ON
uttalande för att indikera den tredje tabellen och den andra relationen.
Låt oss prata ett ögonblick om relationerna du kan ha mellan tabeller och varför du kanske vill slå samman tre tabeller.
Relationer mellan tabeller i SQL
När du har tabeller som är relaterade till varandra kan deras relationer vara en av olika typer.
en-till-många
I en en-till-många-relation kan en rad i den första tabellen relateras till flera rader i den andra tabellen.
I en relationsdatabas kan detta implementeras med den andra tabellen som har ett first_table_id
kolumn som säger till vilken rad i den första tabellen den raden är relaterad.
många-till-en
I en sorts många-till-en-relation kan en rad i den första tabellen relateras till en enda rad i den andra tabellen, och en rad i den andra tabellen kan relateras till flera rader i den första tabellen.
I en relationsdatabas kan detta implementeras med den första tabellen som har ett second_table_id
kolumn som säger till vilken rad i den andra tabellen den raden är relaterad.
många-till-många
I det här fallet är flera rader relaterade till flera rader.
Den här typen av relation kan inte representeras som den är med SQL-tabeller – du måste lägga till en kopplingstabell mellan de två tabellerna så att endast många-till-en- och en-till-många-relationer finns mellan tabellerna.
Varje rad i tabellen i mitten representerar en relation mellan raderna i den vänstra tabellen och och raderna i den högra tabellen.
I praktiken i MySQL kommer den mellantabellen att ha en kolumn för first_table_id
och en kolumn för second_table_id
, där varje kombination är unik.
Ansluta SQL-tabeller i praktiken
Låt oss föreställa oss att vi har en organisations databas, där vi har en tabell med team (deras namn och annan identifierande information) och en tabell med projekt (namn, framsteg och så vidare).
id | team_name | specialitet |
---|---|---|
1 | Banankastare | Bananer |
2 | Trägnagare | Gnaga på trä |
3 | De rosa elefanterna | Trampar i marken |
4 | Fluffig potatis | Arbeta och sova |
id | projektnamn | framsteg |
---|---|---|
1 | Dambyggnad | Något mer vedgnag och markstamp behövs |
2 | Banankaka | Någon äter alla bananerna |
3 | Sömnforskning | För mycket sömn inte tillräckligt med forskning |
Eftersom ett team kan arbeta med flera projekt och ett projekt kan arbetas med av flera team, finns det också en tredje tabell som håller reda på lag-projektmatchningar.
projekt-id | grupp-id |
---|---|
1 | 2 |
1 | 3 |
2 | 1 |
3 | 1 |
3 | 2 |
3 | 3 |
3 | 4 |
Vi kan använda en JOIN
uttalande för att sätta ihop allt när vi behöver se informationen från tabellerna på ett mänskligt läsbart sätt, så här:
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;
Vi väljer vilka kolumner som ska visas från varje tabell med en SELECT
uttalande.
Vi anger hur raderna i tabellerna ska kombineras med en ON
uttalande.
Och vi ordnar raderna på det sätt vi föredrar med en ORDER BY
uttalande.
ON
uttalanden teams.id = matches.team_id
och matches.projects_id = projects.id
innebär att raderna kombineras med raderna i matches
tabell. Varje rad i utdatatabellen har projektnamnet och teamnamnet kombinerade med paren av projekt-id och team-id i matches
bord.
Utdatatabellen kommer att se ut som nedan.
Team_name | Projektnamn |
---|---|
Banankastare | Banankaka |
Banankastare | Sömnforskning |
Trägnagare | Dam Bulding |
Trägnagare | Sömnforskning |
De rosa elefanterna | Dambyggnad |
De rosa elefanterna | Dambyggnad |
Fluffig potatis | Sömnforskning |
Det finns ingen kolumn direkt från matches
tabell. matches
Tabellen visas inte i utdata men den används som instruktioner för hur man kombinerar raderna i teams
och projects
tabeller.
Slutsats
JOIN
statement låter dig slå samman en eller flera tabeller. Den måste användas tillsammans med ON
uttalande för att bestämma förhållandet mellan raderna i en tabell och raderna i en annan tabell.
I den här artikeln har du lärt dig hur du använder JOIN
för att sammanfoga tre olika tabeller.