Prakt. Datenbankprogrammierung Sommersemester 2005 I,5: Aggregieren von Daten mit Gruppen-Funktionen Martin-Luther-Universität Halle, Institut für Informatik, Datenbanken Christian Goldberg Was sind Gruppen-Funktionen? Gruppenfunktionen operieren auf Mengen von Zeilen und geben ein Ergebnis pro Gruppe zurück. DEPTNO SAL 10 2450 10 1300 20 800 20 1100 20 2975 30 1600 30 2850 30 950 30 1500 maximum salary in the table I-108 Prakt. Datenbankprogrammierung SS05 Christian Goldberg MAX(SAL) 5000 Arten von Gruppenfunktionen Anwendung von Gruppenfunktionen AVG COUNT MAX MIN STDDEV SUM VARIANCE SELECT FROM [WHERE [ORDER BY column, group_function(column) table condition] column]; I-109 Prakt. Datenbankprogrammierung SS05 Christian Goldberg I-110 Prakt. Datenbankprogrammierung SS05 Christian Goldberg
Die Funktionen AVG und SUM AVG und SUM werden für numerische Daten verwendet. Die Funktionen MIN und MAX MIN und MAX können mit jedem Datentyp verwendet werden. SQL> SELECT AVG(sal), MAX(sal), 2 MIN(sal), SUM(sal) 3 FROM emp 4 WHERE job LIKE 'SALES%'; SQL> SELECT MIN(hiredate), MAX(hiredate) ; AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL) -------- 1400 1600 1250 5600 MIN(HIRED MAX(HIRED 17-DEC-80 12-JAN-83 I-111 Prakt. Datenbankprogrammierung SS05 Christian Goldberg I-112 Prakt. Datenbankprogrammierung SS05 Christian Goldberg COUNT(*) 6 Die COUNT-Funktion COUNT(*) gibt die Anzahl der Zeilen einer Tabelle zurück. SQL> SELECT COUNT(*) 3 WHERE deptno = 30; Die COUNT-Funktion COUNT(expr expr) ) gibt die Anzahl der Zeilen zurück, die nicht NULL sind. SQL> SELECT COUNT(comm) 3 WHERE deptno = 30; COUNT(COMM) -- 4 I-113 Prakt. Datenbankprogrammierung SS05 Christian Goldberg I-114 Prakt. Datenbankprogrammierung SS05 Christian Goldberg
Gruppenfunktionen und NULL-Werte SQL> SELECT AVG(comm) ; AVG(COMM) 550 Anwendung der NVL-Funktion mit Gruppenfunktionen Gruppenfunktionen ignorieren NULL- Werte in den Spalten. Durch die NVL-Funktion werden NULL- Werte in Gruppenfunktionen berücksichtigt. SQL> SELECT AVG(NVL(comm,0)) ; AVG(NVL(COMM,0)) ------- 157.14286 I-115 Prakt. Datenbankprogrammierung SS05 Christian Goldberg I-116 Prakt. Datenbankprogrammierung SS05 Christian Goldberg Erstellen von Gruppen von Daten DEPTNO SAL 10 2450 10 1300 20 800 20 1100 20 2975 30 1600 30 2850 30 950 30 1500 2916.6667 2175 1566.6667 DEPTNO AVG(SAL) ------- 10 2916.6667 20 2175 30 1566.6667 Erstellen von Gruppen von Daten: Die GROUP-BY-Klausel SELECT FROM [WHERE [GROUP BY [ORDER BY column, group_function(column) table condition] group_by_expression] column]; Durchschn. Gehalt in der - Tabelle für jede Abteilung Tabellenzeilen werden mit der GROUP-BY BY- Klausel in kleinere Gruppen eingeteilt. I-117 Prakt. Datenbankprogrammierung SS05 Christian Goldberg I-118 Prakt. Datenbankprogrammierung SS05 Christian Goldberg
Anwendung der GROUP-BY-Klausel Alle Spalten unter SELECT, die nicht in Gruppenfunktionen verwendet werden, müssen in der GROUP-BY BY-Klausel stehen. SQL> SELECT deptno, AVG(sal) 3 GROUP BY deptno; DEPTNO AVG(SAL) 10 2916.6667 20 2175 30 1566.6667 Anwendung der GROUP-BY-Klausel Die GROUP-BY BY-Spalte muss umgekehrt nicht unter SELECT stehen. SQL> SELECT AVG(sal) 3 GROUP BY deptno; AVG(SAL) 2916.6667 2175 1566.6667 I-119 Prakt. Datenbankprogrammierung SS05 Christian Goldberg I-120 Prakt. Datenbankprogrammierung SS05 Christian Goldberg Gruppieren nach mehr als einer Spalte DEPTNO JOB SAL 10 MANAGER 2450 10 PRESIDENT 5000 10 CLERK 1300 20 CLERK 800 20 CLERK 1100 20 ANALYST 3000 20 ANALYST 3000 20 MANAGER 2975 30 SALESMAN 1600 30 MANAGER 2850 30 SALESMAN 1250 30 CLERK 950 30 SALESMAN 1500 30 SALESMAN 1250 sum salaries in the table for each job, grouped by department DEPTNO -------- 10 10 10 20 20 20 30 30 30 JOB SUM(SAL) CLERK 1300 MANAGER 2450 PRESIDENT 5000 ANALYST 6000 CLERK 1900 MANAGER 2975 CLERK 950 MANAGER 2850 SALESMAN 5600 Anwendung der GROUP-BY- Klausel mit mehreren Spalten SQL> SELECT deptno, job, sum(sal) 3 GROUP BY deptno, job; DEPTNO JOB SUM(SAL) 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 20 ANALYST 6000 20 CLERK 1900... 9 rows selected. I-121 Prakt. Datenbankprogrammierung SS05 Christian Goldberg I-122 Prakt. Datenbankprogrammierung SS05 Christian Goldberg
Fehlerhafte Anfragen mit Gruppenfunktionen Alle Spalten und Ausdrücke unter SELECT, die keine Aggregatsfunktion darstellen, müssen in der GROUP-BY BY-Klausel stehen. SQL> SELECT deptno, COUNT(ename) ; SELECT deptno, COUNT(ename) * ERROR at line 1: ORA-00937: not a single-group group function Spaltenname fehlt in der GROUP-BY BY-Klausel Fehlerhafte Anfragen mit Gruppenfunktionen Die WHERE-Klause kann nicht zur Auswahl von Gruppen verwendet werden. Auswahl von Gruppen mit HAVING-Klausel. SQL> SELECT deptno, AVG(sal) 3 WHERE AVG(sal) > 2000 4 GROUP BY deptno; WHERE AVG(sal) > 2000 * ERROR at line 3: ORA-00934: group function is not allowed here WHERE-Klausel kann nicht zur Auswahl von Gruppen verwendet werden I-123 Prakt. Datenbankprogrammierung SS05 Christian Goldberg I-124 Prakt. Datenbankprogrammierung SS05 Christian Goldberg Auswahl von Ergebnisgruppen DEPTNO SAL 10 2450 10 1300 20 800 20 1100 20 2975 30 1600 30 2850 30 950 30 1500 5000 3000 2850 Maximales Gehalt pro Abteilung ist Größer als $2900 DEPTNO MAX(SAL) Auswahl von Ergebnisgruppen: Die HAVING-Klausel Mit der HAVING-Klausel werden Gruppen ausgewählt: Zeilen werden gruppiert. Die Gruppenfunktion wird angewendet. Gruppen, die die HAVING-Bedingung erfüllen, werden angezeigt. SELECT FROM [WHERE [GROUP BY [HAVING [ORDER BY column, group_function table condition] group_by_expression] group_condition] column]; I-125 Prakt. Datenbankprogrammierung SS05 Christian Goldberg I-126 Prakt. Datenbankprogrammierung SS05 Christian Goldberg
Anwendung der HAVING-Klausel Anwendung der HAVING-Klausel SQL> SELECT deptno, max(sal) 3 GROUP BY deptno 4 HAVING max(sal)>2900; DEPTNO MAX(SAL) SQL> SELECT job, SUM(sal) PAYROLL 3 WHERE job NOT LIKE 'SALES%' 4 GROUP BY job 5 HAVING SUM(sal)>5000 6 ORDER BY SUM(sal); JOB PAYROLL ANALYST 6000 MANAGER 8275 I-127 Prakt. Datenbankprogrammierung SS05 Christian Goldberg I-128 Prakt. Datenbankprogrammierung SS05 Christian Goldberg Schachtelung von Gruppenfunktionen Anzeige des maximal durchschnittlichen Gehalts pro Abteilung SQL> SELECT max(avg(sal)) 3 GROUP BY deptno; MAX(AVG(SAL)) ---- 2916.6667 I-129 Prakt. Datenbankprogrammierung SS05 Christian Goldberg