Adatbázis-kezelés 7. SQL Táblák összekapcsolása
Adatok kinyerése több táblából Táblák összekapcsolásának alapja: kulcs idegen kulcs Az 5-nél több aranyat nyert országok nevét listázzuk ki. két tábla tartalmazza a szükséges adatokat. SELECT [reláció.]attributum, [reláció.]attributum,... FROM relációk WHERE kapcsoló_attributum operátor kapcsoló_attributum;
Két tábla összekapcsolása Pl.: SELECT * FROM o_erem_tabla, o_orszagok WHERE orszag_azon = azon; SELECT * FROM o_erem_tabla, o_orszagok WHERE orszag_azon = azon and arany > 5; Equijoin, mert egyenlőségen alapul. Ha szükséges használjunk álnevet a táblákhoz, melyekkel minősíteni tudjuk az azonos nevű különböző táblabeli oszlopokat.
INNER JOIN (szoros illesztés) Az INNER JOIN használatával, a lekérdezés eredményébe nem kerülnek bele azon reláció1-beli elemek, amelyeknek nincs megfelelőjük a reláció2 táblában. SELECT attributum1, attributum2, attributum3, FROM reláció1 INNER JOIN reláció2 ON reláció1.attributum = reláció2.attributum;
INNER JOIN SELECT Alk_kod, Beosztas, A.Reszleg_kod FROM Alkalmazott A INNER JOIN Reszleg R ON A.Reszleg_kod=R.Reszleg_kod
LEFT JOIN (laza illesztés) Megjeleníthető az első tábla minden adata az eredményben attól függetlenül, hogy nincs a feltételben megadott tulajdonságú mező a második táblában. SELECT Alk_kod, Beosztas, R.Reszleg_kod, R.Reszleg_nev FROM Alkalmazott A LEFT JOIN Reszleg R ON A.Reszleg_kod=R.Reszleg_kod
RIGHT JOIN A RIGHT JOIN lehetővé teszi, hogy a második táblában lévő összes adatot megjelenítsük függetlenül attól, hogy az első táblában van-e hozzátartozó mező. SELECT Alk_kod, Beosztas, R.Reszleg_kod, R.Reszleg_nev FROM Alkalmazott A RIGHT JOIN Reszleg R ON A.Reszleg_kod=R.Reszleg_kod
SELF JOIN Egy tábla önmagával való összekapcsolása alias név segítségével. Pl.: Jelenítsük meg azoknak az eladóknak és szerelőknek a nevét és fizetését akik ugyanabban a részlegben dolgoznak és a szerelőnek nagyobb a fizetése. SELECT E.Alk_nev, SZ.Alk_nev FROM Alkalmazott E, Alkalmazott SZ WHERE E.Beosztas= Eladó AND SZ.Beosztas= Szerelő AND E.Reszleg_kod=SZ.Reszleg_kod AND E.Fizetes<SZ.Fizetes;
Példák összekapcsolásra 1. Írassa ki a győri részleg dolgozóinak adatait! 2. Írassa ki részleg nevenként csoportosítva a legmagasabb és legalacsonyabb fizetést! 3. Írassa ki részleg címenként csoportosítva az átlagfizetést és a létszámot! SELECT Alk_nev, Reszleg_nev FROM Alkalmazott A, Reszleg R WHERE A.Reszleg_kod=R.Reszleg_kod AND Reszleg_cim= Győr ; SELECT Reszleg_nev, MAX(Fizetes) Legmagasabb_fizetes, MIN(Fizetes) FROM Alkalmazott A, Reszleg R WHERE A.Reszleg_kod=R.Reszleg_kod GROUP BY Reszleg_nev; SELECT Reszleg_cim, AVG(Fizetes), COUNT(*) Letszam FROM Alkalmazott A, Reszleg R WHERE A.Reszleg_kod=R.Reszleg_kod GROUP BY Reszleg_cim;
Gyakorlás INSERT INTO UJ_RESZLEG SELECT * FROM Reszleg WHERE Cím= Debrecen ; UPDATE Alkalmazott SET Fizetes=1,1*Fizetes WHERE Alk_nev in (SELECT Alk_nev from Alkalmazott, Reszleg WHERE Reszleg_cim <> BUDAPEST AND Alkalmazott.Reszleg_kod=Reszleg.Reszleg_kod);
Egymásba ágyazott lekérdezések Írassa ki azoknak a dolgozóknak a nevét, beosztását és fizetését akiknek a fizetése több mint Balogh fizetése! SELECT alk_nev, beosztas, fizetes FROM alkalmazott WHERE fizetes > (SELECT fizetes FROM alkalmazott WHERE alk_nev='balogh'); 11
Egymásba ágyazott lekérdezések 2. Írassa ki azon részlegek kódját, nevét és címét, amelyekben nem dolgozik senki! SELECT * FROM Reszleg WHERE reszleg_kod NOT IN (SELECT reszleg_kod FROM alkalmazott) 12
Egymásba ágyazott lekérdezések 3. Írassa ki azon alkalmazottak kódját és nevét akik Királlyal azonos telephelyen dolgoznak! SELECT Alk_kod, Alk_nev FROM Alkalmazott WHERE reszleg_kod = (SELECT reszleg_kod FROM alkalmazott WHERE Alk_nev= Kiraly ) 13
UNION (SQL utasítás1) UNION (SQL utasítás2) vagy (SQL utasítás1) UNION ALL (SQL utasítás2) Több táblára vonatkozó lekérdezés, melyben a lekérdezések eredményének uniójára van szükségünk. Az UNION használatával az egyedi értékek kerülnek megjelenítésre, ha nem ezt szeretnénk, akkor a UNION ALLkulcsszót használhatjuk, ekkor minden érték megjelenik a listában. Az egyes oszlopoknak ugyanolyan típusúnak kell lenni! Pl.: diakok(nev, osztaly, osztalyfonok) tanarok(nev, szak) ( SELECT nev FROM diakok ) UNION ( SELECT nev FROM tanarok )
Metszet (INTERSECT) és különbség (MINUS) (SQL utasítás1) INTERSECT (SQL utasítás2) Az Unió művelet mintájára a lekérdezések metszetét, vagyis közös részét (INTERSECT) is vehetjük. (SQL utasítás1) MINUS (SQL utasítás2) Ekkor azon elemeket kapjuk eredményül, amelyeket úgy kapnánk, hogy az első lekérdezésben szerepelő adatokból elhagynánk azokat, amelyek a második lekérdezés eredményében is szerepelnek.