8.14. Táblák összekötése - JOIN

Adatok értékeinek lekérdezése több táblából

Amikor az adatokat több táblából kell összeszedni, akkor gondolni kell arra az esetre, hogy különböző táblákban lehetnek ugyanolyan nevű mezők, ezért ilyen esetekben az oszlopok megkülönböztetésére használjuk a táblanevet előtagként.

Például a Diákok és a Tanarok táblában is van név nevű mező, ekkor az alábbi módon tudjuk megkülönböztetni őket: Tanarok.nev, Diakok.nev  Ez hasonlít ahhoz, amit programozás tanulásakor már használtunk.

A lekérdezésben ugyanakkor ez még nem elegendő. A SELECT utasítás FROM mezőjénél is fel kell sorolni vesszővel elválasztva a táblákat, valahogy így.

SELECT Tanarok.nev, Diakok.nev FROM Tanarok, Diakok;

Hány soros lesz az eredmény ebben az esetben?

Ha mondjuk a Tanarok táblában van 50 tanár és a diákok táblában 450 diák, akkor az eredmény sorainak a száma: 50*450 = 22500 sor lesz! Miért is?

Minden Tanarok.nev értékhez hozzáválasztja az összes lehetséges Diakok.nev értéket. Ez tulajdonképpen a két halmaz (!) elemeiből képzett lehetséges párok összege lesz!

A fenti lekérdezésre azonban nem nagyon van szükségünk, ezért egy értelmesebb lekérdezésen haladunk tovább. Szeretnénk megtudni, hogy a tanulóknak milyen osztályzataik vannak!

SELECT Diakok.nev, Osztalyzatok.osztalyzat FROM Diakok, Osztalyzatok;

Ha a fenti lekérdezés ennyi, akkor minden tanulóhoz hozzápárosítjuk az összes osztályzatot, ami nyilvánvalóan nem ad jó eredményt!

Táblák összekapcsolása WHERE feltétellel

SELECT Diakok.nev, Osztalyzatok.osztalyzat FROM Diakok, Osztalyzatok
WHERE Diakok.DID = Osztalyzatok.DID;

A fenti WHERE feltétel a lekérdezésben csak azokat az eredményeket jeleníti meg, ahol a Diakok tábla DID értéke megegyezik az Osztalyzatok tábla DID értékével, vagyis minden egyes tanulónak csak a saját osztályzatai jelennek meg.

Megjegyzések:

  • A Diakok táblában a DID elsődleges kulcs, míg az Osztalyzatok táblában a DID idegen kulcs!
  • Ilyen szituációban érdemes indexelni a Diakok és az Osztalyzatok táblát is a DID mezőre nézve!

Táblák összekapcsolása - INNER JOIN, LEFT JOIN, RIGHT JOIN

A fenti lekérdezést meg lehet másképpen is adni:

SELECT Diakok.nev, Osztalyzatok.osztalyzat FROM Diakok INNER JOIN Osztalyzatok 
ON Diakok.DID = Osztalyzatok.DID;

Ez a lekérdezés ugyanazt eredményezi, de valójában már tovább vezet a következő kérdéshez,

LEFT JOIN - Bal oldali táblából minden rekord

Mi van akkor, ha egy tanulónak még nincsen osztályzata? A fenti esetben nem jelenik meg, de így megjelenhet. Mivel lehetséges olyan tanuló, akinek még nincsen osztályzata, ezért azoknál a tanulóknál csak a név jelenjen meg és ne legyen az osztályzat helyén adat.

SELECT Diakok.nev, Osztalyzatok.osztalyzat FROM Diakok LEFT JOIN Osztalyzatok 
ON Diakok.DID = Osztalyzatok.DID;

Ha a táblák sorrendjét megcseréljük, akkor használhatjuk a RIGHT JOIN utasítást is.

RIGHT JOIN - Jobb oldali táblából minden rekord

Az alábbi lekérdezésben azt kérdezzük meg, hogy melyik tanulóknak milyen osztályzatai vannak matematika nevű tárgyból

SELECT Diakok.nev, Osztalyzatok.osztalyzat FROM Osztalyzatok RIGHT JOIN Diakok
ON Osztalyzatok.DID = Diakok.DID
WHERE Osztalyzatok.Tantargy = "Matematika"

A JOIN kapcsolatot kiegészítettük egy plusz megszorítással: Az Osztalyzatok.Tantargy mezőjére tettünk egy megszorítást!

Nem csak kettő, hanem több táblát is összekapcsolhatunk

Ha azt a kérdést tesszük fel, hogy egy adott tanár (Nagy Géza) melyik tanulókat tanítja az iskolában, akkor a tanár nevét a Tanarok táblából, a tanulók nevét a Diakok táblából kell vennünk, viszont a kapcsolatot az Osztály adja meg, tehát arra is szükségünk van!

Az eddigiek alapján

SELECT Tanarok.nev, Diakok.nev 
FROM 
   Tanarok INNER JOIN Orarend ON Tanarok.TID = Orarend.TID
   INNER JOIN Diakok ON Orarend.Osztaly = Diakok.Osztaly
WHERE 
   Tanarok = "Nagy Géza"

A fenti lekérdezésben a Tanarok és Orarend táblák által létrehozott adathalmazt kapcsoljuk össze a diákok táblával. A lekérdezést a rendszer balról jobbra értékeli ki!

Megjegyzések:

1. Az INNER JOIN, LEFT JOIN és RIGHT JOIN megjeleníti az adatbzis táblái közötti kapcsolatokat. Gyakran az INNER JOIN összehasonlítás egyik oldalán az egyik tábla Elsődleges kulcsa (PRIMARY KEY = PK) szerepel, a másik táblában pedig idegen kulcs (FOREIGN KEY = FK)

2. Bár az INNER JOIN és a WHERE feltétel ugyanazt az eredményt adja, de logikailag az INNER JOIN használata a helyes, mert az olyan adatbázisokban, amelyek beállítva tárolják a kapcsolatokat gyorsabb futást eredményez.