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.

2voto

John Jiang Punkte 262

In Hive (HQL), GROUP BY kann viel schneller sein als DISTINCT da bei der ersten Variante nicht alle Felder der Tabelle verglichen werden müssen.

Siehe: https://sqlperformance.com/2017/01/t-sql-queries/surprises-assumptions-group-by-distinct .

2voto

SkyRar Punkte 869

Manchmal können sie zu den gleichen Ergebnissen führen, aber sie sind für unterschiedliche Zwecke/Fälle gedacht. Der Hauptunterschied liegt in der Syntax.

Beachten Sie das folgende Beispiel genau. DISTINCT wird verwendet, um die doppelte Menge von Werten herauszufiltern. (6, cs, 9.1) und (1, cs, 5.5) sind zwei verschiedene Gruppen. Also DISTINCT wird die beiden Zeilen anzeigen, während GROUP BY Branch wird nur einen Satz anzeigen.

 SELECT * FROM student; 
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    3 | civil  |  7.2 |
|    2 | mech   |  6.3 |
|    6 | cs     |  9.1 |
|    4 | eee    |  8.2 |
|    1 | cs     |  5.5 |
+------+--------+------+
5 rows in set (0.001 sec)

SELECT DISTINCT * FROM student; 
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    3 | civil  |  7.2 |
|    2 | mech   |  6.3 |
|    6 | cs     |  9.1 |
|    4 | eee    |  8.2 |
|    1 | cs     |  5.5 |
+------+--------+------+
5 rows in set (0.001 sec)

SELECT * FROM student GROUP BY Branch;
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    3 | civil  |  7.2 |
|    6 | cs     |  9.1 |
|    4 | eee    |  8.2 |
|    2 | mech   |  6.3 |
+------+--------+------+
4 rows in set (0.001 sec)

Manchmal können die Ergebnisse, die durch GROUP BY Klausel kann nicht erreicht werden durch DISTINCT ohne eine zusätzliche Klausel oder Bedingungen zu verwenden. Z.B. im obigen Fall.

Um das gleiche Ergebnis zu erzielen wie DISTINCT müssen Sie alle Spaltennamen in GROUP BY Klausel wie unten. Sie sehen also den syntaktischen Unterschied. Sie müssen alle Spaltennamen kennen, um sie zu verwenden GROUP BY Klausel in diesem Fall.

SELECT * FROM student GROUP BY Id, Branch, CGPA;
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    1 | cs     |  5.5 |
|    2 | mech   |  6.3 |
|    3 | civil  |  7.2 |
|    4 | eee    |  8.2 |
|    6 | cs     |  9.1 |
+------+--------+------+

Außerdem habe ich festgestellt GROUP BY zeigt die Ergebnisse standardmäßig in aufsteigender Reihenfolge an. DISTINCT nicht. Aber ich bin mir da nicht sicher. Es kann sein, dass sich die Anbieter unterscheiden.

Quelle: https://dbjpanda.me/dbms/languages/sql/sql-syntax-with-examples#group-by

0voto

Zenshai Punkte 9707

Ich habe es immer so verstanden, dass die Verwendung von "distinct" dasselbe ist wie die Gruppierung nach jedem ausgewählten Feld in der Reihenfolge, in der Sie es ausgewählt haben.

d.h:

select distinct a, b, c from table;

ist dasselbe wie:

select a, b, c from table group by a, b, c

0voto

Jun Punkte 11

Die funktionale Effizienz ist völlig unterschiedlich. Wenn Sie nur "Rückgabewerte" mit Ausnahme von Duplikaten auswählen möchten, ist die Verwendung von distinct besser als die von group by. Denn "group by" beinhaltet ( Sortieren + Entfernen ), "distinct" beinhaltet ( Entfernen )

0voto

Lova Chittumuri Punkte 2347

Im Allgemeinen können wir verwenden DISTINCT um die Duplikate in einer bestimmten Spalte der Tabelle zu eliminieren.

Im Falle von 'GROUP BY' können wir die Aggregationsfunktionen anwenden wie AVG , MAX , MIN , SUM et COUNT auf Specific column und holt den Spaltennamen und das Ergebnis der Aggregationsfunktion für dieselbe Spalte.

Beispiel:

select  specialColumn,sum(specialColumn) from yourTableName group by specialColumn;

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