350 likes | 451 Views
Adatbázis használat I. 3 . gyakorlat. Figyelem!!!. 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!. Weboldalak. www.orakulum.com www.jerry.gorextar.hu /ab1 www.gorex.gorextar.hu /ab1
E N D
Adatbázis használat I. 3. gyakorlat
Figyelem!!! 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!
Weboldalak www.orakulum.com www.jerry.gorextar.hu/ab1 www.gorex.gorextar.hu/ab1 www.gazdinfo.hu
Tábla létrehozása • Táblát a CREATE TABLE táblanév utasítással hozhatunk létre • Létező táblát pedig CREATE TABLE táblanév AS SELECT * FROM létezőtáblanév-el tudunk klónozni. • Törölni pedig a DROP TABLE táblanévvel tudunk
Mezők frissítése • A rekordokban az egyes adatokat a következő utasítással frissíthetjük: UPDATE táblanév SET oszlopnév = újérték WHERE oszlopnév = aktuálisérték;
Többtáblás lekérdezések • Táblákat összekapcsolhatunk FROM és WHERE utasításrészben vagy • FROM utasításrészben a JOIN segítségével
JOIN • Fajtái • Inner • Azokat a sorokat (rekordokat) listázza ki, ahol az összekapcsoló oszlopnak mindkét táblában van értéke. • Left • Minden sort felsorol a bal oldali táblából, annak ellenére, hogy a jobb oldali táblában nincsen minden esetben megfelelő érték.
JOIN • Fajtái • Right • A jobboldali rekordok közül mindet kilistázza még akkor is, ha a baloldalon nincs megfelelő elem. • Full • Mindent kilistázz a bal és a jobb oldalról is
JOIN 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 WHERE-el • A tábláknak is adhatunk másodlagos neveket • …FROM emp dolgozó …; • Gyakran szükség van rá, ha össze akarunk kapcsolni táblákat a WHERE-ben • Például: kérdezzük le a főnökökhöz tartozó beosztottak nevét
Táblák összekapcsolása WHERE-el SELECT FROM tábla1, tábla2, és így továbbWHEREGROUP BYHAVINGORDER BY;
Táblák összekapcsolása WHERE-el 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;
Hierarchialekérdezés (CONNET BY) • Segítségével olyan oszlopot hozhatunk létre, amelyből látszik a rekordok egymás alá való rendeltsége. • Általános alakja:SELECT … FROM tábla[WHERE …]CONNECT BY { PRIOR kifejezés = kifejezés vagy kifejezés = PRIOR kifejezés }[START WITH kifejezés = kifejezés][OREDER BY];
Hierarchialekérdezés (CONNET BY) • Kulcsszavak jelentése: • LEVEL megadja, hogy az aktuálisan kilistázott elem a hierarchia mely szintjén található. • START WITH megadhatjuk hol honnét kezdjük a hierarchikus szerkezet feldolgozása • WHERE utasításnál nem tudunk szűrni elődöt és utódot csak konkrét sorokat • CONNECT BY utasításrészben megadott feltételt használjuk a sorok és leszármazottaik szűrésére • PIOR a bejárás szerinti szülőcsúcsot határozza meg
Hierarchialekérdezés (CONNET BY) Példák • Az előző feladatot egészítsük ki, hogy lássuk ki milyen szinten van a cégnél. • Nézzük meg SMITH, hogy neki mennyit kell még előre lépni a létrán, hogy elnök legyen.
Allekérdezés • Azokat a lekérdezéseket nevezzük allekérdezésnek, amelyeket nem jelenítünk meg, de valamilyen eredmény(eket) ad át egy külső utasítás számára. • A feldolgozás ilyenkor mindig belülről kifelé halad, azaz a legbelső SELECT értékelődik ki először. • Használható a FROM, WHERE, HAVING utasításrészekben.
Allekérdezés (FROM-ban) • A FROM-on belüli allekérdezéstinline nézetnek szokás nevezni. • Ilyenkor a FROM-ban lévő SELECT-et másodlagos táblanévvel kell ellátni (lásd 9. dia)
Allekérdezés (FROM-ban) • Példa: Mennyi a részlegenkénti maximumfizetések átlaga? Select AVG(inlinepelda.Maxfizu) as "Maximum átlag" from (SELECT deptnoasReszlegszam, MAX(sal+nvl(comm,0)) asMaxfizu fromemp groupbydeptno) inlinepelda;
Allekérdezés (WHERBEN) • 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és (WHERBEN) • 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és (WHERBEN) • 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.
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);
Házi feladat Kérdezze le minden dolgozó nevét, jövedelmét, részlegének nevétés a részlegében dolgozók legkisebb és legnagyobb jövedelmét, végül pedig a dolgozó jövedelembeállási értékét (vagyis a jövedelmének és az iménti legkisebb értéknek különbségét). A lista legyen a jövedelembeállás alapján rendezve, és használjon másodlagos oszlopneveket.
Házi feladat1. lépés feladat értelmezése Keressük meg a lekérdezéseket (általában valamilyen kötőszóval vannak összekapcsolva a feladatban is) Kérdezze le minden dolgozó nevét, jövedelmét, részlegének nevét (dept táblában a dname)és arészlegében dolgozók legkisebb jövedelmét, végül pedig a dolgozó jövedelembeállási értékét (jövedelmének és a legkisebb jövedelem különbségét). A lista legyen a név alapján rendezve, és használjon másodlagos oszlopneveket.
Házi feladat2. lépés allekérdezés • A kidolgozás során mindig az allekérdezésselkezdjünk. • Arészlegében dolgozók legkisebb és legnagyobb jövedelmét SELECT MIN(sal+NVL(comm,0)) AS minimumfizetés,deptno AS részleg FROM empGROUP BY deptno;
Házi feladat3. lépés a külső lekérdezés • Kérdezze le minden dolgozó nevét, jövedelmét, részlegének nevét és arészlegében dolgozók legkisebb jövedelmét végül pedig a dolgozó jövedelembeállási értékét. • Vegyük észre, hogy bele kell vennünk az allekérdezést a külső lekérdezésbe.
Házi feladat3. lépés a külső lekérdezés • Mi kell a külső lekérdezésünkbe • Dolgozó neve • Jövedelme • Részlegének neve • A vele egy csoportban dolgozók legkisebb jövedelme • A jövedelembeállás
Házi feladat3. lépés a külső lekérdezés SELECT dolgozó.ename, dolgozó.sal + NVL(dolgozó.comm,0) as fizu, telephely.dname, allek.minimumfizetés,/* elhagyható az allek, ha egyedi */ /*az allekérdezésben a másodlagos oszlpnév*/ dolgozó.sal+ NVL(dolgozó.comm,0) - minimumfizetésas beáll FROM emp dolgozó, dept telephely, (SELECT MIN(sal+NVL(comm,0)) AS minimumfizetés, deptno AS részleg FROM empGROUP BY deptno)allek/* itt nem hagyjuk el sose a másodlagos */ WHERE telephely.deptno = allek.részleg AND /*táblanevet*/ telephely.deptno = dolgozó.deptno ORDER BY dolgozó.ename;
Amire figyeljünk • Az allekérdezést mindig zárójelbe kell, hogy tegyük a másodlagos táblanév adása miatt. • PL.: (SELECT MIN(sal+NVL(comm,0)) AS minimumfizetés,deptno AS részleg FROM emp GROUP BY deptno)allek • Megjegyzés: Másodlagos táblanévadáskor NEM használunk AS kulcsszót!!!
Amire figyeljünk • Az allekérdezésben használt másodlagos oszlopneveket használjuk a külső SELECT-ben, mintha csak az emp táblából kérdeznénk oszlopokat. • Ha nem egyedi az oszlopnevünk akkor a táblanév.oszlop hivatkozással pontosan meg kell adjuk melyik tábláról van szó. Pl.: telephely.deptno = dolgozó.deptno
Amire figyeljünk • A táblák felsorolásánál is ,-t használunk kivéve az utolsó táblát (allekérdezést). Pl.: … emp dolgozó,dept telephely, (SELECT MIN(sal+NVL(comm,0)) AS minimumfizetés, deptno AS részleg FROM emp GROUP BY deptno) allek … Itt már nincs vessző
Amire figyeljünk • A WHERE-ben ne felejtsük összekapcsolni a táblákat. • Ki lehet próbálni mi történik, ha elhagyjuk a WHERE részt. • A WHERE-ben az a fontos, hogy minden tábla össze legyen kapcsolva a megfelelő oszlop(okk)al. • WHERE telephely.deptno = allek.részleg AND telephely.deptno= dolgozó.deptno • WHERE dolgozó.deptno= allek.részleg AND telephely.deptno = dolgozó.deptno • Ugyanazt az eredményt adja
Házi feladat (2) Írja ki minden dolgozó nevét, jövedelmét, munkakörének nevét, továbbá a munkakörében dolgozók összjövedelmét, végül pedig a dolgozó jövedelembeállási értékét(mekkora az összjövedelem és a dolgozó jövedelmének különbsége), úgy hogy a jövedelem szerint rendezzünk növekvően.
Házi feladat (2) SELECT enameAS "Dolgozó neve", sal+NVL(comm,0) AS jövedelem, dolgozó.job AS munkakör, összjövedelem, összjövedelem - sal+NVL(comm,0)AS jövbeáll FROM empdolgozó, (SELECT SUM(sal+NVL(comm,0)) AS összjövedelem, job FROM emp GROUP BY job) allek WHERE dolgozó.job= allek.job ORDER BY jövedelem;