Többtáblás lekérdezések, allekérdezések Rózsa Győző
A diasor ismerete nem helyettesíti a tankönyvet, és a példatárat. A diasor ismerete szükséges, de nem elégséges feltétele a minimum elégséges érdemjegynek!
Táblák összekapcsolása
Táblák összekapcsolása 2
Táblák összekapcsolása 3. SELECT FROM tábla1, tábla2, és így tovább WHERE GROUP BY HAVING ORDER BY ;
Táblák összekapcsolása WHERE EMP és DEPT tábla összekapcsolása: Példa: SELECT a.ename, b.loc FROM emp a, dept b WHERE a.deptno = b.deptno; avagy: SELECT ename, loc FROM emp, dept WHERE emp.deptno = dept.depno;
Táblák összekapcsolása JOIN Inner – Az oszlopérték mindegyik táblában létezik Left – A kulcsszótól balra álló tábla sorai mindenképpen szerepelnek a listában Right – A kulcsszótól jobbra álló tábla sorai mindenképpen látszanak a listában FULL – Mindkettő oszlop sorai látszanak, még ha hiányosak is
Táblák összekapcsolása JOIN 2 Használata: SELECT [Szelekciók] FROM tábla1 INNER/LEFT/RIGHT/FULL JOIN tábla2 ON összekötőfeltétel USING(oszlop1,oszlop2,stb) …
Táblák összekapcsolása JOIN 3 PÉLDA: SELECT ENAME, LOC FROM EMP INNER JOIN DEPT USING(deptno);
Táblák összekapcsolása önmagukkal Példa: Listázzuk az alkalmazottakat, és a főnökeik nevét! SELECT dolgozo.ename as ”Dolgozó neve”, fonok.ename as ” Főnök neve” FROM emp dolgozo, emp fonok WHERE dolgozo.mgr = fonok.empno;
Allekérdezések
SELECT LISTA FROM WHERE GROUP BY HAVING ORDER BY ;
Allekérdezések INLINE nézet Ha a FROM részben szerepel az allekérdezés, akkor azt INLINE nézetnek is nevezzük (Ezt mindig másodlagos táblanévvel kell ellátni) Mennyi a részlegenkénti maximumfizetések átlaga? Select AVG(inlinepelda.Maxfizu) as "Maximum átlag" from (SELECT deptno as Reszlegszam, MAX(sal+nvl(comm,0)) as Maxfizu from emp group by deptno) inlinepelda;
Allekérdezések WHERE IN/NOT IN – IGAZ, ha szerepel az adott halmazban/ha nem ANY – Ha a halmaz legalább egy eleme megfelel ALL – Ha a halmaz összes eleme megfelel EXISTS / NOT EXISTS – Ha a halmaz legalább egy elemet tartalmaz/Egyet sem
Allekérdezések WHERE 2 A WHERE-ben szereplő allekérdezéseknél, összehasonlító reláció esetén a bal oldalon mindig csak oszlopkifejezés állhat, jobb oldalon szerepelhet allekérdezés is zárójelek között „(” „)” Persze ezeknek összhangban kell lenniük.
Mi a különbség? ALL/ANY Select * from emp where sal > ALL (Select sal from emp where sal between 1200 AND 2900); Select * from emp where sal > ANY (Select sal from emp where sal between 1200 AND 2900);
Allekérdezések SELECT Egyértékű lehet csak Még utasításon belül sem lehet hivatkozni
Féléves Feladat Továbbra is normalizálás!
Gyakorlás! Példatár 3.3 feladat (67.oldal) Listázza a ’ Clerk’ munkakörű dolgozókat foglalkoztató részlegek azononosítóját, nevét, és telephelyét! Ha készen van valaki: Listázza a New York telephely minden dolgozójának nevét, és a főnökük nevét!
Több megoldás létezik! 1: Allekérdezés a FROM részben – Kell nekünk egy tábla, amiben csak azoknak a részlegeknek az azonosítója van, ahol ‚CLERK’ dolgozik. – Select deptno From emp where job = ’CLERK’ group by deptno;
1 példa megoldás (folyt) Ha ez megvan, nézzük meg, hogy mire van szükségünk: Részleg, Részlegnév és Telephely SELECT dept.deptno as ”Részleg”, dept.dname as ”Részlegnév”, dept.loc as ”Telephely” FROM dept, (Select deptno From emp where job = ’CLERK’ group by deptno) allerkerdezesunk
1. Példa folytatás SELECT dept.deptno as ”Részleg”, dept.dname as ”Részlegnév”, dept.loc as ”Telephely” FROM dept, (Select deptno From emp where job = ’CLERK’ group by deptno) allekerdezesunk WHERE allekerdezesunk.deptno = dept.deptno;
1. Példa Allekérdezés WHERE ben. Select deptno as "Részleg", dname as "Részlegnév", loc as "Telephely" from dept WHERE deptno in (Select deptno From emp where job = 'CLERK' group by deptno);
2. példa Select dolgozo.ename as "Dolgozó neve", fonok.ename as "Főnök neve" FROM emp dolgozo, emp fonok WHERE dolgozo.mgr = fonok.empno AND dolgozo.deptno IN (Select deptno from dept where loc = 'NEW YORK'); Miért rossz ez a megoldás?
2. Példa jó megoldás Select dolgozo.ename as "Dolgozó neve", fonok.ename as "Főnök neve" FROM emp dolgozo, emp fonok WHERE dolgozo.mgr = fonok.empno(+) AND dolgozo.deptno IN (Select deptno from dept where loc = 'NEW YORK'); A (+) hatására a rendszer úgy kezeli a főnök táblát, mintha lenne egy sor, ami csupa NULL-ból áll.