W tym artykule omówiono operator SQL Count Distinct służący do eliminacji zduplikowane wiersze w zestawie wyników.
Programista musi pobrać dane z tabeli SQL z wieloma warunkami. Czasami chcemy uzyskać wszystkie wiersze w tabeli, ale wyeliminować dostępne wartości NULL. Załóżmy, że chcemy uzyskać różne rekordy klientów, którzy złożyli zamówienia w zeszłym roku.
Przejdźmy dalej i zapoznajmy się z krótkim przeglądem funkcji SQL Count.
Funkcja SQL Count
Używamy funkcji agregującej SQL Count, aby uzyskać liczbę wierszy w wyjście. Załóżmy, że mamy tabelę produktów, która zawiera zapisy dotyczące wszystkich produktów sprzedawanych przez firmę. Chcemy poznać liczbę sprzedanych produktów w ostatnim kwartale. Możemy użyć funkcji licznika SQL, aby zwrócić liczbę wierszy w określonym warunku.
Składnia funkcji SQL COUNT:
COUNT (wyrażenie);
Domyślnie, Funkcja licznika programu SQL Server używa słowa kluczowego All. Oznacza to, że SQL Server liczy wszystkie rekordy w tabeli. Zawiera również wiersze ze zduplikowanymi wartościami.
Utwórzmy przykładową tabelę i wstawimy do niej kilka rekordów.
W tej tabeli mamy zduplikowane wartości i wartości NULL. .
Na poniższym zrzucie ekranu możemy zauważyć, że:
- Count (* ) zawiera zduplikowane wartości, a także wartości NULL.
- Count (Col1) obejmuje zduplikowane wartości, ale nie zawiera wartości NULL.
Załóżmy, że chcemy poznać różne wartości dostępne w tabeli. W tym celu możemy użyć SQL COUNT DISTINCT.
1
2
|
Wybierz liczbę (DISTINCT COL1)
z ## TestTable
|
W poniższym wyniku otrzymamy tylko 2 wiersze. SQL COUNT Distinct nie eliminuje zduplikowanych i NULL wartości ze zbioru wyników.
Spójrzmy na inny przykład. W tym przykładzie mamy tabelę lokalizacji, która składa się z dwóch kolumn City i State.
Teraz wykonaj następujące zapytanie, aby znaleźć liczbę różnych miast z tabeli.
1
2
|
SELECT COUNT (DISTINCT (City))
FROM Location;
|
Zwraca liczbę unikalnych miast, licząc 2 (Gurgaon i Jaipur) z naszego zestawu wyników.
Jeśli spojrzymy na dane, mamy podobną nazwę miasta obecną w innym stan również. Połączenie miasta i stanu jest niepowtarzalne i nie chcemy, aby ta unikalna kombinacja została wyeliminowana z wyniku.
Możemy również użyć funkcji SQL DISTINCT na kombinacji kolumn. Sprawdza kombinację wartości i usuwa, jeśli nie jest ona unikalna.
1
2
|
SELECT DISTINCT Miasto, stan
FROM Location;
|
Nie usuwa zduplikowanych nazw miast z wyników ze względu na unikalną kombinację wartości.
Wstawmy jeszcze jeden wiersz w tabeli lokalizacji.
1
|
Wstaw do wartości lokalizacji („Gurgaon „,” Haryana „)
|
Mamy 5 rekordów w tabela lokalizacji. W danych widać, że mamy jedną kombinację miasta i stanu, która nie jest unikalna.
Ponownie uruchom SELECT DISTINCT funkcja i tym razem powinna zwrócić tylko 4 wiersze.
Nie możemy użyć funkcji SQL COUNT DISTINCT bezpośrednio z wieloma kolumnami . Pojawia się następujący komunikat o błędzie.
Możemy użyć tabeli tymczasowej, aby pobrać rekordy z funkcji SQL DISTINCT, a następnie użyć count (*), aby sprawdzić liczbę wierszy.
1
2
3
4
|
SELECT DISTINCT Miasto, stan
do #Temp
FROM Location;
Wybierz licznik (*) z #Temp
|
W wyniku otrzymujemy liczbę wierszy 4.
Jeśli użyjemy kombinacji kolumn, aby uzyskać odrębne wartości, a każda z kolumn zawiera wartości NULL, staje się również unikalną kombinacją dla SQL Server.
Aby to sprawdzić, wstawmy więcej rekordów do tabeli lokalizacji. W tym zapytaniu nie określiliśmy żadnego stanu.
1
2
|
Wstaw do wartości lokalizacji („Gurgaon”, „”)
Wstaw do wartości lokalizacji (miasta) („Gurgaon”)
|
Spójrzmy na dane tabeli lokalizacji.
Ponownie uruchom zapytanie, aby uzyskać odrębne wiersze z tabeli lokalizacji.
1
2
|
WYBIERZ odrębne miasto, stan
Z lokalizacji;
|
W wynikach widzimy, że nie eliminuje kombinacja miasta i stanu z wartościami pustymi lub NULL.
Podobnie, możesz zobaczyć liczbę wierszy 6 z SQL COUNT Funkcja DISTINCT.
Różnica między SELECT COUNT, COUNT (*) i SQL COUNT odrębna
LICZBA |
Liczba (*) |
Count (Distinct) |
Zwraca całkowitą liczbę wierszy po spełnieniu warunków określonych w klauzuli Where. |
Zwraca całkowitą liczbę wierszy po spełnieniu warunków określonych w klauzuli where. |
Zwraca odrębną liczbę wierszy po spełnieniu warunków określonych w klauzuli where . |
Podaje liczbę wierszy. Nie eliminuje zduplikowanych wartości. |
Uwzględnia wszystkie wiersze niezależnie od zduplikowanych wartości NULL. |
Daje odrębna liczba wierszy po wyeliminowaniu NULL i zduplikowanych wartości. |
Eliminuje wartości NULL w wynikach. |
Nie eliminuje wartości NULL z wyjścia. |
Eliminuje wartości NULL w wyjściu. |
Plan wykonania odrębnej funkcji licznika SQL
Spójrzmy na rzeczywisty plan wykonania funkcji SQL COUNT DISTINCT. Musisz włączyć rzeczywisty plan wykonania z paska menu SSMS, jak pokazano poniżej.
Wykonaj zapytanie, aby uzyskać rzeczywistą plan wykonania. W tym planie wykonania można zobaczyć operatory zajmujące najwięcej zasobów:
- Sortuj (sortowanie odrębne) – koszt 78%
- Skanowanie tabeli – koszt 22%
Możesz umieścić kursor myszy nad operatorem sortowania, a otworzy się podpowiedź ze szczegółami operatora.
W oknach właściwości otrzymujemy również więcej szczegółów na temat operatora sortowania, w tym przydział pamięci, statystyki i liczbę wierszy.
W tabeli z milionami rekordów SQL Count Distinct może powodować problemy z wydajnością, ponieważ odrębny operator count jest kosztownym operatorem w faktyczny plan wykonania.
SQL Server 2019 poprawia wydajność operatora SQL COUNT DISTINCT za pomocą nowej funkcji Approx_count_distinct. Ta nowa funkcja programu SQL Server 2019 zapewnia przybliżoną odrębną liczbę wierszy. Może występować niewielka różnica w wynikach funkcji liczby SQL i Approx_Count_distinct.
Możesz zastąpić SQL COUNT DISTINCT słowem kluczowym Approx_Count_distinct, aby użyć tej funkcji z SQL Server 2019.
1
2
|
SELECT APPROX_COUNT_DISTINCT (miasto)
Z lokalizacji;
|
Więcej informacji na temat tej funkcji można znaleźć w nowej funkcji Approx_Count_Distinct programu SQL Server 2019.
Podsumowanie
W tym artykule omówiliśmy funkcję SQL COUNT z różnymi przykładami. Omówiliśmy również nową funkcję SQL Approx_Count_distinct dostępną w SQL Server 2019. Sugerowałbym przejrzenie ich zgodnie z Twoim środowiskiem. Jeśli masz jakieś uwagi lub pytania, zostaw je w komentarzach poniżej.
- Autor
- Najnowsze posty
Jest twórcą jednej z największych bezpłatnych kolekcji artykułów online na jeden temat, obejmującej 50-częściową serię na temat grup dostępności SQL Server Always On. Dzięki swojemu wkładowi w społeczność SQL Server, został wyróżniony różnymi nagrodami, w tym prestiżową nagrodą „Najlepszy autor roku” nieprzerwanie w 2020 i 2021 roku w SQLShack.
Raj jest zawsze zainteresowany nowymi wyzwaniami, więc jeśli potrzebujesz konsultacji pomoc na każdy temat poruszony w jego pismach, można się z nim skontaktować pod adresem [email protected]
Wyświetl wszystkie posty Rajendry Gupty
- Limity czasu sesji w SQL Server Always On Availability Grupy – 8 lutego 2021
- Wykonywanie mniejszych i głównych aktualizacji wersji AWS RDS SQL Server – 29 stycznia 2021
- Wdrażanie wystąpień AWS RDS PostgreSQL – 27 stycznia 2021