auf ein Beispiel Werfen wir einen Blick:
mysql> select * from users;
+---------+----------+
| user_id | salary |
+---------+----------+
| 1 | 42000.00 |
| 2 | 39000.00 |
| 3 | 50000.00 |
+---------+----------+
mysql> SELECT user_id, MAX(salary) FROM users;
+---------+-------------+
| user_id | MAX(salary) |
+---------+-------------+
| 1 | 50000.00 |
+---------+-------------+
Was ist damit? Benutzer 1 ist nicht der Benutzer mit einem Gehalt von 50000,00.
mysql> SELECT user_id, MAX(salary), MIN(SALARY) FROM users;
+---------+-------------+-------------+
| user_id | MAX(salary) | MIN(SALARY) |
+---------+-------------+-------------+
| 1 | 50000.00 | 39000.00 |
+---------+-------------+-------------+
Benutzer 1 ist auch nicht der mit 39000.00. Das wird fischig, oder?
Wenn Sie Aggregatfunktionen verwenden, gelten sie nur für die Spalte, in der Sie die Funktion verwenden. Die Spalte user_id weiß nicht, aus welcher Zeile der maximale Wert stammt, und zeigt die entsprechende user_id an.
In diesem Beispiel, ich abfragen sowohl die MAX und MIN Gehalt. Aber diese gehören verschiedenen Benutzern! Welche user_id sollte angezeigt werden, selbst wenn die user_id automatisch aus der Zeile kommen könnte, aus der der aggregierte Wert stammt?
Und was ist, wenn zwei Benutzer das gleiche Gehalt haben, die für das maximale Gehalt gebunden sind? Welche user_id sollte angezeigt werden?
Und was, wenn Sie eine Aggregatfunktion verwenden, die keinen Wert zurückgibt, der in einer einzelnen Zeile vorhanden ist?
Hier ist die Erklärung: Eine Aggregatfunktion bewirkt, dass das Ergebnis nach dem Lesen der gesamten Zeilengruppe auf eine einzige Zeile reduziert wird. Eine Spalte, die sich nicht innerhalb einer Aggregatfunktion befindet (wie hier user_id), nimmt ihren Wert aus einer beliebigen Zeile in der Gruppe von Zeilen. Beliebig bedeutet nicht zufällig - in der Praxis ist es die erste gelesene MySQL-Zeile in der Gruppe. Aber es gibt keine Garantie, dass das immer so sein wird.
Wie nützlich ist das? Nicht sehr. In anderen Datenbanken ist es keine gültige Abfrage, und es wird buchstäblich einen Fehler generieren.
Tatsächlich hat MySQL 5.7 das Verhalten geändert, indem eine Regel durchgesetzt wurde, die mehrdeutige Abfragen nicht zulässt. Wenn Sie versuchen, die Abfrage oben auf MySQL 5.7 laufen, wird es zu einem Fehler:
ERROR 1140 (42000): In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'test.users.user_id'; this is incompatible with sql_mode=only_full_group_by
Es ist eine Option, um es wie frühere Versionen von MySQL zu machen zu handeln. Weitere Informationen hierzu finden Sie unter: https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
Als eine Kleinigkeit ist SQLite eine andere Datenbank, die diese Art von beliebigem Ergebnis ermöglicht. Nur in SQLite würde der Wert von user_id aus der letzten Zeile stammen, die in der Gruppe gelesen wurde. Stelle dir das vor.
davon abhängen, was Sie tun möchten, , mysql folgt nicht dem ansi-Standard bezüglich aggregierter Funktionen und group by, so dass Sie einige Abkürzungen ausführen können, die in anderen db nicht erlaubt sind. –
@scaisEdge es ich benutze Gruppe von, es wird die Max (Gehalt) für jedes Tupel user_id, Name, die die gleiche wie die Verwendung von 'SELECT user_id, Name, Gehalt' ist zurück – karim
BTW sollten Sie zeigen uns Beispieldaten und erwartete Ausgabe. Diese Frage kann je nach Bedarf sehr unterschiedlich sein. –