Adatbázis használat I. 2. gyakorlat
Tudnivalók Oracle 10g a weben: http://www.oracle.com/technetwork/databa se/database10g/downloads/index.html FF kiírásokat legkésőbb a jövő hétre hozni! 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 2
Egy kis ismétlés Irassuk 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. 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 3
Megoldás SELECT ename AS Név, job AS Munkakör, sal AS Fizetés FROM emp WHERE sal < 1500 ORDER BY ename; 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 4
További feltétel kifejezések Írassuk ki azon dolgozók nevét, munkakörét és fizetését, akiknek a fizetése 1500 és 2500 USD között van. A lista fejléce legyen Név, Munkakör, Fizetés, rendezzen a dolgozók neve szerint. 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 5
Megoldás SELECT ename AS Név, job AS Munkakör, sal AS Fizetés FROM emp WHERE sal BETWEEN 1500 AND 2500 ORDER BY ename; 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 6
További feltétel kifejezések Irassuk ki azon dolgozók nevét, munkakörét és fizetését, akiknek a fizetése NINCS 1500 és 2500 USD között. A lista fejléce legyen Név, Munkakör, Fizetés, rendezzen a dolgozók neve szerint. 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 7
Megoldás SELECT ename AS Név, job AS Munkakör, sal AS Fizetés FROM emp WHERE sal NOT BETWEEN 1500 AND 2500 ORDER BY ename; 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 8
További feltétel 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? Pedig van clerk!!! 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 9
Megoldás Kis és nagybetűk itt számítanak! SELECT ename, job, sal FROM emp WHERE job LIKE '%CLERK%'; vagy: SELECT ename, job, sal FROM emp WHERE job LIKE UPPER('clerk'); 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 10
További feltétel kifejezések De mi van akkor, ha több munkakörre is kíváncsiak vagyunk? Mondjuk salesman és clerk SELECT ename, job, sal FROM emp WHERE UPPER(job) IN ('SALESMAN', 'CLERK'); Megjegyzés: vagy LOWER(job) IN (' salesman', 'clerk'); 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 11
Mi az eredmény és miért? SELECT ename AS Név, sal AS Fizetés, sal+comm AS Jövedelem FROM emp ORDER BY sal+comm DESC; 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 12
Helyes megoldás SELECT ename AS Név, sal AS Fizetés, sal+nvl(comm,0) AS Jövedelem FROM emp ORDER BY Jövedelem DESC; 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 13
Még egy-két apróság Milyen munkakörök léteznek ennél a cégnél? SELECT job FROM emp; De nekem elég, ha egy munkakört csak egyszer listáz SELECT DISTINCT job FROM emp; 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 14
Még egy-két apróság Ki kap jutalékot? Vigyázat, aki nem kap, annál az érték nem 0, hanem nincs is ott semmi! A WHERE comm=0; nem fog működni. SELECT ename, comm FROM emp WHERE comm IS NOT NULL; 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 15
Még egy-két apróság Műveletek dátumokkal SELECT ename AS Név, hiredate AS Dátum, EXTRACT(YEAR FROM hiredate) AS BeÉv, EXTRACT(MONTH FROM hiredate) AS BeHó, EXTRACT(DAY FROM hiredate) AS BeNap FROM emp WHERE hiredate > TO_DATE('1981.máj.05'); 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 16
Csoportfüggvények AVG COUNT SUM MIN MAX -átlag -számosság - összegzés - minimum - maximum 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 17
Csoportosítás GROUP BY Példa: legnagyobb fizetés részlegenként SELECT deptno, MAX(sal) FROM emp GROUP BY deptno; 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 18
Önálló feladat A főnök szeretné látni részlegenként: A legalacsonyabb fizetést; A legmagasabb fizetést; Az átlagos fizetést; A létszámot. 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 19
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; 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 20
Akkor egy bonyolult példát A legkisebb, a legnagyobb és az átlagos részlegenkénti létszámok: SELECT MIN(COUNT(*)), MAX(COUNT(*)), ROUND(AVG(COUNT(*)),2) FROM emp GROUP BY deptno; 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 21
Szűrés csoportokra 2000 USD-nál nagyobb átlagjövedelmű részlegek, 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 ASC; 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 22
Szűrés csoportokra 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. 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 23
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; 2011. 02. 15. nagy.gabriella@nik.uni-obuda.hu 24