Wenn du jemals versucht hast, eine Durchschnittsnote für Prüfungen oder zum Beispiel das durchschnittliche Gehalt in einer Abteilung zu berechnen, kennst du das Konzept des arithmetischen Mittels schon. Das lernt man ja meistens schon in der Schule. In SQL löst du jede Aufgabe, die mit der Berechnung eines Durchschnittswerts in einem Datensatz zu tun hat, mit der Funktion AVG().
Die Funktion AVG() ist eine Aggregatfunktion, die das arithmetische Mittel für eine numerische Spalte berechnet. Sie summiert alle Werte in der angegebenen Spalte und teilt das Ergebnis durch die Anzahl dieser Werte. Sie ignoriert NULL (und dieses Ignorieren macht das Leben tatsächlich einfacher, aber dazu später mehr).
Syntax von AVG()
Lass uns mit der grundlegenden Syntax starten:
SELECT AVG(spalte)
FROM tabelle;
Wichtig: Hier ist spalte die Spalte mit den numerischen Werten, für die du den Durchschnitt berechnen willst.
Beispiel 1: Durchschnittsgehalt der Mitarbeiter
Stell dir vor, wir haben eine Tabelle employees, in der die Daten der Mitarbeiter und ihre Gehälter gespeichert sind:
| id | name | salary |
|---|---|---|
| 1 | Otto | 50000 |
| 2 | Maria | 60000 |
| 3 | Alex | 55000 |
| 4 | Anna | NULL |
| 5 | Dan | 52000 |
Ein einfacher Query, um das Durchschnittsgehalt zu berechnen:
SELECT AVG(salary) AS average_salary
FROM employees;
Ergebnis:
| average_salary |
|---|
| 54250 |
Wie funktioniert das?
AVG()summiert alle Gehälter: 50000 + 60000 + 55000 + 52000 = 217000.- Teilt die Summe durch die Anzahl der nicht-NULL Werte: 217000 / 4 = 54250.
Besonderheiten von AVG() mit NULL
Du hast vielleicht bemerkt, dass für die Durchschnittsberechnung der Wert NULL in der Spalte salary ignoriert wurde. Das ist ein zentrales Feature von AVG(). Sie berücksichtigt nur nicht-NULL Werte.
Probieren wir ein Beispiel:
SELECT AVG(NULL) AS ergebnis;
Ergebnis:
| ergebnis |
|---|
| NULL |
Das bestätigt nochmal, dass AVG() NULL ignoriert. Wenn aber der ganze Datensatz nur aus NULL besteht, ist das Ergebnis NULL.
Wenn in der Tabelle aber statt NULL eine 0 steht, wird dieses Ergebnis nicht ignoriert.
Tabelle employees
| id | salary |
|---|---|
| 1 | 1000 |
| 2 | 0 |
| 3 | NULL |
| 4 | 2000 |
SQL-Query:
SELECT AVG(salary) AS avg_salary
FROM employees;
Ergebnis:
| avg_salary |
|---|
| 1000 |
Warum ist das so?
Weil AVG() folgendes berechnet:
[(1000 + 0 + 2000) / 3 = 1000]
Die Zeile mit NULL wird beim Durchschnitt ignoriert.
Beispiel: Durchschnittsalter der Studenten berechnen
Jetzt schauen wir uns die Tabelle students an:
| id | name | age |
|---|---|---|
| 1 | Anna | 20 |
| 2 | Max | 22 |
| 3 | Maria | NULL |
| 4 | Otto | 21 |
Query:
SELECT AVG(age) AS average_age
FROM students;
Ergebnis:
| average_age |
|---|
| 21 |
AVG()ignoriert die Studentin Maria, weil ihr Alter als NULL angegeben ist.- Der Durchschnitt wird so berechnet: (20 + 22 + 21) / 3 = 21.
Runden des Ergebnisses
Manchmal gibt AVG() ein Dezimalergebnis mit mehreren Nachkommastellen zurück.
Wenn du eine gerundete Zahl brauchst, kannst du die Funktion ROUND() verwenden.
Tabelle employees
| id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | 47000 |
| 4 | NULL |
SQL-Query
SELECT ROUND(AVG(salary), 2) AS rounded_average_salary
FROM employees;
Ergebnis
| rounded_average_salary |
|---|
| 52333.33 |
Die Zeile mit NULL wird beim Berechnen ausgeschlossen, also wird der Durchschnitt aus drei Werten berechnet.
Daten filtern vor der AVG()-Berechnung
Wenn du den Durchschnitt nur für Werte berechnen willst, die bestimmten Bedingungen entsprechen, nutze WHERE.
Tabelle employees
| id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | 47000 |
| 4 | 60000 |
| 5 | NULL |
Beispiel: Finde das Durchschnittsgehalt der Mitarbeiter, deren id > 2 ist.
SELECT AVG(salary) AS average_salary
FROM employees
WHERE id > 2;
Ergebnis
| average_salary |
|---|
| 53500 |
In die Berechnung gehen nur die Gehälter mit id = 3 und id = 4 ein. Die Zeile mit NULL wird ausgeschlossen.
Beispiel: Komplexe Queries mit AVG()
Du kannst die Funktion AVG() auch mit anderen Aggregatfunktionen und Operatoren kombinieren.
Angenommen, wir haben eine Verkaufstabelle sales:
| sale_id | product | quantity | price |
|---|---|---|---|
| 1 | Telefon | 2 | 500 |
| 2 | Laptop | 1 | 1500 |
| 3 | Tablet | 3 | 300 |
Query zur Berechnung des durchschnittlichen Gesamtverkaufsbetrags:
SELECT AVG(quantity * price) AS average_total_sale
FROM sales;
Ergebnis:
| averagetotalsale |
|---|
| 950 |
Praxistipps und typische Fehler
Mit AVG() solltest du vorsichtig sein, um typische Fehler zu vermeiden:
NULL-Werte: Manchmal wundert man sich, warum das Ergebnis kleiner als erwartet ist. Denk dran, dass AVG() Zeilen mit NULL überspringt.
Gemischte Datentypen: Wenn in der Spalte Zahlen und Text gemischt sind (was sowieso schlechte Praxis ist), gibt AVG() einen Fehler aus.
GO TO FULL VERSION