Database Reference
In-Depth Information
SELECT
count(
*
)
FROM
events
WHERE
venue
_
id = 1;
SELECT
count(
*
)
FROM
events
WHERE
venue
_
id = 2;
SELECT
count(
*
)
FROM
events
WHERE
venue
_
id = 3;
SELECT
count(
*
)
FROM
events
WHERE
venue
_
id IS NULL;
Das wäre sehr lästig, wenn die Zahl der Veranstaltungsorte wächst. Daher
nutzen wir den
GROUP BY
-Befehl.
Gruppierung
GROUP BY
ist ein Kürzel, das die obigen Queries auf einmal ausführt. Mit
GROUP
BY
weisen Sie Postgres an, die Zeilen zu gruppieren und dann eine Aggregat-
funktion (wie
count()
) auf diese Gruppen anzuwenden.
SELECT
venue
_
id, count(
*
)
FROM
events
GROUP BY
venue
_
id;
venue
_
id | count
----------+-------
1|
1
2|
2
3|
1
|
3
Das ist eine nette Liste, aber die Frage ist, ob wir sie über die
count()
-
Funktion filtern können. Die Antwort lautet ja. Die
GROUP BY
-Bedingung be-
sitzt ein eigenes Filter-Schlüsselwort:
HAVING
.
HAVING
verhält sich wie die
WHERE
-Klausel, nur dass es über Aggregatfunktionen filtert (was
WHERE
nicht
kann).
Die folgende Query liefert die beliebtesten Veranstaltungsorte zurück, d. h.
diejenigen mit zwei oder mehr Events:
SELECT
venue
_
id
FROM
events
GROUP BY
venue
_
id
HAVING count
(
*
)>=2
AND
venue
_
id IS
NOT
NULL;
venue
_
id | count
----------+-------
2|
2
Sie können
GROUP BY
auch ohne Aggregatfunktion nutzen. Wenn Sie
SELECT...
FROM...GROUP BY
für eine Spalte ausführen, erhalten Sie eine Liste aller ein-
deutigen Werte zurück.
SELECT
venue
_
id
FROM
events
GROUP BY
venue
_
id;