Ich habe neulich etwas Einfaches über SQL gelernt:
SELECT c FROM myTbl GROUP BY C
Hat das gleiche Ergebnis wie:
SELECT DISTINCT C FROM myTbl
Worauf ich neugierig bin, gibt es etwas anderes in der Art und Weise, wie eine SQL-Engine den Befehl verarbeitet, oder sind sie wirklich dasselbe?
Ich persönlich bevorzuge die unterschiedliche Syntax, aber ich bin mir sicher, dass dies eher aus Gewohnheit als aus irgendetwas anderem geschieht.
EDIT: Dies ist keine Frage zu Aggregaten. Die Verwendung GROUP BY
mit Aggregatfunktionen wird verstanden.
SELECT c FROM myTbl UNION SELECT c FROM myTbl
das gleiche Ergebnis erzielen ... Aber warum sollten Sie die Dinge komplizieren, wenn SELECT DISTINCT so einfach ist?GROUP BY
ist viel früher als 'SELECT' undDISTINCT
folgt select.DISTINCT
das Feld tatsächlich ausgewählt wird - dh der Wert wird in der Ergebnismenge angezeigt.GROUP BY
kann Duplikate effektiv entfernen, ohne das Feld tatsächlich auszuwählen. Dies ist in den meisten Fällen etwas irrelevant, könnte aber genau das sein, was Sie in anderen wollen. Wenn SieGROUP BY
anstelle von verwendenDISTINCT
, ist wahrscheinlich ein erläuternder Kommentar im Code gerechtfertigt.Antworten:
Die Antwort von MusiGenesis ist funktional die richtige in Bezug auf Ihre Frage, wie angegeben. Der SQL Server ist intelligent genug, um zu erkennen, dass Sie, wenn Sie "Gruppieren nach" verwenden und keine Aggregatfunktionen verwenden, "Distinct" meinen - und daher einen Ausführungsplan generieren, als ob Sie einfach "Distinct" verwendet hätten . "
Ich denke jedoch, dass es wichtig ist, auch Hanks Reaktion zu beachten - eine unbekümmerte Behandlung von "Group By" und "Distinct" könnte zu einigen schädlichen Fallstricken führen, wenn Sie nicht vorsichtig sind. Es ist nicht ganz richtig zu sagen, dass dies "keine Frage zu Aggregaten" ist, da Sie nach dem funktionalen Unterschied zwischen zwei SQL-Abfrageschlüsselwörtern fragen, von denen eines für Aggregate verwendet werden soll und eines nicht.
Ein Hammer kann manchmal funktionieren, um eine Schraube einzuschlagen, aber wenn Sie einen Schraubenzieher zur Hand haben, warum dann?
(für die Zwecke dieser Analogie
Hammer : Screwdriver :: GroupBy : Distinct
undscrew => get list of unique values in a table column
)quelle
GROUP BY
lassen Sie Aggregatfunktionen verwenden, wieAVG
,MAX
,MIN
,SUM
, undCOUNT
. Auf der anderen Seite werdenDISTINCT
nur Duplikate entfernt.Wenn Sie beispielsweise eine Reihe von Kaufunterlagen haben und wissen möchten, wie viel von jeder Abteilung ausgegeben wurde, können Sie Folgendes tun:
Dadurch erhalten Sie eine Zeile pro Abteilung, die den Abteilungsnamen und die Summe aller
amount
Werte in allen Zeilen für diese Abteilung enthält.quelle
DISTINCT
+ Aggregatfunktionen zu verwenden? wieselect distinct department, SUM(amount) from ...
Es gibt keinen Unterschied (zumindest in SQL Server). Beide Abfragen verwenden denselben Ausführungsplan.
http://sqlmag.com/database-performance-tuning/distinct-vs-group
Vielleicht gibt es einen Unterschied, wenn es sich um Unterabfragen handelt:
http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/
Es gibt keinen Unterschied (Oracle-Stil):
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:32961403234212
quelle
Was ist der Unterschied aus Sicht der Funktionalität zum Entfernen von Duplikaten?
Abgesehen von der Tatsache , dass im Gegensatz zu
DISTINCT
,GROUP BY
ermöglicht die Aggregation der Daten pro Gruppe (die von vielen anderen Antworten erwähnt wurde), der wichtigste Unterschied meiner Meinung nach ist die Tatsache , dass die beiden Operationen „passieren“ an zwei sehr unterschiedlichen Schritten in der logischen Reihenfolge von Operationen, die in einerSELECT
Anweisung ausgeführt werden .Hier sind die wichtigsten Operationen:
FROM
(einschließlichJOIN
,APPLY
usw.)WHERE
GROUP BY
(kann Duplikate entfernen)HAVING
SELECT
DISTINCT
(kann Duplikate entfernen)UNION
,INTERSECT
,EXCEPT
(Können Duplikate entfernen)ORDER BY
OFFSET
LIMIT
Wie Sie sehen können, beeinflusst die logische Reihenfolge jeder Operation, was damit gemacht werden kann und wie sie nachfolgende Operationen beeinflusst. Insbesondere bedeutet die Tatsache, dass die
GROUP BY
Operation "vor" derSELECT
Operation (der Projektion) stattfindet, dass:1. Es hängt nicht von der Projektion ab
Ein Beispiel, bei dem es nicht sinnvoll ist, von der Projektion abhängig zu sein, ist, wenn Sie Fensterfunktionen für bestimmte Werte berechnen möchten:
Wenn es mit der Sakila-Datenbank ausgeführt wird , ergibt dies:
Dasselbe konnte nicht einfach erreicht
DISTINCT
werden:Diese Abfrage ist "falsch" und ergibt so etwas wie:
Das wollten wir nicht. Die
DISTINCT
Operation "erfolgt nach" der Projektion, sodass wirDISTINCT
Bewertungen nicht mehr entfernen können, da die Fensterfunktion bereits berechnet und projiziert wurde. Um zu verwendenDISTINCT
, müssten wir diesen Teil der Abfrage verschachteln:Randnotiz: In diesem speziellen Fall könnten wir auch verwenden
DENSE_RANK()
2. Es können keine Werte aus der Projektion verwendet werden
Einer der Nachteile von SQL ist die zeitweise Ausführlichkeit. Aus dem gleichen Grund wie dem, was wir zuvor gesehen haben (nämlich der logischen Reihenfolge der Operationen), können wir nicht einfach nach etwas gruppieren, das wir projizieren.
Dies ist ungültiges SQL:
Dies ist gültig (Wiederholung des Ausdrucks)
Dies gilt auch (Verschachtelung des Ausdrucks)
Ich habe in einem Blog-Beitrag ausführlicher über dieses Thema geschrieben
quelle
WHERE
aber vielleichtGROUP BY
). Auf jeden Fall halte ich es für eine schlechte Idee und schlage vor, diese Funktion aus Gründen der Portabilität und Wartung niemals zu verwenden. "Plötzlich" funktioniert es nicht mehr, z. B. beim Aliasing einer Aggregat- oder Fensterfunktion.never using that feature for portability and maintenance reasons
!! stimmte zu 100% zu ... & ich schreibe jetzt auch Ihren Blog auf, großartige Arbeit. Prost.Verwenden
DISTINCT
Sie diese Option, wenn Sie nur Duplikate entfernen möchten. VerwendenGROUPY BY
Sie diese Option, wenn Sie Aggregatoperatoren anwenden möchten (MAX
,SUM
,GROUP_CONCAT
, ..., oder eineHAVING
Klausel).quelle
Ich gehe davon aus, dass die Möglichkeit subtiler Unterschiede in ihrer Ausführung besteht. Ich habe die Ausführungspläne in Oracle 10g auf zwei funktional äquivalente Abfragen in dieser Richtung überprüft:
Die mittlere Operation unterscheidet sich geringfügig: "HASH GROUP BY" vs. "HASH UNIQUE", aber die geschätzten Kosten usw. sind identisch. Ich habe diese dann mit aktivierter Ablaufverfolgung ausgeführt und die tatsächlichen Operationszahlen waren für beide gleich (außer dass der zweite aufgrund von Caching keine physischen Lesevorgänge durchführen musste).
Ich denke jedoch, dass die Ausführung, da die Operationsnamen unterschiedlich sind, etwas anderen Codepfaden folgen würde, was die Möglichkeit signifikanterer Unterschiede eröffnet.
Ich denke, Sie sollten zu diesem Zweck die DISTINCT-Syntax bevorzugen. Es ist nicht nur Gewohnheit, es zeigt deutlicher den Zweck der Abfrage an.
quelle
Für die von Ihnen gepostete Abfrage sind sie identisch. Aber für andere Fragen, die möglicherweise nicht zutreffen.
Zum Beispiel ist es nicht dasselbe wie:
quelle
Ich habe alle obigen Kommentare gelesen, aber außer dem Aggregationsbit hat niemand auf den Hauptunterschied zwischen Group By und Distinct hingewiesen.
Distinct gibt alle Zeilen zurück und dupliziert sie dann, während Group By die Zeilen de-dedupliziert, wenn sie einzeln vom Algorithmus gelesen werden.
Dies bedeutet, dass sie unterschiedliche Ergebnisse erzielen können!
Die folgenden Codes führen beispielsweise zu unterschiedlichen Ergebnissen:
Wenn die Tabelle 10 Namen enthält, von denen 1 ein Duplikat eines anderen ist, gibt die erste Abfrage 10 Zeilen zurück, während die zweite Abfrage 9 Zeilen zurückgibt.
Der Grund ist, was ich oben gesagt habe, damit sie sich anders verhalten können!
quelle
Name
, dass dasdistinct
Schlüsselwort, während Sie nur in der zweiten Abfrage gruppieren , sowohl für die SpaltenName
als auch für IhreROW_NUMBER()
Spalte in derselect
Klausel der ersten Abfrage gilt. Wenn Sie in der zweiten Abfrage auch nach der ersten Spalte gruppiert hätten, hätten die Abfragen dieselben Ergebnisse zurückgegeben.order of execution
von den SQL - Klauseln , die (im allgemeinen Sinne) sindFROM and ON (joins)
,WHERE
,GROUP BY
,HAVING
,SELECT
,DISTINCT
,ORDER BY
, ,LIMIT / OFFSET / TOP
so dass die zweite Abfrage , um die Namen , die von der Anzahl von Gruppen reduziert werden , und später die row_number () ist in einer Reihe angelegt resultierend pro eindeutigem Namen. In der ersten Abfrage wird row_number () angewendet, bevor die eindeutige Funktion angewendet wird. Aufgrund der Art der Funktion row_number () erhält jede Zeile eine eindeutige Ganzzahl. Daher wird jede Zeile zurückgegeben, auch wenn wiederholte Namenswerte vorhanden sind.Wenn Sie DISTINCT mit mehreren Spalten verwenden, wird die Ergebnismenge nicht wie bei GROUP BY gruppiert, und Sie können mit DISTINCT keine Aggregatfunktionen verwenden.
quelle
Sie haben unterschiedliche Semantiken, auch wenn sie zufällig äquivalente Ergebnisse für Ihre bestimmten Daten haben.
quelle
GROUP BY hat eine sehr spezifische Bedeutung, die sich von der DISTINCT-Funktion unterscheidet (heh).
GROUP BY bewirkt, dass die Abfrageergebnisse mit dem ausgewählten Ausdruck gruppiert werden. Anschließend können Aggregatfunktionen angewendet werden, die auf jede Gruppe und nicht auf die gesamte Ergebnismenge angewendet werden.
Hier ist ein Beispiel, das helfen könnte:
Bei einer Tabelle, die so aussieht:
Diese Abfrage:
Erzeugt eine Ausgabe wie folgt:
Was sich offensichtlich stark von der Verwendung von DISTINCT unterscheidet. Wenn Sie Ihre Ergebnisse gruppieren möchten, verwenden Sie GROUP BY. Wenn Sie nur eine eindeutige Liste einer bestimmten Spalte wünschen, verwenden Sie DISTINCT. Dies gibt Ihrer Datenbank die Möglichkeit, die Abfrage für Ihre Anforderungen zu optimieren.
quelle
Bitte verwenden Sie GROUP BY nicht, wenn Sie DISTINCT meinen, auch wenn sie zufällig gleich funktionieren. Ich gehe davon aus, dass Sie versuchen, Millisekunden von Abfragen zu sparen, und ich muss darauf hinweisen, dass die Entwicklerzeit um Größenordnungen teurer ist als die Computerzeit.
quelle
Wenn Sie ein GROUP BY ohne Aggregatfunktion verwenden, wird es intern als DISTINCT behandelt. In diesem Fall gibt es also keinen Unterschied zwischen GROUP BY und DISTINCT.
Wenn Sie jedoch eine DISTINCT-Klausel erhalten, sollten Sie diese besser zum Auffinden Ihrer eindeutigen Datensätze verwenden, da das Ziel von GROUP BY darin besteht, eine Aggregation zu erreichen.
quelle
group by wird in aggregierten Operationen verwendet - beispielsweise, wenn Sie eine Anzahl von Bs erhalten möchten, die nach Spalte C aufgeschlüsselt sind
Unterscheidbar ist, wie es sich anhört - Sie erhalten eindeutige Zeilen.
In SQL Server 2005 sieht es so aus, als ob der Abfrageoptimierer den Unterschied in den vereinfachten Beispielen, die ich ausgeführt habe, beseitigen kann. Keine Ahnung, ob Sie sich in allen Situationen darauf verlassen können.
quelle
In dieser speziellen Abfrage gibt es keinen Unterschied. Wenn Sie jedoch aggregierte Spalten hinzufügen, müssen Sie natürlich Gruppieren nach verwenden.
quelle
In Teradata-Perspektive :
Aus Sicht der Ergebnismenge spielt es keine Rolle, ob Sie in Teradata DISTINCT oder GROUP BY verwenden. Der Antwortsatz ist der gleiche.
Aus Sicht der Leistung ist es nicht dasselbe.
Um zu verstehen, was sich auf die Leistung auswirkt, müssen Sie wissen, was auf Teradata passiert, wenn Sie eine Anweisung mit DISTINCT oder GROUP BY ausführen.
Im Fall von DISTINCT werden die Zeilen sofort neu verteilt, ohne dass eine Vorabregulierung stattfindet, während im Fall von GROUP BY in einem ersten Schritt eine Vorabregulierung durchgeführt wird und erst dann die eindeutigen Werte über die AMPs neu verteilt werden.
Denken Sie jetzt nicht, dass GROUP BY aus Sicht der Leistung immer besser ist. Wenn Sie viele verschiedene Werte haben, ist der Voraggregationsschritt von GROUP BY nicht sehr effizient. Teradata muss die Daten sortieren, um Duplikate zu entfernen. In diesem Fall ist es möglicherweise besser, zuerst die Umverteilung vorzunehmen, dh die Anweisung DISTINCT zu verwenden. Nur wenn viele doppelte Werte vorhanden sind, ist die Anweisung GROUP BY wahrscheinlich die bessere Wahl, da der Deduplizierungsschritt erst nach der Umverteilung erfolgt.
Kurz gesagt bedeutet DISTINCT vs. GROUP BY in Teradata:
GROUP BY -> für viele Duplikate DISTINCT -> keine oder nur wenige Duplikate. Wenn Sie DISTINCT verwenden, geht Ihnen manchmal der Spool-Speicherplatz auf einem AMP aus. Der Grund dafür ist, dass die Umverteilung sofort erfolgt und das Versetzen dazu führen kann, dass AMPs nicht mehr genügend Platz haben.
In diesem Fall haben Sie mit GROUP BY wahrscheinlich eine bessere Chance, da Duplikate bereits in einem ersten Schritt entfernt werden und weniger Daten über die AMPs verschoben werden.
quelle
Teradata
?Aus der Perspektive von "SQL the language" sind die beiden Konstrukte gleichwertig und welches Sie wählen, ist eine dieser "Lifestyle" -Entscheidungen, die wir alle treffen müssen. Ich denke, es gibt einen guten Grund dafür, dass DISTINCT expliziter ist (und daher für die Person, die Ihren Code usw. erbt, rücksichtsvoller ist), aber das bedeutet nicht, dass das GROUP BY-Konstrukt eine ungültige Wahl ist.
Ich denke, diese "GROUP BY ist für Aggregate" ist die falsche Betonung. Die Leute sollten sich bewusst sein, dass die eingestellte Funktion (MAX, MIN, COUNT usw.) weggelassen werden kann, damit sie die Absicht des Codierers verstehen können, wenn dies der Fall ist.
Der ideale Optimierer erkennt äquivalente SQL-Konstrukte und wählt immer den idealen Plan entsprechend aus. Für Ihre echte SQL-Engine Ihrer Wahl müssen Sie testen :)
PS: Beachten Sie, dass die Position des Schlüsselworts DISTINCT in der select-Klausel zu unterschiedlichen Ergebnissen führen kann, z. B. Kontrast:
quelle
Sie bemerken das nur, weil Sie eine einzelne Spalte auswählen.
Wählen Sie zwei Felder aus und sehen Sie, was passiert.
Group By soll wie folgt verwendet werden:
Welches würde die Summe aller Transaktionen für jede Person anzeigen.
quelle
Ich weiß, dass es ein alter Beitrag ist. Aber es kommt vor, dass ich eine Abfrage hatte, bei der nur Gruppen verwendet wurden, um unterschiedliche Werte zurückzugeben, wenn diese Abfrage in Kröten- und Orakelberichten verwendet wurde. Alles hat gut funktioniert. Ich meine eine gute Antwortzeit. Bei der Migration von Oracle 9i auf 11g war die Antwortzeit in Toad ausgezeichnet, aber im Bericht dauerte es ungefähr 35 Minuten, um den Bericht fertigzustellen, wenn die vorherige Version verwendet wurde, dauerte es ungefähr 5 Minuten.
Die Lösung bestand darin, die Gruppe durch DISTINCT zu ändern und zu verwenden. Jetzt wird der Bericht in etwa 30 Sekunden ausgeführt.
Ich hoffe, dass dies für jemanden mit der gleichen Situation nützlich ist.
quelle
In Bezug auf die Verwendung wird GROUP BY zum Gruppieren der Zeilen verwendet, die Sie berechnen möchten. DISTINCT führt keine Berechnung durch. Es werden keine doppelten Zeilen angezeigt.
Ich habe immer DISTINCT verwendet, wenn ich Daten ohne Duplikate präsentieren möchte.
Wenn ich Berechnungen wie das Aufsummieren der Gesamtmenge an Mangos durchführen möchte, verwende ich GROUP BY
quelle
Ich habe es immer so verstanden, dass die Verwendung von "Unterschiedlich" der Gruppierung nach jedem Feld entspricht, das Sie in der Reihenfolge ausgewählt haben, in der Sie sie ausgewählt haben.
dh:
ist das gleiche wie:
quelle
Die funktionale Effizienz ist völlig anders. Wenn Sie nur "Rückgabewert" außer dem doppelten auswählen möchten, ist die Verwendung von "Unterschied" besser als "Gruppieren nach". Da "gruppieren nach" einschließen (Sortieren + Entfernen), "unterscheiden" einschließen (Entfernen)
quelle
In Hive (HQL) kann die Gruppierung nach viel schneller als eindeutig sein, da für erstere nicht alle Felder in der Tabelle verglichen werden müssen. Siehe https://sqlperformance.com/2017/01/t-sql-queries/surprises-assumptions-group-by-distinct .
quelle
Manchmal liefern sie die gleichen Ergebnisse, aber sie sollen in einem anderen Sinne / Fall verwendet werden. Der Hauptunterschied liegt in der Syntax.
Beachten Sie das folgende Beispiel genau.
DISTINCT
wird verwendet, um den doppelten Wertesatz herauszufiltern. (6, cs, 9.1) und (1, cs, 5.5) sind zwei verschiedene Mengen. Es werden alsoDISTINCT
beide Zeilen angezeigt, währendGROUP BY Branch
nur ein Satz angezeigt wird.Manchmal
GROUP BY
ist es nicht möglich, die Ergebnisse zu erzielen, die mit Klausel erzielt werden könnenDISTINCT
ohne eine zusätzliche Klausel oder Bedingungen zu verwenden. ZB im obigen Fall.Um das gleiche Ergebnis zu
DISTINCT
erzielen, müssen Sie alle Spaltennamen in der folgendenGROUP BY
Klausel übergeben. Sehen Sie sich also den syntaktischen Unterschied an. Sie müssen Kenntnisse über alle Spaltennamen haben, umGROUP BY
in diesem Fall die Klausel verwenden zu können.Außerdem habe ich festgestellt, dass
GROUP BY
die Ergebnisse standardmäßig in aufsteigender Reihenfolge angezeigt werden, wasDISTINCT
nicht der Fall ist. Da bin ich mir aber nicht sicher. Dies kann vom Hersteller abweichen.Quelle: https://dbjpanda.me/dbms/languages/sql/sql-syntax-with-examples#group-by
quelle
Im Allgemeinen können wir
DISTINCT
die Duplikate für bestimmte Spalten in der Tabelle entfernen.Beispiel:
quelle
Es gibt keinen signifikanten Unterschied zwischen Gruppierungsklausel und eindeutiger Klausel mit Ausnahme der Verwendung von Aggregatfunktionen. Beide können verwendet werden, um die Werte zu unterscheiden, aber wenn aus Sicht der Leistung die Gruppierung nach besser ist. Wenn ein bestimmtes Schlüsselwort verwendet wird, wird intern eine Sortieroperation verwendet, die im Ausführungsplan angezeigt werden kann.
Versuchen Sie es mit einem einfachen Beispiel
Deklarieren Sie die @ tmpresult-Tabelle (Id tinyint)
In @tmpresult einfügen Wählen Sie 5 Union all Select 2 Union all Select 3 Union all Select 4
Wählen Sie eine eindeutige ID aus @tmpresult
quelle