1 / 25

ADATBÁZISOK users.nik.uni-obuda.hu/szabozs/

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. GROUP BY. Group by, Having – egy mezőn: ismert… Mezőlistában: csak a csoportosított mező és csoportosító függvények!!!

todd
Télécharger la présentation

ADATBÁZISOK users.nik.uni-obuda.hu/szabozs/

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ADATBÁZISOK http://users.nik.uni-obuda.hu/szabozs/ szabo.zsolt@nik.uni-obuda.hu

  2. ISMÉTLÉS szabo.zsolt@nik.uni-obuda.hu

  3. SELECTZáradékok sorrendje • INTO • FROM • WHERE • GROUP BY • HAVING • UNION/MINUS • INTERSECT • ORDER BY szabo.zsolt@nik.uni-obuda.hu

  4. GROUP BY • Group by, Having – egy mezőn: ismert… • Mezőlistában: csak a csoportosított mező és csoportosító függvények!!! • Több mezőn: összetett csoportosítás, TETSZŐLEGES számú mezőn • A szabály továbbra is igaz: csak a csoportosított mezők és csoportosító függvények lehetnek a szelekciós listában!!! szabo.zsolt@nik.uni-obuda.hu

  5. SELECT job, deptno, avg(sal) FROM emp GROUP BY job, deptno; JOB DEPTNO AVG(SAL) --------- ---------- ---------- CLERK 10 1300 MANAGER 10 2450 PRESIDENT 10 5000 ANALYST 20 3000 CLERK 20 950 MANAGER 20 2975 CLERK 30 950 MANAGER 30 2850 SALESMAN 30 1400 szabo.zsolt@nik.uni-obuda.hu

  6. SELECT mgr, job, deptno, avg(sal) FROM emp GROUP BY job, deptno, mgr; MGRJOB DEPTNO AVG(SAL) ---------- --------- ---------- ---------- 7839 MANAGER 30 2850 7839 MANAGER 10 2450 7782 CLERK 10 1300 7698 SALESMAN 30 1400 7839 MANAGER 20 2975 7902 CLERK 20 800 7698 CLERK 30 950 PRESIDENT 10 5000 7566 ANALYST 20 3000 7788 CLERK 20 1100 szabo.zsolt@nik.uni-obuda.hu

  7. NVL – Típus-egyezés • SELECT nvl(mgr, 'nincs'), deptno, avg(sal) FROM emp GROUP BY mgr, deptno; • SELECT nvl(to_char(mgr), 'Nincs'), deptno, avg(sal) FROM emp GROUP BY mgr, deptno; • SELECT nvl(mgr, 0), deptno, avg(sal) FROM emp GROUP BY mgr, deptno; szabo.zsolt@nik.uni-obuda.hu

  8. EGYSZERŰ / TÖBBMEZŐS GROUP BY HÁTRÁNYAI • Merev, túlságosan kötött • Egy lekérdezésben csak egyféleképpen lehet csoportosítani, ez érvényes a teljes eredmény-halmazra • Részeredmények belső optimalizálása?? • Cél: egy lekérdezéssel többfajta csoportosítást elvégezni  GROUPING SETS • SELECT job, deptno, avg(sal) FROM emp GROUP BY GROUPING SETS ( (job, deptno) ); szabo.zsolt@nik.uni-obuda.hu

  9. GROUP BY GROUPING SETS • SELECT job, avg(sal) FROM emp GROUP BY GROUPING SETS ( job ); • SELECT job, deptno, avg(sal) FROM emp GROUP BY GROUPING SETS ( (job, deptno) ); • SELECT job, deptno, avg(sal) FROM emp GROUP BY GROUPING SETS ( job, deptno ); = SELECT job, deptno, avg(sal) FROM emp GROUP BY GROUPING SETS ( (job), (deptno) ); • SELECT job, deptno, mgr, avg(sal) FROM emp GROUP BY GROUPING SETS ( (job, deptno), (mgr) ); szabo.zsolt@nik.uni-obuda.hu

  10. GROUP BY GROUPING SETS • Egy lekérdezésen belül többféle csoportosítást is meg tudunk adni • Pl. egy lekérdezésen belül egyszerre akarok MGR, DEPTNO és JOB, DEPTNO csoportosítást csinálni: SELECT nvl(mgr, 0), deptno, nvl(job, 'Nincs'), avg(sal) FROM empGROUP BY GROUPING SETS ( (mgr, deptno), (deptno, job)); szabo.zsolt@nik.uni-obuda.hu

  11. GROUP BY GROUPING SETS • SELECT nvl(mgr, 0), nvl(deptno,0), nvl(job, 'NO'), avg(sal) FROM emp GROUP BY GROUPING SETS ( (mgr, deptno), (deptno, job), (mgr)); • SELECT nvl(mgr, 0), nvl(deptno,0), nvl(job, 'NO'), avg(sal) FROM emp GROUP BY GROUPING SETS ( (mgr, deptno), (deptno, job), (mgr), ()); szabo.zsolt@nik.uni-obuda.hu

  12. szabo.zsolt@nik.uni-obuda.hu

  13. GROUPING  Nem tudjuk, hogy miért 0 az mgr • GROUPING "csoportosító" függvénnyel megtudhatjuk, hogy az adott mezővel van –e csoportosítás az aktuális rekordban • Csoportosító függvény: a szelekciós listában használata engedélyezett • Speciális: paraméterként csak csoportosított mezőt kaphat • Egy- és többmezős (grouping set nélküli) GROUP BY esetén mindig 0 az eredménye (0 = csoportosításban részt vevő mező) szabo.zsolt@nik.uni-obuda.hu

  14. GROUPING • Grouping set használata esetén arra használható, hogy melyik eredmény-sorban melyik mezők a csoportosított mezők • SELECT mgr, deptno, job, avg(sal), GROUPING(mgr) as GMGR, GROUPING(deptno) as GDEPTNO, GROUPING(job) as GJOB FROM empGROUP BY GROUPING SETS ( (mgr, deptno), (deptno, job), (mgr), ()); szabo.zsolt@nik.uni-obuda.hu

  15. szabo.zsolt@nik.uni-obuda.hu

  16. GROUPING • SELECTCASE WHEN GROUPING(mgr)=0 THEN mgr ELSE 0 END as MGR,CASE WHEN GROUPING(deptno)=0 THEN deptno ELSE 0 END as DEPTNO,CASE WHEN GROUPING(job)=0 THEN job ELSE 'NO' END as JOB,avg(sal) FROM emp GROUP BY GROUPING SETS ( (mgr, deptno), (deptno, job), (mgr), ()); szabo.zsolt@nik.uni-obuda.hu

  17. szabo.zsolt@nik.uni-obuda.hu

  18. GROUPING_ID • Egyedi azonosító minden különböző csoportosítás-fajtához • Az azonosítók nem [0..N] intervallumban vannak, hanem egyfajta bit-szerű megközelítéssel sorszámozódnak • SELECT mgr, deptno, job, avg(sal), GROUPING_ID(mgr, deptno, job) as GID FROM emp GROUP BY GROUPING SETS ( (mgr, deptno), (deptno, job), (mgr), ()); szabo.zsolt@nik.uni-obuda.hu

  19. szabo.zsolt@nik.uni-obuda.hu

  20. GROUP BY GROUPING SETSHÁTRÁNYOK • Túl bonyolult, túl hosszú • Ritkán van arra szükségünk, hogy teljesen különböző csoportosításokat végezzünk • Általában a csoportosítások között kapcsolat van, ekkor optimalizálható igazán a grouping set-es lekérdezés • Erre találtak ki két rövidítést, ez gyakrabban használt: ROLLUP és CUBE • Ezekre is lehet ugyanúgy GROUPING és GROUPING_ID függvényeket használni szabo.zsolt@nik.uni-obuda.hu

  21. CUBE • GROUP BY CUBE(a, b, c) =GROUP BY GROUPING SETS ( (a, b, c), (a, b), (b, c), (a, c), (a), (b), (c), ( )). • CUBE(mező1, mező2)  a két mező egyenrangú, minden permutáció szerepel • CUBE(job, deptno): A sima kétmezős GROUP BY-on kívül kiszámolja az egyes munkakör-átlagokat, az egyes részleg-átlagokat, és a teljes átlagot is szabo.zsolt@nik.uni-obuda.hu

  22. SELECT job, deptno, avg(sal) FROM emp GROUP BY CUBE(job, deptno); szabo.zsolt@nik.uni-obuda.hu

  23. ROLLUP • GROUP BY ROLLUP (a, b, c) =GROUPING SETS ( (a, b, c), (a, b), (a), ( )) • ROLLUP(mező1, mező2)  az első mező a "fontosabb", azokat a permutációkat vesszük, amelyben ez szerepel • ROLLUP(job, deptno): A sima kétmezős GROUP BY-on kívül kiszámolja az egyes munkakör-átlagokat, és a teljes átlagot is szabo.zsolt@nik.uni-obuda.hu

  24. SELECT job, deptno, avg(sal) FROM emp GROUP BY ROLLUP(job, deptno); JOB DEPTNO AVG(SAL) --------- ---------- ---------- CLERK 10 1300 MANAGER 10 2450 PRESIDENT 10 5000 ANALYST 20 3000 CLERK 20 950 MANAGER 20 2975 CLERK 30 950 MANAGER 30 2850 SALESMAN 30 1400 ANALYST 3000 CLERK 1037,5 MANAGER 2758,33333 PRESIDENT 5000 SALESMAN 1400 2073,21429 szabo.zsolt@nik.uni-obuda.hu

  25. CSOPORTOSÍTÁSOK KEVERÉSE • GROUP BY a, CUBE(b, c) = GROUP BY GROUPING SETS ( (a, b, c), (a, b), (a, c), (a) ) • GROUP BY a, ROLLUP(b, c) =GROUP BY GROUPING SETS ( (a, b, c), (a, b), (a) ) • Nem igazából használt, csak akkor, ha az üres csoportosítási halmaz valamiért nem kell szabo.zsolt@nik.uni-obuda.hu

More Related