Einige Leute geben sich große Mühe, GROUP BY- und HAVING-Klauseln in ihren Abfragen zu vermeiden. Die Fehlermeldungen sind pingelig, aber sie sind in der Regel richtig. Die Schlüsselwörter GROUP BY und HAVING sind für eine gute SQL-Berichterstellung unerlässlich.
Der Hauptgrund für GROUP BY besteht darin, die Anzahl der Zeilen zu reduzieren, normalerweise durch Aggregation. Es erzeugt nur eine Zeile für jede übereinstimmende Gruppierung aus der Eingabe. Dadurch können Sie anspruchsvolle Berechnungen über gewöhnliches SQL durchführen.
Obstbeispiel:
Wir haben Obst:
Dieser nächste Fall lässt uns nach vorne blicken. Welche Früchte werden Mitte des Jahres verfügbar sein? Wir tun dies mit der gleichen Abfrage wie oben, aber nachdem die Abfrage ausgeführt wurde, überprüfen wir die Werte von min(fresh_until) mithilfe einer Klauselhaving. Mit HAVING qualifizieren Sie ein Aggregat.
Alle Äpfel und Trauben werden Mitte des Jahres verfügbar sein.
Die Liste der Elemente zwischen SELECT und FROM, die Zielliste. kann Nichtaggregate und Aggregate enthalten. Diese nicht aggregierten Spalten in der Zielliste
sollten in der group by-Klausel enthalten sein. Die Fehlermeldung sagt es. Die Reihenfolge der Spalten in der group by-Klausel ist von Bedeutung. Es bestimmt, wie die Aggregate gruppiert werden. Die Reihenfolge ist oft hierarchisch. Was das für Ihre Kolumnen bedeutet, ist Ihr Fokus. Es könnte Obst oder Quellen und/oder fresh_until date sein.
Beispiele für Spielkarten
Schauen wir uns eine weitere Reihe von Beispielen an, die das Extrahieren von Informationen auf Spielkarten veranschaulichen. Weitere Informationen zu Karten finden Sie unter Wikipedia Standardkarten.
Angenommen, Sie teilen programmatisch sechs Hände mit 5 Karten aus, wie sechs Leute, die Poker spielen. Bei diesem Deal werden insgesamt 30 Karten verwendet. Sie sind in einer Hand Tabelle wie die folgende, in der die Namen von Karten und Farben durch Nachschlagetabellen verbunden sind. Wir speichern Ränge, damit wir richtig sortieren können. Wir verwenden Namen für die Anzeige. Die Namen und Ränge haben eine Eins-zu-Eins-Beziehung für jede Karte und jede Farbe.
Wie hoch ist die Anzahl der Farben für jede Hand? Wir interessieren uns wirklich nur für Hände, die 3 oder mehr Karten der gleichen Farbe haben. Das wird uns sagen, wer bessere Chancen auf einen Poker Flush hat. Beachten Sie, dass GROUP BY zwar ORDER BY zu implizieren scheint, dies jedoch nicht der Fall ist. ORDER BY muss explizit sein.
Was also, wenn Sie Ihre Abfrage falsch gruppiert haben? Wenn diese Hand Wenn der Tisch nicht nach Hand-ID gruppiert ist, erhalten Sie 30 Datensätze mit 6 Händen mit 5 Karten. Wenn Sie Aggregate hätten, würden sie nach Zeilen gruppiert. Nicht sehr hilfreich.
Wenn Sie den Kartennamen aggregieren und
den Kartennamen nicht einzeln in die Zielliste aufnehmen und versuchen, nach Kartennamen zu sortieren,
erhalten Sie die Fehlermeldung, dass er nicht enthalten sein sollte
die order by-Klausel. Die order by-Klausel sollte
Elemente der group by-Klausel enthalten.
Wenn der Kartenname jedoch explizit in der Zielliste enthalten ist,
dann muss der Kartenname in der group by-Klausel enthalten sein und
daher in der order by-Klausel zulässig sein.
Wenn die Abfrage nach Farbe erfolgt, gibt es für jede der sechs Hände mindestens 1 oder maximal 4 Datensätze pro Farbe. Beachten Sie, dass wir nach dem Rang der Farbe sortieren, der
auch in der Gruppieren-nach-Klausel enthalten sein muss. su_name und su_rank haben eine Eins-zu-Eins-Beziehung.
Um die Verteilung der Karten auf die Hände zu sehen, müssen wir nach der Kartenrangspalte gruppieren. Natürlich gibt es 4 Farben von jeder Karte, sodass Sie eine Karte nicht in mehr als vier Händen sehen werden.
Um einen Blick darauf zu werfen, wer Asse hält, können wir die folgende kurze Abfrage verwenden. Beachten Sie, dass es eine WHERE-Klausel gibt, die beim Sammeln der Zeilen ausgeführt wird. HAVING wird ausgeführt, nachdem die Zeilen gesammelt wurden.
Zusammenfassung
Diese Beispiele sind einfache Möglichkeiten, um bekannte Entitäten zu bewerten. Experimentieren Sie und verwenden Sie diese einfachen Regeln.
- Wenn sich eine Spalte in der Zielliste und nicht in einem Aggregat befindet, muss sie in einer GROUP BY-Klausel enthalten sein.
- WHERE-Klauseln treten während des Auswahlprozesses auf.
- HAVING-Klauseln treten auf, nachdem die Aggregate abgeschlossen sind.
- Nur Nicht-Aggregate können in der ORDER BY-Klausel enthalten sein.
- Die Reihenfolge der GROUP BY-Klausel ist wichtig.