460 likes | 654 Views
ADATBÁZISOK http://users.nik.uni-obuda.hu/szabozs/. ISMÉTLÉS…. SELECT Záradékok sorrendje. INTO FROM WHERE GROUP BY HAVING UNION/MINUS INTERSECT ORDER BY. T ÖBBTÁBLÁS LEKÉRDEZÉSEK. "CROSS-JOIN", "MANUAL JOIN" INNER JOIN / NATURAL JOIN LEFT JOIN, RIGHT JOIN FULL JOIN / UNION JOIN.
E N D
ADATBÁZISOK http://users.nik.uni-obuda.hu/szabozs/ szabo.zsolt@nik.uni-obuda.hu
ISMÉTLÉS… szabo.zsolt@nik.uni-obuda.hu
SELECTZáradékok sorrendje • INTO • FROM • WHERE • GROUP BY • HAVING • UNION/MINUS • INTERSECT • ORDER BY szabo.zsolt@nik.uni-obuda.hu
TÖBBTÁBLÁS LEKÉRDEZÉSEK • "CROSS-JOIN", "MANUAL JOIN" • INNER JOIN / NATURAL JOIN • LEFT JOIN, RIGHT JOIN • FULL JOIN / UNION JOIN szabo.zsolt@nik.uni-obuda.hu
ALLEKÉRDEZÉSEK szabo.zsolt@nik.uni-obuda.hu
HALMAZMŰVELETEK • [lekérdezés] [halmazművelet] [lekérdezés] • Fontos: a két lekérdezés azonos oszlopszámú legyen! • Műveletek: UNION, INTERSECT, MINUS / EXCEPT • pl: select min(sal) as MIN_AVG_MAX from emp UNION select avg(sal) from emp UNION select max(sal) from emp; • A MySQL BÉNA: http://www.bitbybit.dk/carsten/blog/?p=71 szabo.zsolt@nik.uni-obuda.hu
ALLEKÉRDEZÉS • Alapelv: a fő-lekérdezés bizonyos részeiben (mezőlista, WHERE záradék, FROM záradék) nem egyszerű mezőnév/kifejezés/táblanév található, hanem egy beágyazott, zárójelezett második lekérdezés al-lekérdezés (sub-query) • A MySQL csak újabb (>4.1) verziókkal támogatja (korlátozásokkal…) szabo.zsolt@nik.uni-obuda.hu
ALLEKÉRDEZÉS A MEZŐLISTÁBAN • Az allekérdezés egy értékkel tér vissza [more than one row / too many values / operand should contain 1 column(s)] • SELECT sal,(select max(sal) from emp) as MAX,(select max(sal) from emp)-sal as DELTA FROM empORDER BY DELTA desc; szabo.zsolt@nik.uni-obuda.hu
ALLEKÉRDEZÉS A FROM-BAN(INLINE NÉZET) • Az allekérdezés tetszőleges táblát ad vissza, amelyet a lekérdezésben statikus táblaként kezelhetünk • select dolgozo.fizu from (select sal as fizu from emp) dolgozo order by fizu desc; • select * from (select a.empno, a.ename, a.mgr, b.empno, b.ename from emp a, emp b where a.mgr=b.empno) order by ename asc; -- Aliast kell használni!!! szabo.zsolt@nik.uni-obuda.hu
ALLEKÉRDEZÉS A FROM-BAN SELECT bosses.Dolg_Nev as Worker, bosses.Fonok_Nev as Boss FROM ( select a.empno as Dolg_ID, a.ename as Dolg_Nev, a.mgr as Dolg_Fonok, b.empno as Fonok_ID, b.ename as Fonok_Nev from emp a, emp b where a.mgr=b.empno) bosses ORDER BY Worker asc; szabo.zsolt@nik.uni-obuda.hu
ALLEKÉRDEZÉS A FROM-BAN SELECT emp.deptno, min, ename FROM ( Select deptno, min(sal) as min From emp Group by deptno ) minimumok, empWHERE emp.sal=minimumok.min and emp.deptno=minimumok.deptno; szabo.zsolt@nik.uni-obuda.hu
ALLEKÉRDEZÉS A WHERE-BEN • Az allekérdezés egy értékkel tér vissza [more than one row / too many values / operand should contain 1 column(s)] • select ename, sal from emp where sal>(select avg(sal) from emp); • select ename, sal from emp where sal=(select min(sal) from emp); szabo.zsolt@nik.uni-obuda.hu
ALLEKÉRDEZÉS A WHERE-BEN • Az allekérdezés egy oszloppal tér vissza • Használható operátorok: [NOT] IN, ANY, ALL • Példa: select sal, mod(round(sal/1000), 2) from emp; select sal from emp where mod(round(sal/1000), 2)=0; select sal from emp where deptno = 10; szabo.zsolt@nik.uni-obuda.hu
ALLEKÉRDEZÉS A WHERE-BEN • select ename, sal from emp where sal IN (select sal from emp where deptno = 10); • select ename, sal from emp where sal NOT IN (select sal from emp where deptno = 10); szabo.zsolt@nik.uni-obuda.hu
ALLEKÉRDEZÉS A WHERE-BEN • select ename, sal from emp where sal> ANY (select sal from emp where deptno = 10); • select ename, sal from emp where sal>(select min(sal) from emp where deptno = 10); Ugyanaz az eredmény Oracle az ANY-nél rendez!!! szabo.zsolt@nik.uni-obuda.hu
ALLEKÉRDEZÉS A WHERE-BEN • select ename, sal from emp where sal> ALL (select sal from emp where deptno = 10); • select ename, sal from emp where sal> ALL (select sal from emp where deptno = 30); • select ename, sal from emp where sal>(select max(sal) from emp where deptno = 30); Ugyanaz az eredmény Itt az Oracle sem rendez… Mindig kell ORDER BY, ha rendezni akarunk szabo.zsolt@nik.uni-obuda.hu
ALLEKÉRDEZÉSEK • UNION, INTERSECT, MINUS • Allekérdezés a • Mezőlistában: 1 érték • From-ban: 1 tábla (aliast használva) • Where-ben: 1 érték • Where-ben: 1 oszlop – IN, ANY, ALL szabo.zsolt@nik.uni-obuda.hu
GYAKORLÁS szabo.zsolt@nik.uni-obuda.hu
1. FELADAT • Listázza ki a dolgozók nevét, fizetését, főnökük nevét, fizetését, részlegének helyét, valamint ezen helyszín összfizetését! szabo.zsolt@nik.uni-obuda.hu
MEZŐK ÉS TÁBLÁK KIVÁLASZTÁSA • Helyszín összfizetése EMP és DEPT összekapcsolása, fizetések összege • Dolgozó neve, Dolgozó fizetése EMP D • Főnök neve, Főnök fizetése EMP D és EMP F összekapcsolása, EMP F • Főnök részlegének helye EMP F és DEPT összekapcsolása szabo.zsolt@nik.uni-obuda.hu
RÉSZLEG-ÖSSZFIZETÉSEK • Egyszerű többtáblás GROUP BY • EMP_1 <deptno, deptno> DEPT_1, majd helyszínenként csoportosítva a fizetések összege szabo.zsolt@nik.uni-obuda.hu
RÉSZLEG-ÖSSZFIZETÉSEK SELECT sum(emp.sal) as dept_sal, dept.loc as dept_loc FROM emp, dept WHERE emp.deptno=dept.deptno GROUP BY dept.loc; szabo.zsolt@nik.uni-obuda.hu
DOLGOZÓK-FŐNÖKÖK-FŐNÖKADATOK • Dolgozó neve, Dolgozó fizetése EMP_2 • Főnök neve, Főnök fizetése EMP_2 és EMP_3 összekapcsolása, EMP_3 • Főnök részlegének helye A EMP_3 és DEPT_2 összekapcsolása EMP_2 <empno, mgr> EMP_3 EMP_3 <deptno, deptno> DEPT_2 szabo.zsolt@nik.uni-obuda.hu
DOLGOZÓK-FŐNÖKÖK-FŐNÖKADATOK szabo.zsolt@nik.uni-obuda.hu
DOLGOZÓK-FŐNÖKÖK-FŐNÖKADATOK SELECT work.ename as work_name, work.sal as work_sal, boss.ename as boss_name, boss.sal as boss_sal, dept.loc as boss_loc FROM emp work, emp boss, dept WHERE work.mgr=boss.empno and boss.deptno=dept.deptno; szabo.zsolt@nik.uni-obuda.hu
VÉGEREDMÉNY • DOLGOZÓK – FŐNÖKÖK – FŐNÖKADATOK data1 • RÉSZLEG-ÖSSZFIZETÉSEK data2 • data1 <boss_loc, dept_loc> data2 szabo.zsolt@nik.uni-obuda.hu
SELECT * from (SELECT work.ename as work_name, work.sal as work_sal, boss.ename as boss_name, boss.sal as boss_sal, dept.loc as boss_loc FROM emp work, emp boss, dept WHERE work.mgr=boss.empno and boss.deptno=dept.deptno) data1, (SELECT sum(emp.sal) as dept_sal, dept.loc as dept_loc FROM emp, dept WHERE emp.deptno=dept.deptno GROUP BY dept.loc) data2 WHERE data1.boss_loc=data2.dept_loc ORDER BY boss_name, work_name; szabo.zsolt@nik.uni-obuda.hu
2. FELADAT (4.12) Listázza ki az egyes főnökök beosztottainak számát, telephelyét, átlagjövedelmét, a főnök és a beosztottak átlagjövedelme közti különbséget. Akkor most a főnökök telephelye (A) kell, vagy a beosztottaké (B)??? szabo.zsolt@nik.uni-obuda.hu
MEZŐK ÉS TÁBLÁK KIVÁLASZTÁSA • Beosztottak száma, átlagjövedelme EMP.MGR szerinti GROUP BY • Részleg EMP és DEPT összekapcsolása szabo.zsolt@nik.uni-obuda.hu
EMP.MGR szerinti GROUP BY • Ezzel ki lehet hozni egy főnökazonosító-átlagjövedelem-beosztottak_száma táblát, amit a többi táblákhoz főnökazonosítóval csatolunk majd • A kapcsolat a feladat értelmezésétől függ szabo.zsolt@nik.uni-obuda.hu
Dolgozók átlagjövedelme és darabszáma SELECT avg(sal+nvl(comm, 0)) as avg_work_sal, count(*) as work_num, mgr as boss_id FROM emp GROUP BY mgr Inline nézet: Data Ezután táblák összekapcsolása szabo.zsolt@nik.uni-obuda.hu
TÁBLÁK ÖSSZEKAPCSOLÁSA (A) szabo.zsolt@nik.uni-obuda.hu
TÁBLÁK ÖSSZEKAPCSOLÁSA (B) szabo.zsolt@nik.uni-obuda.hu
TÁBLÁK ÖSSZEKAPCSOLÁSA (A) szabo.zsolt@nik.uni-obuda.hu
SELECT emp.ename as boss_name, emp.sal+nvl(emp.comm, 0) as boss_sal, data.avg_work_sal as boss_worker_sal, data.work_num as boss_worker_num, dept.loc as boss_loc, emp.sal+nvl(emp.comm, 0) - data.avg_work_sal as sal_delta FROM (SELECT avg(sal+nvl(comm, 0)) as avg_work_sal, count(*) as work_num, mgr as boss_id FROM emp GROUP BY mgr ) data, emp, dept WHERE data.boss_id=emp.empno (+) and emp.deptno=dept.deptno (+); szabo.zsolt@nik.uni-obuda.hu
TÁBLÁK ÖSSZEKAPCSOLÁSA (B) szabo.zsolt@nik.uni-obuda.hu
SELECT d.ename as work_name, f.ename as boss_name, f.sal+nvl(f.comm, 0) as boss_sal, data.avg_work_sal as boss_worker_sal, data.work_num as boss_worker_num, dept.loc as worker_loc, f.sal+nvl(f.comm, 0) -data.avg_work_sal as sal_delta FROM (SELECT avg(sal+nvl(comm, 0)) as avg_work_sal, count(*) as work_num, mgr as boss_id FROM emp GROUP BY mgr ) data, emp d, emp f, dept WHERE data.boss_id=f.empno (+) and f.empno=d.mgr (+) and d.deptno=dept.deptno (+); szabo.zsolt@nik.uni-obuda.hu
3. Feladat Listázza telephelyenként az egyes munkaköröket, valamint az e munkakörökben dolgozók létszámát, legkisebb, legnagyobb és átlagos jövedelmét. A lista elsődlegesen a telephely szerint növekvően, másodlagosan a munkakör szerint csökkenően legyen rendezve, és használjon kifejező másodlagos oszlopneveket. szabo.zsolt@nik.uni-obuda.hu
MUNKAKÖR-ADATOK SELECT count(*) as Work_Num, min(sal+nvl(comm, 0)) as Minimum, max(sal+nvl(comm, 0)) as Maximum, avg(sal+nvl(comm, 0)) as Atlag, job FROM emp GROUP BY job; szabo.zsolt@nik.uni-obuda.hu
TELEPHELYEK ÉS MUNKAKÖRÖK SELECT distinct loc, job FROM emp, dept WHERE emp.deptno=dept.deptno ORDER BY loc; szabo.zsolt@nik.uni-obuda.hu
EREDMÉNY (A) SELECT * FROM (SELECT distinct dept.deptno, loc, job FROM emp, dept WHERE emp.deptno=dept.deptno ORDER BY loc) data2, (SELECT count(*) as Work_Num, min(sal+nvl(comm, 0)) as Minimum, max(sal+nvl(comm, 0)) as Maximum, avg(sal+nvl(comm, 0)) as Atlag, job FROM emp GROUP BY job) data1 WHERE data1.job=data2.job ORDER BY data2.deptno asc, data1.job desc; szabo.zsolt@nik.uni-obuda.hu
EREDMÉNY (B) SELECT count(*) as Work_Num, min(sal+nvl(comm, 0)) as Minimum, max(sal+nvl(comm, 0)) as Maximum, avg(sal+nvl(comm, 0)) as Atlag, job, loc FROM emp, dept WHERE emp.deptno=dept.deptno GROUP BY job, loc ORDER BY loc asc, job desc; szabo.zsolt@nik.uni-obuda.hu
FELADAT • Jelenítsük meg a dolgozók nevét, részlegének nevét, és a főnökük nevét. A listában szerepeljen a dolgozók és a főnökök jövedelembeállási értéke is. • Jövedelembeállási érték: (jövedelem) – (a vele egy évben belépett dolgozók átlagjövedelme) szabo.zsolt@nik.uni-obuda.hu
SELECTZáradékok sorrendje • INTO • FROM • WHERE • GROUP BY • HAVING • UNION/MINUS • INTERSECT • ORDER BY szabo.zsolt@nik.uni-obuda.hu