Was kann eine Aggregatfunktion in der ORDER BY-Klausel tun?

8

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).

  1. Was passiert im Underhood?
  2. In welchen Szenarien wird die Aggregatfunktion in ORDER BY ?
  3. nützlich sein?
nawfal 27.10.2012, 10:23
quelle

3 Antworten

13

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%     
Emil Vikström 27.10.2012, 10:28
quelle
2
  1. Wenn Sie ein solches Aggregat verwenden, erhält die Abfrage eine implizite Gruppe, wobei das gesamte Ergebnis eine einzelne Gruppe ist.

  2. 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.

Guffa 27.10.2012 10:34
quelle
2

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.

    
quelle