Nauczyłem się czegoś prostego o SQL:
SELECT c FROM myTbl GROUP BY C
Ma taki sam wynik jak:
SELECT DISTINCT C FROM myTbl
Zastanawiam się, czy jest coś innego w sposobie przetwarzania polecenia przez silnik SQL, czy naprawdę są tym samym?
Ja osobiście wolę wyraźną składnię, ale jestem pewien, że jest to bardziej nawyk niż cokolwiek innego.
EDYCJA: To nie jest pytanie o agregaty. Zastosowanie GROUP BY
funkcji agregujących jest zrozumiałe.
SELECT c FROM myTbl UNION SELECT c FROM myTbl
i uzyskać ten sam wynik ... Ale po co komplikować, skoro SELECT DISTINCT jest tak łatwy.GROUP BY
jest znacznie wcześniejsza niż „WYBIERZ” iDISTINCT
następuje po wybraniu.DISTINCT
faktyczny wybór pola - tzn. Wartość pojawi się w zestawie wyników.GROUP BY
może skutecznie usuwać duplikaty bez faktycznego wybierania pola. Jest to nieco nieistotne w większości przypadków, ale może być dokładnie tym, czego chcesz w innych. JeśliGROUP BY
zamiast tego użyjeszDISTINCT
komentarza, kod wyjaśniający jest prawdopodobnie uzasadniony.Odpowiedzi:
Jak podano , odpowiedź MusiGenesis jest funkcjonalnie poprawna w odniesieniu do twojego pytania; SQL Server jest wystarczająco inteligentny, aby zdać sobie sprawę, że jeśli używasz „Grupuj według” i nie używasz żadnych funkcji agregujących, to tak naprawdę masz na myśli „Wyraźny” - i dlatego generuje plan wykonania, jakbyś po prostu użył „Wyróżniającego” . ”
Myślę jednak, że ważne jest, aby zauważyć również odpowiedź Hanka - kawalerskie traktowanie „Group By” i „Distinct” może prowadzić do pewnych zgubnych problemów, jeśli nie będziesz ostrożny. Nie jest całkowicie poprawne stwierdzenie, że nie jest to „pytanie o agregaty”, ponieważ pytasz o różnicę funkcjonalną między dwoma słowami kluczowymi zapytania SQL, z których jedno ma być używane z agregacjami, a jedno nie.
Czasami młotek może wbić śrubę, ale jeśli masz pod ręką śrubokręt, po co zawracać sobie głowę?
(dla celów tej analogii
Hammer : Screwdriver :: GroupBy : Distinct
iscrew => get list of unique values in a table column
)źródło
GROUP BY
pozwala na korzystanie z funkcji agregujących, takich jakAVG
,MAX
,MIN
,SUM
, iCOUNT
. Z drugiej stronyDISTINCT
po prostu usuwa duplikaty.Na przykład, jeśli masz wiele rekordów zakupów i chcesz wiedzieć, ile wydał każdy dział, możesz zrobić coś takiego:
Otrzymasz jeden wiersz na dział zawierający nazwę działu i sumę wszystkich
amount
wartości we wszystkich wierszach dla tego działu.źródło
DISTINCT
+ funkcji agregujących? jak to:select distinct department, SUM(amount) from ...
Nie ma różnicy (przynajmniej w SQL Server). Oba zapytania wykorzystują ten sam plan wykonania.
http://sqlmag.com/database-performance-tuning/distinct-vs-group
Może nie ma różnicy, czy są sub-zapytań zaangażować:
http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/
Nie ma różnicy (w stylu Oracle):
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:32961403234212
źródło
Jaka jest różnica z punktu widzenia zwykłej funkcjonalności usuwania duplikatów
Oprócz tego, że w przeciwieństwie do
DISTINCT
,GROUP BY
pozwala na agregowanie danych na grupę (o czym wspomniało wiele innych odpowiedzi), najważniejszą różnicą moim zdaniem jest fakt, że dwie operacje „zdarzają się” na dwóch bardzo różnych etapach w kolejności logicznej operacji wykonywanych wSELECT
instrukcji .Oto najważniejsze operacje:
FROM
(w tymJOIN
,APPLY
etc.)WHERE
GROUP BY
(może usunąć duplikaty)HAVING
SELECT
DISTINCT
(może usunąć duplikaty)UNION
,INTERSECT
,EXCEPT
(Można usunąć duplikaty)ORDER BY
OFFSET
LIMIT
Jak widać, logiczna kolejność każdej operacji wpływa na to, co można z nią zrobić i jak wpływa na kolejne operacje. W szczególności, fakt, że
GROUP BY
działanie zachodzi „przed”, wSELECT
pracy (projekcja) oznacza, że:1. To nie zależy od projekcji
Przykładem, w którym nie jest zależne od rzutowania, jest użyteczny, jeśli chcesz obliczyć funkcje okna dla różnych wartości:
Po uruchomieniu z bazą danych Sakila daje to:
Tego samego nie da się
DISTINCT
łatwo osiągnąć :To zapytanie jest „nieprawidłowe” i daje coś takiego:
Nie tego chcieliśmy.
DISTINCT
Operacja „dzieje się po” projekcji, więc nie możemy już usunąćDISTINCT
ocen, ponieważ funkcja okno zostało już obliczone i prognozowanych. Aby użyćDISTINCT
, musielibyśmy zagnieździć tę część zapytania:Uwaga dodatkowa: W tym konkretnym przypadku moglibyśmy również użyć
DENSE_RANK()
2. Nie można użyć żadnych wartości z rzutu
Jedną z wad SQL jest czasami jego gadatliwość. Z tego samego powodu, co widzieliśmy wcześniej (mianowicie logicznej kolejności operacji), nie możemy „łatwo” pogrupować według czegoś, co projektujemy.
To jest nieprawidłowy SQL:
Jest to poprawne (powtarzanie wyrażenia)
Jest to również poprawne (zagnieżdżanie wyrażenia)
Bardziej szczegółowo napisałem na ten temat w poście na blogu
źródło
WHERE
ale być możeGROUP BY
). W każdym razie uważam, że to zły pomysł i sugeruję, aby nigdy nie używać tej funkcji ze względu na przenośność i konserwację. „Nagle” przestanie działać, np. Podczas aliacji funkcji agregującej lub funkcji okna.never using that feature for portability and maintenance reasons
!! zgodziłem się w 100% ... i teraz również cieszę się z twojego bloga, świetna robota. Twoje zdrowie.Użyj,
DISTINCT
jeśli chcesz usunąć duplikaty. UżyjGROUPY BY
, jeśli chcesz zastosować operatory kruszywa (MAX
,SUM
,GROUP_CONCAT
, ..., czyHAVING
klauzula).źródło
Oczekuję, że istnieje możliwość subtelnych różnic w ich wykonaniu. Sprawdziłem plany wykonania dla dwóch funkcjonalnie równoważnych zapytań wzdłuż tych linii w Oracle 10g:
Środkowa operacja jest nieco inna: „HASH GROUP BY” vs. „HASH UNIQUE”, ale szacowane koszty itp. Są identyczne. Następnie wykonałem je z włączonym śledzeniem, a faktyczne liczby operacji były takie same dla obu (z wyjątkiem tego, że drugi nie musiał wykonywać żadnych fizycznych odczytów z powodu buforowania).
Sądzę jednak, że ponieważ nazwy operacji są różne, wykonanie podążyłoby nieco innymi ścieżkami kodu, co otwiera możliwość poważniejszych różnic.
Myślę, że powinieneś w tym celu preferować składnię DISTINCT. To nie tylko nawyk, ale wyraźniej wskazuje cel zapytania.
źródło
W przypadku wysłanego zapytania są one identyczne. Ale w przypadku innych zapytań może to nie być prawda.
Na przykład to nie to samo, co:
źródło
Przeczytałem wszystkie powyższe komentarze, ale nie widziałem, aby ktokolwiek wskazywał na główną różnicę między Group By a Distinct oprócz bitu agregacji.
Distinct zwraca wszystkie wiersze, a następnie usuwa duplikaty, podczas gdy Group By usuwa deduplikację wierszy, gdy są one odczytywane przez algorytm jeden po drugim.
Oznacza to, że mogą wytwarzać różne wyniki!
Na przykład poniższe kody generują różne wyniki:
Jeśli w tabeli znajduje się 10 nazw, z których 1 jest duplikatem innej, pierwsze zapytanie zwraca 10 wierszy, a drugie zapytanie zwraca 9 wierszy.
Powodem jest to, co powiedziałem powyżej, aby mogli zachowywać się inaczej!
źródło
Name
drugiego zapytania,distinct
słowo kluczowe dotyczy zarówno kolumn, jakName
iROW_NUMBER()
kolumny wselect
klauzuli pierwszego zapytania. Gdyby również pogrupowano według pierwszej kolumny w drugim zapytaniu, zapytania zwróciłyby te same wyniki.order of execution
klauzul SQL jest (w ogólnym tego słowa znaczeniu)FROM and ON (joins)
,WHERE
,GROUP BY
,HAVING
,SELECT
,DISTINCT
,ORDER BY
,LIMIT / OFFSET / TOP
tak, że drugi zapytania nazwy są redukowane w liczbie od grupy, a później ROW_NUMBER () stosuje otrzymany w jednym rzędzie według unikalnej nazwy. W pierwszym zapytaniu wiersz_numer () jest stosowany przed zastosowaniem odrębnego, a ze względu na charakter funkcji row_number () każdy wiersz otrzymuje unikalną liczbę całkowitą, dlatego każdy wiersz jest zwracany, nawet jeśli występują powtarzające się wartości nazw.Jeśli użyjesz DISTINCT z wieloma kolumnami, zestaw wyników nie zostanie pogrupowany tak, jak w przypadku GROUP BY i nie możesz używać funkcji agregujących z DISTINCT.
źródło
Mają różną semantykę, nawet jeśli zdarzają się, że mają równoważne wyniki w twoich danych.
źródło
GROUP BY ma bardzo specyficzne znaczenie, które różni się (heh) od funkcji DISTINCT.
GROUP BY powoduje grupowanie wyników zapytania przy użyciu wybranego wyrażenia, wówczas można zastosować funkcje agregujące, które będą działać na każdej grupie, a nie na całym zestawie wyników.
Oto przykład, który może pomóc:
Biorąc pod uwagę tabelę, która wygląda następująco:
To zapytanie:
Wyprodukuje takie wyniki:
Co oczywiście różni się bardzo od używania DISTINCT. Jeśli chcesz pogrupować wyniki, użyj GROUP BY, jeśli chcesz tylko unikalną listę określonej kolumny, użyj DISTINCT. Dzięki temu Twoja baza danych będzie mogła zoptymalizować zapytanie pod kątem Twoich potrzeb.
źródło
Nie używaj GROUP BY, jeśli masz na myśli DISTINCT, nawet jeśli działają tak samo. Zakładam, że próbujesz zaoszczędzić milisekundy na zapytaniach i muszę zauważyć, że czas programisty jest o rząd wielkości większy niż czas komputerowy.
źródło
Jeśli używasz GROUP BY bez żadnej funkcji agregującej, to wewnętrznie będzie traktowane jako DISTINCT, więc w tym przypadku nie ma różnicy między GROUP BY i DISTINCT.
Ale kiedy otrzymasz klauzulę DISTINCT, lepiej użyj jej do znalezienia unikalnych rekordów, ponieważ celem GROUP BY jest osiągnięcie agregacji.
źródło
Grupowanie według jest używane w operacjach agregujących - na przykład gdy chcesz uzyskać liczbę Bs w podziale według kolumny C.
Wyraźnie to brzmi - otrzymujesz unikalne wiersze.
W SQL Server 2005 wygląda na to, że optymalizator zapytań jest w stanie zoptymalizować różnicę w uproszczonych przykładach, które uruchomiłem. Nie wiem, czy możesz na to liczyć we wszystkich sytuacjach.
źródło
W tym konkretnym zapytaniu nie ma różnicy. Ale oczywiście, jeśli dodasz jakieś kolumny agregujące, będziesz musiał użyć grupowania według.
źródło
W perspektywie Teradata :
Z punktu widzenia zestawu wyników nie ma znaczenia, czy użyjesz DISTINCT lub GROUP BY w Teradata. Zestaw odpowiedzi będzie taki sam.
Z punktu widzenia wydajności to nie to samo.
Aby zrozumieć, co wpływa na wydajność, musisz wiedzieć, co dzieje się na Teradata podczas wykonywania instrukcji za pomocą DISTINCT lub GROUP BY.
W przypadku DISTINCT wiersze są redystrybuowane natychmiast, bez konieczności przeprowadzania wstępnej agregacji, podczas gdy w przypadku GROUP BY, w pierwszym etapie przeprowadzana jest wstępna agregacja, a dopiero potem unikalne wartości są redystrybuowane między AMP.
Nie myśl teraz, że GROUP BY jest zawsze lepszy z punktu widzenia wydajności. Jeśli masz wiele różnych wartości, krok wstępnej agregacji GROUP BY nie jest zbyt wydajny. Teradata musi sortować dane, aby usunąć duplikaty. W takim przypadku lepiej może być najpierw redystrybucja, tzn. Użyj instrukcji DISTINCT. Tylko jeśli istnieje wiele zduplikowanych wartości, instrukcja GROUP BY jest prawdopodobnie lepszym wyborem, ponieważ tylko wtedy, gdy ma miejsce krok deduplikacji, po redystrybucji.
W skrócie, DISTINCT vs. GROUP BY w Teradata oznacza:
GRUPUJ WEDŁUG -> dla wielu duplikatów ODRÓŻNIJ -> brak lub tylko kilka duplikatów. Czasami, gdy używasz DISTINCT, zabrakło miejsca na buforze w AMP. Powodem jest to, że redystrybucja odbywa się natychmiast, a przekrzywienie może spowodować brak miejsca w AMP.
Jeśli tak się stanie, prawdopodobnie masz większą szansę na GROUP BY, ponieważ duplikaty są już usuwane w pierwszym kroku, a mniej danych jest przenoszonych między AMP.
źródło
Teradata
?Z punktu widzenia „języka SQL” obie konstrukcje są równoważne i który wybierzesz, jest jednym z wyborów „stylu życia”, które wszyscy musimy podjąć. Myślę, że jest dobry argument, aby DISTINCT był bardziej wyraźny (i dlatego jest bardziej rozważny dla osoby, która odziedziczy twój kod itp.), Ale to nie znaczy, że konstrukcja GROUP BY jest nieprawidłowym wyborem.
Myślę, że to „GROUP BY jest dla agregatów” jest niewłaściwe. Folk powinien być świadomy, że ustawioną funkcję (MAKS, MIN, LICZBA, itp.) Można pominąć, aby mogli zrozumieć zamiary kodera, gdy jest.
Idealny optymalizator rozpozna równoważne konstrukcje SQL i zawsze odpowiednio wybierze idealny plan. Aby wybrać rzeczywisty silnik SQL, musisz przetestować :)
PS zauważ, że pozycja słowa kluczowego DISTINCT w klauzuli select może dawać różne wyniki, np. Kontrast:
źródło
Zauważasz to tylko dlatego, że wybierasz jedną kolumnę.
Spróbuj wybrać dwa pola i zobacz, co się stanie.
Group By jest przeznaczony do użycia w następujący sposób:
Który pokazywałby sumę wszystkich transakcji dla każdej osoby.
źródło
Wiem, że to stary post. Ale zdarza się, że miałem zapytanie, które wykorzystywało grupę tylko po to, aby zwrócić różne wartości podczas używania tego zapytania w raportach ropuchy i wyroczni wszystko działało dobrze, mam na myśli dobry czas odpowiedzi. Kiedy przeprowadziliśmy migrację z Oracle 9i do 11g, czas reakcji w Toad był doskonały, ale w raporcie ukończenie raportu zajęło około 35 minut przy użyciu poprzedniej wersji około 5 minut.
Rozwiązaniem było zmienić grupę i użyć DISTINCT, a teraz raport jest uruchamiany za około 30 sekund.
Mam nadzieję, że jest to przydatne dla kogoś w tej samej sytuacji.
źródło
Jeśli chodzi o użycie, GROUP BY służy do grupowania wierszy, które chcesz obliczyć. DISTINCT nie wykona żadnych obliczeń. Nie będzie pokazywał duplikatów wierszy.
Zawsze użyłem DISTINCT, jeśli chcę prezentować dane bez duplikatów.
Jeśli chcę wykonać obliczenia, takie jak sumowanie całkowitej ilości mango, skorzystam z GROUP BY
źródło
Zawsze rozumiałem, że użycie odróżnienia jest takie samo jak grupowanie według każdego pola, które wybrałeś w kolejności, w jakiej je wybrałeś.
to znaczy:
jest taki sam jak:
źródło
Wydajność funkcjonalna jest zupełnie inna. Jeśli chcesz wybrać tylko „wartość zwracaną” oprócz zduplikowanej, użyj odrębnego jest lepsze niż grupowanie według. Ponieważ „grupuj według” obejmuje (sortowanie + usuwanie), „odrębne” obejmuje (usuwanie)
źródło
W gałęzi (HQL) grupowanie według może być znacznie szybsze niż rozróżnianie, ponieważ ten pierwszy nie wymaga porównywania wszystkich pól w tabeli. Zobacz https://sqlperformance.com/2017/01/t-sql-queries/surprises-assumptions-group-by-distinct .
źródło
Czasami mogą dać te same wyniki, ale mają być stosowane w innym znaczeniu / przypadku. Główną różnicą jest składnia.
Zwróć uwagę na poniższy przykład.
DISTINCT
służy do odfiltrowania zduplikowanego zestawu wartości. (6, cs, 9.1) i (1, cs, 5.5) to dwa różne zestawy. TakDISTINCT
się dzieje, aby wyświetlić oba wiersze natomiastGROUP BY Branch
będzie wyświetlać tylko jeden zestaw.Czasami wyniki, które można osiągnąć za pomocą
GROUP BY
klauzuli, nie są możliwe do osiągnięciaDISTINCT
bez zastosowania dodatkowej klauzuli lub warunków. Np. W powyższym przypadku.Aby uzyskać taki sam wynik, jak
DISTINCT
trzeba przekazać wszystkie nazwy kolumn wGROUP BY
klauzuli jak poniżej. Zobacz różnicę składni. Musisz mieć wiedzę na temat wszystkich nazw kolumn, aby użyćGROUP BY
klauzuli w takim przypadku.Zauważyłem również, że
GROUP BY
domyślnie wyświetla wyniki w kolejności rosnącej, coDISTINCT
nie. Ale nie jestem tego pewien. Może się różnić od dostawcy.Źródło: https://dbjpanda.me/dbms/languages/sql/sql-syntax-with-examples#group-by
źródło
Zasadniczo możemy użyć
DISTINCT
do wyeliminowania duplikatów w określonej kolumnie w tabeli.Przykład:
źródło
Nie ma istotnej różnicy między klauzulami grupującymi i odrębnymi, z wyjątkiem użycia funkcji agregujących. Oba można wykorzystać do rozróżnienia wartości, ale jeśli z punktu widzenia wydajności grupa jest lepsza. Gdy używane jest odrębne słowo kluczowe, wewnętrznie korzystano z operacji sortowania, którą można wyświetlić w planie wykonania.
Spróbuj prostego przykładu
Deklaracja tabeli @tmpresult (Id tinyint)
Wstaw do @tmpresult Wybierz 5 Połącz wszystkie Wybierz 2 Połącz wszystkie Wybierz 3 Połącz wszystkie Wybierz 4
Wybierz odrębny identyfikator z @tmpresult
źródło