16.7. Was ist Aggregation? Was ist GROUP BY?Antwort von Kristian KöhntoppMit 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. |
||
16.7. Was ist Aggregation? Was ist GROUP BY? http://www.php-faq.de/q/q-sql-aggregation.html |
||
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team |