493 Stimmen

Gibt es einen Unterschied zwischen GROUP BY und DISTINCT

Neulich habe ich etwas Einfaches über SQL gelernt:

SELECT c FROM myTbl GROUP BY C

Hat das gleiche Ergebnis wie:

SELECT DISTINCT C FROM myTbl

Ich bin neugierig, ob es einen Unterschied in der Art und Weise gibt, wie eine SQL-Engine den Befehl verarbeitet, oder ob es sich wirklich um dasselbe handelt.

Ich persönlich bevorzuge die eindeutige Syntax, aber ich bin mir sicher, dass das eher aus Gewohnheit so ist.

EDIT: Es handelt sich nicht um eine Frage über Aggregate. Die Verwendung von GROUP BY mit Aggregatfunktionen verstanden wird.

3voto

Felix Labayen Punkte 239

In Bezug auf die Verwendung wird GROUP BY für die Gruppierung der Zeilen verwendet, die Sie berechnen möchten. DISTINCT führt keine Berechnungen durch. Es werden keine doppelten Zeilen angezeigt.

Ich habe immer DISTINCT verwendet, wenn ich Daten ohne Duplikate darstellen möchte.

Wenn ich Berechnungen durchführen möchte, z. B. die Gesamtmenge der Mangos zusammenzählen, verwende ich GROUP BY

3voto

Jeffrey L Whitledge Punkte 55524

Bei dieser speziellen Abfrage gibt es keinen Unterschied. Wenn Sie jedoch Aggregatspalten hinzufügen, müssen Sie natürlich die Gruppierung nach verwenden.

2voto

onedaywhen Punkte 52850

Aus der Sicht von "SQL the language" sind die beiden Konstrukte gleichwertig, und welche man wählt, ist eine dieser "Lifestyle"-Entscheidungen, die wir alle treffen müssen. Ich denke, es gibt gute Argumente dafür, dass DISTINCT expliziter ist (und daher mehr Rücksicht auf die Person nimmt, die Ihren Code erben wird usw.), aber das bedeutet nicht, dass das GROUP BY-Konstrukt eine ungültige Wahl ist.

Ich denke, dass dieses "GROUP BY ist für Aggregate" der falsche Schwerpunkt ist. Die Leute sollten sich darüber im Klaren sein, dass die Mengenfunktion (MAX, MIN, COUNT usw.) weggelassen werden kann, damit sie die Absicht des Programmierers verstehen können, wenn dies der Fall ist.

Der ideale Optimierer erkennt gleichwertige SQL-Konstrukte und wählt dementsprechend immer den idealen Plan. Die SQL-Engine Ihrer Wahl müssen Sie im wirklichen Leben testen :)

PS: Beachten Sie, dass die Position des Schlüsselworts DISTINCT in der Select-Klausel zu unterschiedlichen Ergebnissen führen kann, z. B. Kontrast:

SELECT COUNT(DISTINCT C) FROM myTbl;

SELECT DISTINCT COUNT(C) FROM myTbl;

2voto

Gabriel Punkte 21

Ich weiß, es ist ein alter Beitrag. Aber es kommt vor, dass ich eine Abfrage hatte, die group by verwendete, um eindeutige Werte zurückzugeben, wenn ich diese Abfrage in Toad und Oracle Reports verwendete, funktionierte alles gut, ich meine eine gute Antwortzeit. Als wir von Oracle 9i auf 11g migriert haben, war die Antwortzeit in Toad hervorragend, aber in den Berichten dauerte es etwa 35 Minuten, bis der Bericht fertig war, während es in der vorherigen Version etwa 5 Minuten dauerte.

Die Lösung bestand darin, die Gruppierung nach zu ändern und DISTINCT zu verwenden, und jetzt läuft der Bericht in etwa 30 Sekunden.

Ich hoffe, dies ist für jemanden, der sich in der gleichen Situation befindet, hilfreich.

2voto

Chris Cudmore Punkte 28967

Sie bemerken das nur, weil Sie eine einzelne Spalte auswählen.

Versuchen Sie, zwei Felder auszuwählen und sehen Sie, was passiert.

Die Funktion "Gruppieren nach" ist für diese Art der Verwendung vorgesehen:

SELECT name, SUM(transaction) FROM myTbl GROUP BY name

Das würde die Summe aller Transaktionen für jede Person anzeigen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X