Problem:
Twoja tabela zawiera zduplikowane wiersze, a unikalne są tylko identyfikatory. Jak znaleźć te zduplikowane wpisy?
Przykład:
Nasza baza danych zawiera tabelę o nazwie product
z danymi w następujących kolumnach:id
, name
i category
.
id | imię | kategoria |
---|---|---|
1 | stek | mięso |
2 | ciasto | słodycze |
3 | d>stek | mięso |
4 | wieprzowina | mięso |
5 | ciasto | słodycze |
6 | ciasto | słodycze |
Znajdźmy zduplikowane nazwy i kategorie produktów. Duplikaty można znaleźć, grupując wiersze za pomocą COUNT
funkcja agregująca i określenie HAVING
klauzula, za pomocą której filtrować wiersze.
Rozwiązanie:
SELECT name, category, FROM product GROUP BY name, category HAVING COUNT(id) >1;
To zapytanie zwraca tylko zduplikowane rekordy — te, które mają tę samą nazwę produktu i kategorię:
nazwa | kategoria |
---|---|
stek | mięso |
ciasto | słodycze |
W naszej tabeli znajdują się dwa duplikaty produktów:stek z kategorii mięso i ciasto z kategorii słodycze. Pierwszy produkt jest powtarzany w tabeli dwa razy, a drugi pojawia się trzy razy.
Dyskusja:
Aby wybrać zduplikowane wartości, musisz utworzyć grupy wierszy o tych samych wartościach, a następnie wybrać grupy o liczbie większej niż jeden. Możesz to osiągnąć, używając GROUP BY
i HAVING
klauzula.
Pierwszym krokiem jest utworzenie grup rekordów z tymi samymi wartościami we wszystkich kolumnach niebędących identyfikatorami (w naszym przykładzie name
i category
). Robisz to za pomocą GROUP BY
klauzula. Po GROUP BY
słowo kluczowe, umieszczasz nazwy kolumn, których chcesz użyć do grupowania. Wykluczamy id
kolumna, ponieważ jest to klucz podstawowy naszej tabeli; z definicji każdy wiersz będzie miał inną wartość w tej kolumnie. Gdybyśmy go uwzględnili, nie bylibyśmy w stanie wykryć duplikatów!
Chcemy znaleźć grupy z więcej niż jednym wierszem; takie grupy muszą z definicji zawierać duplikat, o ile pogrupowaliśmy według właściwych kolumn. Aby to zrobić, używamy HAVING
klauzula. Warunkiem, który określamy, jest liczba elementów w grupie — COUNT(id)
— musi być większe niż jeden:COUNT(id) > 1
. Pamiętaj, że HAVING
umożliwia filtrowanie grup; WHERE
służy do filtrowania poszczególnych wierszy.