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.

23voto

Dave Costa Punkte 45801

Ich gehe davon aus, dass es feine Unterschiede in der Ausführung geben kann. Ich habe die Ausführungspläne für zwei funktional gleichwertige Abfragen dieser Art in Oracle 10g überprüft:

core> select sta from zip group by sta;

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    58 |   174 |    44  (19)| 00:00:01 |
|   1 |  HASH GROUP BY     |      |    58 |   174 |    44  (19)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| ZIP  | 42303 |   123K|    38   (6)| 00:00:01 |
---------------------------------------------------------------------------

core> select distinct sta from zip;

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    58 |   174 |    44  (19)| 00:00:01 |
|   1 |  HASH UNIQUE       |      |    58 |   174 |    44  (19)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| ZIP  | 42303 |   123K|    38   (6)| 00:00:01 |
---------------------------------------------------------------------------

Die mittlere Operation ist etwas anders: "HASH GROUP BY" vs. "HASH UNIQUE", aber die geschätzten Kosten usw. sind identisch. Ich habe die beiden Operationen dann mit aktivierter Ablaufverfolgung ausgeführt, und die tatsächliche Anzahl der Operationen war bei beiden gleich (mit der Ausnahme, dass bei der zweiten Operation aufgrund der Zwischenspeicherung keine physischen Lesevorgänge durchgeführt werden mussten).

Aber ich denke, da die Namen der Operationen unterschiedlich sind, würde die Ausführung etwas anderen Codepfaden folgen, und das eröffnet die Möglichkeit größerer Unterschiede.

Ich denke, Sie sollten die DISTINCT-Syntax für diesen Zweck bevorzugen. Das ist nicht nur Gewohnheit, sondern zeigt auch den Zweck der Abfrage deutlicher an.

15voto

Joel Coehoorn Punkte 377088

Für die von Ihnen gestellte Anfrage sind sie identisch. Für andere Abfragen trifft das aber möglicherweise nicht zu.

Es ist zum Beispiel nicht dasselbe wie:

SELECT C FROM myTbl GROUP BY C, D

14voto

The Light Punkte 25263

Ich habe alle obigen Kommentare gelesen, aber ich habe nicht gesehen, dass jemand auf den Hauptunterschied zwischen Group By und Distinct hingewiesen hat, abgesehen von der Aggregation.

Distinct gibt alle Zeilen zurück und de-dedupliziert sie dann, während Group By die Zeilen de-dedupliziert, wenn sie vom Algorithmus einzeln gelesen werden.

Das bedeutet, dass sie zu unterschiedlichen Ergebnissen führen können!

Die folgenden Codes erzeugen beispielsweise unterschiedliche Ergebnisse:

SELECT distinct ROW_NUMBER() OVER (ORDER BY Name), Name FROM NamesTable

 SELECT ROW_NUMBER() OVER (ORDER BY Name), Name FROM NamesTable
GROUP BY Name

Wenn es 10 Namen in der Tabelle gibt, von denen einer ein Duplikat eines anderen ist, dann gibt die erste Abfrage 10 Zeilen zurück, während die zweite Abfrage 9 Zeilen zurückgibt.

Der Grund ist das, was ich oben sagte, damit sie sich anders verhalten können!

12voto

Bill the Lizard Punkte 384619

Wenn Sie DISTINCT mit mehreren Spalten verwenden, wird die Ergebnismenge nicht gruppiert, wie es bei GROUP BY der Fall ist, und Sie können keine Aggregatfunktionen mit DISTINCT verwenden.

7voto

Dan Punkte 58216

GROUP BY hat eine ganz bestimmte Bedeutung, die sich von der Funktion DISTINCT unterscheidet.

GROUP BY bewirkt, dass die Abfrageergebnisse anhand des gewählten Ausdrucks gruppiert werden. Anschließend können Aggregatfunktionen angewendet werden, die auf jede Gruppe und nicht auf die gesamte Ergebnismenge wirken.

Hier ist ein Beispiel, das Ihnen helfen könnte:

Gegeben eine Tabelle, die wie folgt aussieht:

name
------
barry
dave
bill
dave
dave
barry
john

Diese Abfrage:

SELECT name, count(*) AS count FROM table GROUP BY name;

ergibt eine Ausgabe wie diese:

name    count
-------------
barry   2
dave    3
bill    1
john    1

Das ist natürlich etwas ganz anderes als die Verwendung von DISTINCT. Wenn Sie Ihre Ergebnisse gruppieren wollen, verwenden Sie GROUP BY, wenn Sie nur eine eindeutige Liste einer bestimmten Spalte wollen, verwenden Sie DISTINCT. Dies gibt Ihrer Datenbank die Möglichkeit, die Abfrage für Ihre Bedürfnisse zu optimieren.

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