adatbázisok használata 1 (3. gyakorlat)
DESCRIPTION
Adatbázisok használata 1 (3. gyakorlat). 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!. SQL Plus. Virtuális gép indítása SQL plus indítása - PowerPoint PPT PresentationTRANSCRIPT
Adatbázisok használata 1(3. gyakorlat)
2012. tavaszi félévVité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!
OE-NIK 2012. 3
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 Futtatás: @fajlnev
SQL Plus
Táblák összekapcsolása
Táblák összekapcsolása 2
SELECT FROM tábla1, tábla2, és így továbbWHEREGROUP BYHAVINGORDER BY;
Táblák összekapcsolása 3.
EMP és DEPT tábla összekapcsolása:Példa:
SELECT a.ename, b.locFROM emp a, dept bWHERE a.deptno = b.deptno;avagy:SELECT ename, locFROM emp, deptWHERE emp.deptno = dept.depno;
Táblák összekapcsolásaWHERE
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
Táblák összekapcsolásaJOIN
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ásaJOIN 2
PÉLDA:SELECT ENAME, LOCFROM EMP INNER JOIN DEPT USING(deptno);
Táblák összekapcsolásaJOIN 3
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 fonokWHERE dolgozo.mgr = fonok.empno;
Hol van KING a listából?
Táblák összekapcsolása önmagukkal
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 fonokWHERE dolgozo.mgr = fonok.empno(+);
LEFT JOIN
Allekérdezések
SELECT LISTAFROMWHEREGROUP BYHAVINGORDER BY;
Allekérdezések
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?
AllekérdezésekINLINE nézet
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;
Megoldás
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ésekWHERE
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’)
AllekérdezésekWHERE 2
Select *from empwhere sal > ALL (Select sal from emp where sal between 1200 AND 2900);Select *from empwhere sal > ANY (Select sal from emp where sal between 1200 AND 2900);
Mi a különbség?ALL/ANY
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)
AllekérdezésekSELECT
Következő, azaz 4. alkalomra hozni kell az adatmodellt normalizálva!
Féléves Feladat
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!
Gyakorlás!
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 deptnoFrom empwhere job = ’CLERK’group by deptno;
Több megoldás létezik!
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 deptnoFrom empwhere job = ’CLERK’group by deptno) allerkerdezesunk
1 példa megoldás (folyt)
SELECT dept.deptno as ”Részleg”, dept.dname as ”Részlegnév”,
dept.loc as ”Telephely”FROM dept, (Select deptnoFrom empwhere job = ’CLERK’group by deptno) allekerdezesunkWHERE allekerdezesunk.deptno = dept.deptno;
1. Példa folytatás
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);
1. PéldaAllekérdezés WHERE ben.
Select dolgozo.ename as "Dolgozó neve", fonok.ename as "Főnök neve"FROM emp dolgozo, emp fonokWHERE 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
Select dolgozo.ename as "Dolgozó neve", fonok.ename as "Főnök neve"FROM emp dolgozo, emp fonokWHERE 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.
2. Példa jó megoldás
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!
Komplex példa
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;
Megoldás
Köszönöm a figyelmet!