2012. tavaszi félév Vitéz Gergely
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!
Virtuális gép indítása SQL plus indítása Felhasználónév: scott Jelszó: tiger Mit tegyünk ha nem sikerül belépni ◦ 1: Várjunk egy picit, amíg a szolgáltatás elindul ◦ 2: Szolgáltatás újraindítása Szerkesztő: ed fajlnev 3OE-NIK 2012.
SELECT FROM tábla1, tábla2, és így tovább WHERE GROUP BY HAVING ORDER BY ;
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;
INNER ◦ Az oszlopérték mindegyik táblában létezik és megegyezik 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
Használata: SELECT [Szelekciók] FROM tábla1 INNER/LEFT/RIGHT/FULL JOIN tábla2 ON összekötőfeltétel USING(oszlop1,oszlop2,stb) …
PÉLDA: SELECT ENAME, LOC FROM EMP INNER JOIN DEPT USING(deptno);
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; Hol van KING a listából?
KING nincs a listában, mert nincs főnöke (nincs hozzá tartozó sor a főnök táblából) Hogy előkerüljön az eredményben a főnököket LEFT JOIN segítségével kell kapcsolnunk: SELECT dolgozo.ename as ”Dolgozó neve”, fonok.ename as ” Főnök neve” FROM emp dolgozo, emp fonok WHERE dolgozo.mgr = fonok.empno(+);
SELECT LISTA FROM WHERE GROUP BY HAVING ORDER BY ;
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, kivéve ha csak 1 van) Mennyi a részlegenkénti maximumfizetések átlaga?
SELECT AVG(inline.Maxfizu) as "Maximum átlag" FROM (SELECT deptno as Reszlegszam, MAX(sal+nvl(comm,0)) as Maxfizu FROM EMP GROUP BY deptno) inline;
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
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 „(” „)” Példa: SELECT * FROM emp WHERE deptno IN ( SELECT deptno FROM dept WHERE UPPER(dname) = ‘DALLAS’)
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);
Egyértékű lehet csak Még utasításon belül sem lehet hivatkozni Példa: SELECT * FROM emp WHERE sal < (SELECT AVG(sal) FROM emp)
Következő, azaz 4. alkalomra hozni kell az adatmodellt normalizálva!
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!
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;
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
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;
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);
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?
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.
Listázza ki azon dolgozók nevét, jövedelmét részlegük nevét, részlegük átlagjövedelmét, melyek a részlegük átlagjövedelménél kevesebbet keresnek! Rendezze az eredményt a részleg szerint!
select ee.ename, ee.sal + nvl(ee.comm, 0) as sajat, dd.dname, round(aa.atlag, 1) as reszlegatlag from emp ee, (select deptno, avg(sal+nvl(comm,0)) as atlag from emp group by deptno) aa, dept dd where ee.deptno = dd.deptno and ee.deptno = aa.deptno and ee.sal + nvl(ee.comm, 0) < aa.atlag order by dname;