410 likes | 510 Views
Adatbázis használat I. 2. 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. 2. 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
Egyszerű lekérdezések • Kérdezzük le az emptábla tartalmát! SELECT * FROM emp;
Egyszerű lekérdezések • Kérdezzük le az depttábla tartalmát! SELECT * FROM dept;
Egyszerű lekérdezések • Ha nem vagyunk kíváncsiak az egész táblára lekérdezhetünk oszlopokat is belőle. • Kérdezzük le az emptáblából a dolgozók nevét és fizetését. SELECT ename, sal FROM emp;
Egyszerű lekérdezések • Kérdezzük le az emptáblából a dolgozók nevét,munkakörétés részlegazonosítóját. SELECT ename, job, deptno FROM emp; Megjegyzés: amikor több oszlopot kérdezünk le vesszőkkel választjuk el őket, de az utolsó oszlopnév után nem rakunk vesszőt.
Egyszerű lekérdezések • Kérdezzük le az azonosítót és a nevet, de beszédes oszlopneveket szeretnénk látni, ezért nevezzük át az oszlopokat. SELECT empno AS Azonosító, ename AS Név FROM emp; Megjegyzés: összetett oszlopneveket is tudunk kezelni, ekkor azt az oszlopnevet " " [shift + 2] közé tesszük (pl.: név helyett dolgozó neve).
Egyszerű lekérdezések • Szeretnénk megtudni, hogy ki keres sokat és mi a beosztása. SELECT ename, sal, job FROM emp WHERE sal > 2000;
Egyszerű lekérdezések • Ki kap jutalékot és mennyit? SELECT ename, comm FROM emp WHERE comm > 0;
Lekérdezések • Rendezzük a táblázatunkat dolgozó azonosító szerinti növekvő sorrendbe! SELECT * FROM emp ORDER BY empno; • Most ugyanezt csökkenő sorrendbe SELECT * FROM emp ORDER BY empno DESC;
Lekérdezések • Rendezzük a táblázatunkat fizetés szerinti növekvő sorrendbe, majd csökkenő sorrendbe! SELECT * FROM emp ORDER BY sal ASC/DESC; • Rendezzünk most fizetés szerint növekvő és jutalék szerint csökkenő sorrendbe SELECT * FROM emp ORDER BY sal, commdesc;
Előre megírt lekérdezés(ek) futtatása • edazenlekerdezesem • Megnyit egy jegyzettömböt, amelybe írhatjuk a lekérdezést. • Fontos, hogy mindig mentsük a munkánkat benne!!! • @azenlekerdezesem • Ezzel futtatjuk az előre megírt lekérdezésünket. • Holt találjuk meg ezt a fájlt? • Nézzük meg a kereső segítségével. • Írjuk be, hogy azenlekerdezesem.sql
Gyakorlás • Írassuk ki azon dolgozók nevét, munkakörét és fizetését, akiknek a fizetése 1500 USD alatt van.A lista fejléce legyen „Név”, „Munkakör”, „Fizetés”, rendezzen a dolgozók neve szerint.
Gyakorlás SELECT ename AS ”Név”, job AS ”Munkakör”, sal AS ”Fizetés” FROM emp WHERE sal < 1500 ORDER BY ename;
További feltételes kifejezések • További kifejezések: • Logikai műveletek • AND, OR, NOT • Hasonlító műveletek • >, >=, <, <=, =, <>, != • Intervallum • Oszlopkifejezés BETWEEN AlsóHatár AND FelsőHatár • Alsztringvizsgálat • Oszlopkifejezés LIKE ’%alsztring%’ • Pl.: SELECT * FROM emp WHERE ename LIKE UPPER(’%ar%’); • Allekérdezésre vonatkozó halmazvizsgálat • Oszlopkifejezés [NOT] IN | ANY | ALL | EXSIST alekérdezés • NULL értékre vonatkozó vizsgálat • Oszlopkifejezés IS NULL | IS NOT NULL
További feltételes kifejezések • Írassuk ki az 1200 és 2900 USD között kereső dolgozók minden adatát úgy, hogy a fizetés, majd a nevük szerint legyen rendezve. • Írassuk ki az 1200 és 2900 USD között NEMkereső dolgozók nevét, keresetét, jutalékát úgy, hogy a fizetés, majd a nevük szerint legyen rendezve és beszédesek legyenek az oszlopnevek.
További feltételes kifejezések SELECT emp.* FROM emp WHERE sal BETWEEN 1200 AND 2900 ORDER BY sal, ename;
További feltételes kifejezések SELECT emp.ename AS Név, emp.sal AS Fizetés, emp.comm AS Jutalék FROM emp WHERE salNOT BETWEEN 1200 AND 2900 ORDER BY sal, ename;
További feltételes kifejezések Írassuk ki a „clerk” munkakörű dolgozók nevét, munkakörét, fizetését. A lista fejléce legyen „Név”, „Munkakör”, „Fizetés”, rendezzen a dolgozók neve szerint. SELECT ename, job, sal FROM emp WHERE job LIKE ’%clerk%’; Mi történt? Miért nem jelent meg a clerk?
Megoldás • Kis és nagybetűk számítanak! SELECT ename, job, sal FROM empWHERE job LIKE ’%CLERK%’; vagy: SELECT ename, job, sal FROM emp WHERE job LIKE UPPER(’Clerk’);
További feltételes kifejezések • Mi van akkor ha több munkakörre is kíváncsiak vagyunk? Mondjuk „sealsman” és „clerk”. SELECT ename, job, sal FROM emp WHERE UPPER(job) IN UPPER(’SALESMAN’,’CLERK’); Megjegyzés: lehet így is … LOWER(job) IN (’salesman’, ’clerk’);
Speciális függvények • Számoljuk ki a dolgozóknak a jövedelmét (sal+comm) és rendezzük növekvő rendbe. SELECT emp.*, sal+comm FROM emp; • Nézzük meg, hogy mi történt.Miért történhetett ez?
Speciális függvények • Ilyen estekben használjuk az NVL függvényt.Lényege, ahol nincs érték megadva azt kitölti az általunk megadottal. • Nézzük meg az előző példát a függvény segítségével. SELECT emp.*, sal+NVL(comm,0) AS Jövedelem FROM emp; ORDER BY Jövedelem ASC;
Még egy pár apróság… • Milyen munkakörök léteznek ennél a cégnél? SELECT job FROM emp; • De nekünk csak egyszer van szükségünk minden munkakörre. SELECT DISTINCT job FROM emp;
Még egy pár apróság… • Emlékezzünk a jutalékos példára ott arra voltunk kíváncsiak ki kap jutalmat, most nézük meg ki nem kap jutalmat. • A …Wherecomm=0; nem működik. Miért? • Ha lekérdezzük az emp táblát látjuk, hogy akik nem kapnak jutalmat oda nincs semmi se írva, ez nem egyenlő a 0-val!!! • Ezért így kérdezzük le:SELECT ename, comm FROM empWHERE comm IS NULL;
Még egy pár apróság… • Művelet dátumokkal SELECT ename AS Név, hiredate AS Dátum, EXTRACT(YEAR FROM hiredate) AS BeÉv, EXTRACT(MONTH FROM hiredate) AS BeHónap, EXTRACT(DAY FROM hiredate) AS BeNap FROM emp WHERE hiredate > TO_DATE(’1981.máj.05’);
Még egy pár apróság… • Eltelt idő meghatározása • Napokban SELECT ROUND(sysdate - TO_DATE(20031219,'YYYYMMDD')) FROMdual; • HónapokbanSELECT ROUND(MONTHS_BETWEEN(sysdate, TO_DATE(20031219,’YYYYMMDD’))) FROM dual; • ÉvekbenSELECT ROUND(MONTHS_BETWEEN(sysdate, TO_DATE(20031219,’YYYYMMDD’))/12) FROM dual;
Csoportosító lekérdezések • A leggyakrabban használt függvények: • AVG() • Kiszámolja a csoport(ok) átlagát. • SUM() • A csoportban összeget számol. • MIN() • A legkisebb értéket adja meg a csoportban. • MAX() • A legnagyobb értéked adja meg a csoportban. • COUNT() • Megszámolja a csoport elemeinek számát. • ROUND() • Kerekítés • Pl.: ROUND(AVG(sal),2) – 2 tizedes pontosan kerekít • Ezeket a függvényeket mindig GROUP BY-al használjuk.
Csoportosító lekérdezések • A leggyakrabban használt függvények: • AVG() • Kiszámolja a csoport(ok) átlagát. • SUM() • A csoportban összeget számol. • MIN() • A legkisebb értéket adja meg a csoportban. • MAX() • A legnagyobb értéked adja meg a csoportban. • COUNT() • Megszámolja a csoport elemeinek számát. • ROUND() • Kerekítés • Pl.: ROUND(AVG(sal),2) – 2 tizedes pontosan kerekít • Ezeket a függvényeket mindig GROUP BY-al használjuk.
Csoportosító lekérdezések • Nézzünk az előbbiekre példát • Nézzük meg mi a legnagyobb fizetés részlegenként. SELECT deptno, MAX(sal) FROM emp GROUP BY deptno; • Mennyi a részlegenkénti fizetés és ezt rendezzük növekvő sorrendbe. SELECT deptno, AVG(sal) FROM emp GROUP BY deptno;
Önálló feladat • A főnök szeretné tudni a részlegeinek: • A legalacsonyabb fizetést • A legmagasabb fizetést • Az átlagos fizetést • A létszámot
A megoldás SELECT deptno AS Részleg, MIN(sal) AS Legkisebb, MAX(sal) AS Legnagyobb, AVG(sal) AS Átlag, COUNT(*) AS Létszám FROM emp GROUP BY deptno;
Bonyolítsuk a dolgokat… Listázzuk ki a legkisebb, a legnagyobb és az átlagos részlegenkénti létszámokat: SELECT MIN(COUNT(*)), MAX(COUNT(*)), ROUND(AVG(COUNT(*)),2) FROM emp GROUP BY deptno;
Szűrés csoportokra (A HAVING használata) • Listázzuk ki azokat a részlegeket amelyek 2000 USD-nél nagyobb átlagjövedelműek a jövedelem szerint rendezve. SELECT deptno, ROUND(AVG(sal+NVL(comm,0))) AS átlagjövedelem FROM emp GROUP BY deptno HAVING ROUND(AVG(sal+NVL(comm,0))) > 2000 ORDER BY átlagjövedelem;
Szűrés csoportokra (A HAVING használata) • Listázzuk főnökönként (mgr) a jutalékban nem részesülő dolgozóinak átlagfizetését csökkenő sorrendben, feltéve, hogy ez az érték 1000 USD-nál több.
Megoldás SELECT AVG(sal) AS ”Átlagfizetés”, mgr AS ”Főnök” FROM emp WHERE comm IS NULL AND mgr IS NOT NULL GROUP BY mgr HAVING AVG(sal) > 1000 ORDER BY ”Átlagfizetés” DESC;
Házi feladat Listázza ki részlegenként és minden részlegben munkakörönként a 2000 USD-nál nagyobb jövedelmű dolgozók átlagjövedelmét, mégpedig úgy, hogy a lista legyen az utóbbi szerint növekvő és használjon beszédes oszlopneveket.
Megoldás SELECT deptnoAS Részleg, jobAS Munkakör, avg(sal+NVL(comm,0)) AS Átlag FROM emp WHERE (sal + NVL(comm,0)) > 2000 GROUP BY deptno, job ORDER BY Átlag;
Házi feladat (2) Listázza ki a legfeljebb 2200 USD átlagjövedelmű részlegeknek az átlagjövedelmét és ezt rendezzük átlagjövedelem szerint növekvő sorrendbe majd csökkenő sorrendbe és használjon beszédes oszlopneveket.
Megoldás SELECT deptnoAS Részleg, AVG(sal+nvl(comm,0)) AS Átlag FROM emp GROUP BY deptno HAVING AVG(sal+nvl(comm,0)) < 2200 ORDER BY Átlag asc/desc;