I en relationsdatabas delar vi upp data i flera mindre tabeller för att undvika att upprepa information. Men när vi vill visa data för användaren behöver vi ofta slå ihop information från flera tabeller samtidigt.
Det är här JOIN kommer in i bilden!
Anta att vi har följande två tabeller:
Klasser| KlassID | KlassNamn |
|---|---|
| 1 | TE24A |
| 2 | TE24B |
| 3 | EE24A |
Elever| ElevID | Fornamn | KlassID |
|---|---|---|
| 101 | Anna | 1 |
| 102 | Björn | 1 |
| 103 | Cecilia | 2 |
| 104 | David | NULL (saknar klass) |
INNER JOIN (Vanligast)INNER JOIN returnerar endast de rader där det finns en matchning i båda tabellerna.
SELECT Elever.Fornamn, Klasser.KlassNamn
FROM Elever
INNER JOIN Klasser ON Elever.KlassID = Klasser.KlassID;
| Fornamn | KlassNamn |
|---|---|
| Anna | TE24A |
| Björn | TE24A |
| Cecilia | TE24B |
(Notera: David visas inte eftersom han saknar KlassID, och EE24A visas inte eftersom den klassen inte har några elever).
LEFT JOIN (LEFT OUTER JOIN)LEFT JOIN hämta alla rader från den vänstra tabellen (Elever), samt matchande rader från den högra tabellen (Klasser). Om det inte finns någon matchning blir värdet NULL.
SELECT Elever.Fornamn, Klasser.KlassNamn
FROM Elever
LEFT JOIN Klasser ON Elever.KlassID = Klasser.KlassID;
| Fornamn | KlassNamn |
|---|---|
| Anna | TE24A |
| Björn | TE24A |
| Cecilia | TE24B |
| David | NULL |
RIGHT JOIN (RIGHT OUTER JOIN)RIGHT JOIN gör motsatsen: den hämtar alla rader från den högra tabellen (Klasser), samt matchande rader från den vänstra tabellen (Elever).
SELECT Elever.Fornamn, Klasser.KlassNamn
FROM Elever
RIGHT JOIN Klasser ON Elever.KlassID = Klasser.KlassID;
| Fornamn | KlassNamn |
|---|---|
| Anna | TE24A |
| Björn | TE24A |
| Cecilia | TE24B |
| NULL | EE24A |
INNER JOIN LEFT JOIN RIGHT JOIN
Matching only All Left + Match All Right + Match
[ ( X ) ] [ ( X ) ] [ ( X ) ]
A B A B A B
INNER JOIN: Endast det som finns i både A och B.LEFT JOIN: Allt från A + matchande från B.RIGHT JOIN: Allt från B + matchande från A.FULL JOIN: Allt från både A och B (oavsett matchning).Använd aliaser (förkortningar) för att göra koden mer lättläst när du arbetar med flera tabeller:
SELECT e.Fornamn, k.KlassNamn
FROM Elever e
JOIN Klasser k ON e.KlassID = k.KlassID;
(Observera: JOIN utan prefix tolkas i regel som INNER JOIN).