Dieser Abschnitt beschreibt Gruppenfunktionen
(Zusammenfassungsfunktionen), die Wertemengen bearbeiten. Sofern
nicht anders angegeben, ignorieren Gruppenfunktionen
NULL
-Werte.
Wenn Sie eine Gruppenfunktion in einer Anweisung verwenden, die
keine GROUP BY
-Klausel enthält, entspricht
dies der Gruppierung aller Datensätze.
Die Zusammenfassungsfunktionen SUM()
und
AVG()
funktionieren bei Zeitwerten nicht.
(Sie konvertieren die Werte in Zahlen, wodurch alles, was nach
dem ersten nichtnumerischen Zeichen auftaucht, verloren geht.)
Um dieses Problem zu umgehen, können Sie die Werte in
numerische Einheiten konvertieren, dann die
Zusammenfassungsfunktion ausführen und abschließend eine
Rückkonvertierung in den Zeitwert durchführen. Ein paar
Beispiele:
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time_col
))) FROMtbl_name
; SELECT FROM_DAYS(SUM(TO_DAYS(date_col
))) FROMtbl_name
;
Gibt den Durchschnittswert von
zurück.
Die Option expr
DISTINCT
kann verwendet
werden, um den Durchschnitt der unterschiedlichen Werte von
expr
zurückzugeben.
AVG()
gibt NULL
zurück, wenn keine passenden Datensätze vorhanden waren.
mysql>SELECT student_name, AVG(test_score)
->FROM student
->GROUP BY student_name;
Gibt das Bit-AND aller Bits in
expr
zurück. Die Berechnung
erfolgt mit 64-Bit-Genauigkeit
(BIGINT
-Genauigkeit).
Die Funktion gibt 18446744073709551615
zurück, wenn keine passenden Datensätze vorhanden waren.
(Dies ist der Wert eines vorzeichenlosen
BIGINT
-Werts, bei dem alle Bits gesetzt
sind.)
Gibt das Bit-OR aller Bits in
expr
zurück. Die Berechnung
erfolgt mit 64-Bit-Genauigkeit
(BIGINT
-Genauigkeit).
Die Funktion gibt 0
zurück, wenn keine
passenden Datensätze vorhanden waren.
Gibt das Bit-XOR aller Bits in
expr
zurück. Die Berechnung
erfolgt mit 64-Bit-Genauigkeit
(BIGINT
-Genauigkeit).
Die Funktion gibt 0
zurück, wenn keine
passenden Datensätze vorhanden waren.
Gibt die Anzahl der Nicht-NULL
-Werte in
den von einer SELECT
-Anweisung
abgerufenen Datensätzen an.
COUNT()
gibt 0
zurück, wenn keine passenden Datensätze vorhanden waren.
mysql>SELECT student.student_name,COUNT(*)
->FROM student,course
->WHERE student.student_id=course.student_id
->GROUP BY student_name;
COUNT(*)
ist dahingehend ein wenig
anders, dass es die Anzahl der abgerufenen Datensätze
unabhängig davon angibt, ob diese
NULL
-Werte enthält oder nicht.
COUNT(*)
ist auf eine sehr schnelle
Rückgabe optimiert, wenn die
SELECT
-Anweisung nur Daten aus einer
Tabelle abruft, andere Spalten nicht abgerufen werden und
keine WHERE
-Klausel vorhanden ist. Zum
Beispiel:
mysql> SELECT COUNT(*) FROM student;
Diese Optimierung gilt nur für
MyISAM
-Tabellen, weil eine exakte
Datensatzanzahl für diese Speicher-Engine gespeichert wird
und so sehr schnell abgerufen werden kann. Bei
transaktionssicheren Speicher-Engines wie
InnoDB
und BDB
ist die
Speicherung einer exakten Datensatzanzahl problematischer,
weil zum gegebenen Zeitpunkt mehrere Transaktionen
stattfinden können, die jede für sich Auswirkungen auf die
Anzahl der Datensätze haben kann.
COUNT(DISTINCT
expr
,[expr
...])
Gibt die Anzahl unterschiedlicher
Nicht-NULL
-Werte zurück.
COUNT(DISTINCT)
gibt 0
zurück, wenn keine passenden Datensätze vorhanden waren.
mysql> SELECT COUNT(DISTINCT results) FROM student;
In MySQL können Sie die Anzahl unterschiedlicher
Ausdruckskombinationen abrufen, die nicht
NULL
enthalten, indem Sie eine Liste mit
Ausdrücken übergeben. In Standard-SQL müssten Sie hierzu
eine Verkettung aller Ausdrücke in COUNT(DISTINCT
...)
angeben.
Diese Funktion gibt einen String als Ergebnis zurück.
Dieser gibt die verketteten
Nicht-NULL
-Werte einer Gruppe zurück.
NULL
wird zurückgegeben, wenn keine
Nicht-NULL
-Werte vorhanden sind. Die
vollständige Syntax sieht wie folgt aus:
GROUP_CONCAT([DISTINCT]expr
[,expr
...] [ORDER BY {unsigned_integer
|col_name
|expr
} [ASC | DESC] [,col_name
...]] [SEPARATORstr_val
])
mysql>SELECT student_name,
->GROUP_CONCAT(test_score)
->FROM student
->GROUP BY student_name;
Oder:
mysql>SELECT student_name,
->GROUP_CONCAT(DISTINCT test_score
->ORDER BY test_score DESC SEPARATOR ' ')
->FROM student
->GROUP BY student_name;
In MySQL können Sie die verketteten Werte von
Ausdruckskombinationen erhalten. Dubletten können Sie
mithilfe von DISTINCT
beseitigen. Wenn
Sie Werte im Ergebnis sortieren wollen, sollten Sie eine
ORDER BY
-Klausel verwenden. Um in
umgekehrter (absteigender) Reihenfolge zu sortieren, fügen
Sie in der ORDER BY
-Klausel das
Schlüsselwort DESC
zum Namen der Spalte
zu, nach der die Sortierung erfolgt: Standardmäßig erfolgt
die Sortierung aufsteigend. Dies kann mit dem Schlüsselwort
ASC
explizit festgelegt werden. Auf
SEPARATOR
folgt der String-Wert, der
zwischen die Ergebniswerte gesetzt werden soll. Der
Vorgabewert ist ein Komma
(‘,
’). Sie können das
Trennzeichen vollständig beseitigen, indem Sie
SEPARATOR ''
angeben.
Sie können mit der Systemvariablen
group_concat_max_len
eine zulässige
Maximallänge angeben. (Der Vorgabewert ist 1024.) Um dies
zur Laufzeit zu machen, verwenden Sie folgende Syntax
(hierbei ist val
ein
vorzeichenloser Integer):
SET [SESSION | GLOBAL] group_concat_max_len = val
;
Wurde eine Maximallänge eingestellt, dann wird das Ergebnis auf diesen Wert gekürzt.
Siehe auch CONCAT()
und
CONCAT_WS()
:
Abschnitt 12.3, „String-Funktionen“.
MIN([DISTINCT]
,
expr
)MAX([DISTINCT]
expr
)
Gibt den Mindest- bzw. den Höchstwert von
expr
zurück.
MIN()
und MAX()
können ein String-Argument entgegennehmen; in diesen
Fällen geben Sie den niedrigsten bzw. höchsten String-Wert
zurück. Siehe auch Abschnitt 7.4.5, „Wie MySQL Indizes benutzt“. Das
Schlüsselwort DISTINCT
können Sie
verwenden, um den kleinsten bzw. größten unterschiedlichen
Wert im Ausdruck expr
zu
ermitteln; allerdings wird hierbei das gleiche Ergebnis wie
beim Weglassen von DISTINCT
erzielt.
MIN()
und MAX()
geben
NULL
zurück, wenn keine passenden
Datensätze vorhanden waren.
mysql>SELECT student_name, MIN(test_score), MAX(test_score)
->FROM student
->GROUP BY student_name;
Bei MIN()
, MAX()
und
anderen Zusammenfassungsfunktionen vergleicht MySQL zurzeit
ENUM
- und SET
-Spalten
nach ihrem String-Wert anstelle der relativen Position des
Strings in der Menge. Dies unterscheidet sich von der von
ORDER BY
verwendeten Vergleichsmethode.
Eine Behebung ist für einen zukünftigen MySQL-Release
vorgesehen.
Gibt die Populationsstandardabweichung von
expr
zurück. Dies stellt eine
Erweiterung des SQL-Standards dar. Die Form
STDDEV()
dieser Funktion ist zum Zweck
der Oracle-Kompatibilität vorhanden. Stattdessen kann die
SQL-Standardfunktion STDDEV_POP()
verwendet werden.
Diese Funktionen geben NULL
zurück, wenn
keine passenden Datensätze vorhanden waren.
Gibt die Populationsstandardabweichung von
expr
(Quadratwurzel von
VAR_POP()
) zurück. Sie können auch
STD()
oder STDDEV()
verwenden, die äquivalent, aber nicht SQL-Standard sind.
STDDEV_POP()
gibt NULL
zurück, wenn keine passenden Datensätze vorhanden waren.
Gibt die Beispielstandardabweichung von
expr
(Quadratwurzel von
VAR_SAMP()
) zurück.
STDDEV_SAMP()
gibt
NULL
zurück, wenn keine passenden
Datensätze vorhanden waren.
Gibt die Summe von expr
zurück.
Wenn die Rückgabemenge keine Datensätze enthält, gibt
SUM()
NULL
zurück.
Das Schlüsselwort DISTINCT
kann in MySQL
5.1 benutzt werden, um nur die Summe
unterschiedlicher Werte in expr
zu bilden.
SUM()
gibt NULL
zurück, wenn keine passenden Datensätze vorhanden waren.
Gibt die Populationsstandardvarianz von
expr
zurück. Hierbei werden
Datensätze als gesamte Population und nicht als Beispiel
betrachtet, d. h., die Anzahl der Datensätze ist der
Nenner. Sie können auch VARIANCE()
verwenden, das äquivalent, aber nicht SQL-Standard ist.
VAR_POP()
gibt NULL
zurück, wenn keine passenden Datensätze vorhanden waren.
Gibt die Beispielvarianz von expr
zurück. Hieraus ergibt sich, dass der Nenner die Anzahl der
Datensätze minus 1 ist.
VAR_SAMP()
gibt NULL
zurück, wenn keine passenden Datensätze vorhanden waren.
Gibt die Populationsstandardvarianz von
expr
zurück. Dies stellt eine
Erweiterung des SQL-Standards dar. Stattdessen kann die
SQL-Standardfunktion VAR_POP()
verwendet
werden.
VARIANCE()
gibt NULL
zurück, wenn keine passenden Datensätze vorhanden waren.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.