de.comp.lang.php.* FAQ

16.7. Was ist Aggregation? Was ist GROUP BY?

Keywords: SQL | Datenbank | group by

Antwort von Kristian Köhntopp

Mit Hilfe der GROUP BY-Clause kann man in SQL Daten aggregieren, also Äquivalenzklassen über den gefundenen Elementen bilden und mit den so gefundenen Teilmengen arbeiten.

Gegeben sei eine Menge von Tupeln, etwa (1, 2), (1, 3), (2, 3), (2, 2), (3, 17), (2, 21). Man kann diese Menge jetzt in Teilmengen unterteilen, das wäre dann in der Mathematik eine Relation. Die Elemente, die gemeinsam in einer Teilmenge stehen, stehen dann in einer Relation zueinander.

Eine Relation ist zum Beispiel kleiner als x. Nimmt man zum Beispiel die Menge N (natürliche Zahlen) und die Relation kleiner als 10, dann teilt diese Relation die Menge N in zwei Teilmengen: Die Menge der natürlichen Zahlen, die die Relation erfüllen (also die Zahlen 0, 1, 2, 3, ..., 9) und die Menge der natürlichen Zahlen, die die Relation nicht erfüllen (die Zahlen 10, 11, ...).

Ebenso kann man eine Äquivalenzrelation definieren. Eine solche Relation definiert mehrere Teilmengen und die Elemente einer Teilmenge sind gleich. In N mit == als Relation ist das witzlos, da die Teilmengen dann einelementig sind, aber mit den o.a. Tupeln kann man ein sinnvolles Beispiel definieren, wenn man als Äquivalenzrelation Gleichheit des ersten Elementes definiert. Man bekommt dann die folgenden Teilmengen:

Die Menge 1 == { (1, 2), (1, 3) }
Die Menge 2 == { (2, 3), (2, 2), (2, 21) }
Die Menge 3 == { (3, 17) }

Angenommen, die Tupel seien eine Tabelle

CREATE TABLE beispiel (
  x integer,
  y integer
);

dann würde man die o.a. Tupel als

INSERT INTO beispiel (x, y) values (1, 2);
INSERT INTO beispiel (x, y) values (1, 3);
INSERT INTO beispiel (x, y) values (2, 3);
INSERT INTO beispiel (x, y) values (2, 2);
INSERT INTO beispiel (x, y) values (2, 21);
INSERT INTO beispiel (x, y) values (3, 17);

definieren und bekäme die Äquivalenzrelation aus dem Beispiel als

SELECT x AS mengenname FROM beispiel GROUP BY x;
+------------+
| mengenname |
+------------+
|          1 |
|          2 |
|          3 |
+------------+
3 rows in set (0.01 sec)

d.h. die Tupel (x, y) mit gleichem x bilden jeweils eine Menge. Wir sehen uns von diesen Tupeln jeweils nur die x an.

Die Mächtigkeit der Mengen 1, 2 und 3 kann man mittels count() bestimmen:

SELECT x AS mengenname, COUNT(x) AS maechtigkeit
  FROM beispiel
  GROUP BY x;
+------------+--------------+
| mengenname | maechtigkeit |
+------------+--------------+
|          1 |            2 |
|          2 |            3 |
|          3 |            1 |
+------------+--------------+
3 rows in set (0.00 sec)

Man kann sich auch das Tupel (x, y) wieder ausgeben lassen:

SELECT x, y FROM beispiel GROUP BY x;
+------+------+
| x    | y    |
+------+------+
|    1 |    2 |
|    2 |    3 |
|    3 |   17 |
+------+------+
3 rows in set (0.00 sec)

MySQL wählt hier irgendein y, da ja per Definition alle (x, y) innerhalb einer Teilmenge gleich sind und jedes Element der Teilmenge daher als Repräsentant der Teilmenge gewählt werden kann.

Valid HTML 4.01! Valid CSS!

16.7. Was ist Aggregation? Was ist GROUP BY?
http://www.php-faq.de/q/q-sql-aggregation.html
de.comp.lang.php.* FAQ | (c) Copyright 2000-2007 Das dclp-FAQ-Team