Sagen wir, ich habe eine Pflanzentabelle:
%Vor%Ich kann das tun
%Vor%was das Offensichtliche tut.
Aber ich wurde dadurch gebissen, was macht das?
%Vor%Alle geben nur die erste Zeile zurück (was mit id = 1 ist).
ORDER BY
? Ihre Ergebnisse sind klarer, wenn Sie anstelle der Spalten aus der Tabelle tatsächlich die Aggregatwerte auswählen:
%Vor%Dies wird die Summe aller IDs zurückgeben. Dies ist natürlich ein nutzloses Beispiel, da die Aggregation immer nur eine Zeile erzeugt und daher keine Reihenfolge erforderlich ist. Der Grund dafür, dass Sie eine Zeile mit Spalten in Ihrer Abfrage erhalten, liegt darin, dass MySQL eine Zeile auswählt, die nicht zufällig, aber auch nicht deterministisch ist. Es ist einfach so, dass es die erste Spalte in der Tabelle in Ihrem Fall ist, aber andere können je nach Speichermodul, Primärschlüsseln usw. eine andere Zeile erhalten. Die Aggregation nur in der ORDER BY-Klausel ist daher nicht sehr nützlich.
Was Sie normalerweise tun möchten, ist die Gruppierung nach einem bestimmten Feld und anschließend die Reihenfolge der Ergebnisse:
%Vor%Nun, das ist eine interessantere Frage! Dies gibt Ihnen eine Zeile für jede Frucht zusammen mit der Gesamtzahl für diese Frucht. Versuchen Sie, weitere Äpfel hinzuzufügen, und die Bestellung wird tatsächlich Sinn ergeben:
Vollständige Tabelle:
%Vor%Die obige Abfrage:
%Vor%Wenn Sie ein solches Aggregat verwenden, erhält die Abfrage eine implizite Gruppe, wobei das gesamte Ergebnis eine einzelne Gruppe ist.
Die Verwendung eines Aggregats in der Reihenfolge nach ist nur sinnvoll, wenn Sie auch über eine Gruppe verfügen, sodass Sie mehr als eine Zeile im Ergebnis haben können.
Alle diese Abfragen geben Ihnen einen Syntaxfehler auf jeder SQL-Plattform, die den SQL-Standards entspricht.
%Vor%Bei PostgreSQL beispielsweise werfen alle diese Abfragen den gleichen Fehler auf.
FEHLER: Spalte "plant.id" muss in der GROUP BY-Klausel erscheinen oder sein in einer Aggregatfunktion verwendet
Das bedeutet, dass Sie eine Domänenaggregatfunktion verwenden, ohne GROUP BY zu verwenden. SQL Server und Oracle geben ähnliche Fehlermeldungen zurück.
MySQLs GROUP BY ist bekanntlich in mehrfacher Hinsicht gebrochen, zumindest was das Standardverhalten betrifft. Aber die Fragen, die du gepostet hast, waren für mich ein neues gebrochenes Verhalten, also +1 für das.
Anstatt zu versuchen, zu verstehen, was es unter der Haube tut, ist es wahrscheinlich besser, wenn Sie lernen, standardmäßige GROUP BY-Abfragen zu schreiben. MySQL wird Standard-GROUP BY-Anweisungen korrekt verarbeiten, soweit ich weiß.
Frühere Versionen der MySQL-Dokumente warnten Sie vor GROUP BY und versteckten Spalten. (Ich habe keine Referenz, aber dieser Text wird überall zitiert.)
Verwenden Sie diese Funktion nicht, wenn die Spalten, die Sie aus dem GROUP BY-Teil auslassen, nicht vorhanden sind sind in der Gruppe nicht konstant. Der Server kann einen beliebigen Wert zurückgeben aus der Gruppe, so sind die Ergebnisse unbestimmt, es sei denn alle Werte sind das gleiche.
Neuere Versionen sind ein wenig anders .
Sie können diese Funktion verwenden, um eine bessere Leistung zu erzielen, indem Sie vermeiden unnötige Spaltensortierung und Gruppierung. Dies ist jedoch nützlich hauptsächlich, wenn alle Werte in jeder nicht aggregierten Spalte nicht benannt sind Die GROUP BY sind für jede Gruppe gleich. Der Server ist frei wählbar jeder Wert von jeder Gruppe, so, wenn sie nicht gleich sind, die Werte gewählt sind unbestimmt.
Ich persönlich halte unbestimmt nicht für eine Funktion in SQL.
Tags und Links sql mysql aggregate-functions sql-order-by