Denne artikkelen utforsker SQL Count Distinct-operatøren for eliminering de dupliserte radene i resultatsettet.
En utvikler må hente data fra en SQL-tabell med flere betingelser. Noen ganger ønsker vi å få alle rader i en tabell, men eliminere de tilgjengelige NULL-verdiene. Anta at vi ønsker å få forskjellige kundeposter som har bestilt i fjor.
La oss gå videre og ha en rask oversikt over SQL Count-funksjonen.
SQL Count-funksjon
Vi bruker SQL Count-aggregasjonsfunksjon for å få antall rader i utgangen. Anta at vi har en produkttabell som holder rekord for alle produkter som selges av et selskap. Vi vil vite antall solgte produkter i løpet av siste kvartal. Vi kan bruke SQL Count-funksjonen til å returnere antall rader i den angitte tilstanden.
Syntaksen til SQL COUNT-funksjonen:
COUNT (uttrykk);
Som standard, SQL Server Count Function bruker alle søkeord. Det betyr at SQL Server teller alle poster i en tabell. Den inkluderer også radene som har dupliserte verdier.
La oss lage en eksempeltabell og sette inn noen poster i den.
I denne tabellen har vi også dupliserte verdier og NULL-verdier .
I følgende skjermbilde kan vi merke oss at:
- Count (* ) inkluderer dupliserte verdier så vel som NULL-verdier
- Antall (Col1) inkluderer dupliserte verdier, men inkluderer ikke NULL-verdier
Anta at vi vil vite de forskjellige verdiene som er tilgjengelige i tabellen. Vi kan bruke SQL COUNT DISTINCT til å gjøre det.
1
2
|
Velg antall (DISTINCT COL1)
fra ## Testtabell
|
I den følgende utgangen får vi bare to rader. SQL COUNT Distinct eliminerer ikke duplikat- og NULL-verdier fra resultatsettet.
La oss se på et annet eksempel. I dette eksemplet har vi en plasseringstabell som består av to kolonner By og stat.
Nå, utfør følgende spørring for å finne ut en telling av den forskjellige byen fra tabellen.
1
2
|
VELG TELL (DISTINCT (by))
FRA plassering;
|
Den returnerer antall unike bytall 2 (Gurgaon og Jaipur) fra resultatsettet.
Hvis vi ser på dataene, har vi lignende bynavn tilstede i et annet staten også. Kombinasjonen av by og stat er unik, og vi vil ikke at den unike kombinasjonen skal elimineres fra utdataene.
Vi kan også bruke SQL DISTINCT-funksjonen på en kombinasjon av kolonner. Den ser etter kombinasjonen av verdier og fjerner hvis kombinasjonen ikke er unik.
1
2
|
VELG DISTINCT By, stat
FRA sted;
|
Det fjerner ikke dupliserte bynavn fra utdata på grunn av en unik verdikombinasjon.
La oss sette inn en rad til i plasseringstabellen.
1
|
Sett inn plasseringsverdier («Gurgaon «,» Haryana «)
|
Vi har 5 poster i plasseringstabellen. I dataene kan du se at vi har en kombinasjon av by og stat som ikke er unik.
Kjør SELECT DISTINCT funksjon, og den skal bare returnere 4 rader denne gangen.
Vi kan ikke bruke SQL COUNT DISTINCT-funksjonen direkte med flere kolonner . Du får følgende feilmelding.
Vi kan bruke en midlertidig tabell for å få poster fra SQL DISTINCT-funksjonen og deretter bruke tell (*) for å sjekke radtallene.
1
2
3
4
|
VELG DISTINCT By, stat
i #Temp
FRA sted;
Velg antall (*) fra #Temp
|
Vi får radtellingen 4 i utdataene.
Hvis vi bruker en kombinasjon av kolonner for å bli tydelig verdier og hvilken som helst av kolonnene inneholder NULL-verdier, blir det også en unik kombinasjon for SQL Server.
For å bekrefte dette, la oss sette inn flere poster i plasseringstabellen. Vi spesifiserte ingen tilstand i dette spørringen.
1
2
|
Sett inn plasseringsverdier («Gurgaon», «»)
Sett inn sted (by) -verdier («Gurgaon»)
|
La oss se på dataene om plasseringstabellen.
Kjør spørringen på nytt for å bli tydelig rader fra plasseringstabellen.
1
2
|
VELG distinkt by, stat
FRA beliggenhet;
|
I utgangen kan vi se at det ikke eliminerer kombinasjonen av by og stat med de tomme eller NULL-verdiene.
På samme måte kan du se radtall 6 med SQL COUNT DISTINCT-funksjon.
Forskjell mellom SELECT COUNT, COUNT (*) og SQL COUNT distinkt
COUNT |
Count (*) |
Count (Distinct) |
Den returnerer totalt antall rader etter tilfredsstillende betingelser som er angitt i hvor-setningen. |
Den returnerer det totale antallet rader etter tilfredsstillende betingelser som er angitt i hvor-setningen. |
Den returnerer det distinkte antall rader etter tilfredsstillende betingelser spesifisert i hvor-setningen . |
Det gir antall rader. Det eliminerer ikke dupliserte verdier. |
Den tar hensyn til alle rader uansett duplikat, NULL-verdier. |
Det gir en tydelig antall rader etter eliminering av NULL og dupliserte verdier. |
Det eliminerer NULL-verdiene i utdataene. |
Det eliminerer ikke NULL-verdiene i utgangen. |
Det eliminerer NULL-verdiene i utdataene. |
Utførelsesplan for SQL Count-funksjonen
La oss se på den faktiske utførelsesplanen for SQL COUNT DISTINCT-funksjonen. Du må aktivere den faktiske utførelsesplanen fra SSMS-menylinjen som vist nedenfor.
Utfør spørringen for å få en faktisk gjennomføringsplan. I denne utførelsesplanen kan du se topp ressurskrevende operatører:
- Sorter (distinkt sortering) – kostnad 78%
- tabellskanning – kostnad 22%
Du kan sveve musen over sorteringsoperatoren, og den åpner et verktøytips med operatørdetaljene.
I egenskapsvinduene får vi også flere detaljer rundt sorteringsoperatøren inkludert minnetildeling, statistikk og antall rader.
I en tabell med millioner poster kan SQL Count Distinct forårsake ytelsesproblemer fordi en distinkt count-operator er en kostbar operatør i faktisk utførelsesplan.
SQL Server 2019 forbedrer ytelsen til SQL COUNT DISTINCT-operatøren ved hjelp av en ny funksjon Approx_count_distinct. Denne nye funksjonen til SQL Server 2019 gir en omtrentlig distinkt telling av radene. Det kan være en liten forskjell i funksjonen for SQL Count-distinkt og Approx_Count_distinct-funksjon.
Du kan erstatte SQL COUNT DISTINCT med nøkkelordet Approx_Count_distinct for å bruke denne funksjonen fra SQL Server 2019.
1
2
|
VELG APPROX_COUNT_DISTINCT (by)
FRA plassering;
|
Du kan utforske mer om denne funksjonen i Den nye SQL Server 2019-funksjonen Approx_Count_Distinct.
Konklusjon
I denne artikkelen utforsket vi SQL COUNT-funksjonen med forskjellige eksempler. Vi dekket også den nye SQL-funksjonen Approx_Count_distinct tilgjengelig fra SQL Server 2019. Jeg vil foreslå å gjennomgå dem i henhold til ditt miljø. Hvis du har kommentarer eller spørsmål, kan du legge dem igjen i kommentarene nedenfor.
- Forfatter
- Nylige innlegg
Han er skaper av en av de største gratis online samlingene av artikler om et enkelt emne, med sin 50-delte serie om SQL Server Always On Availability Groups. Basert på sitt bidrag til SQL Server-fellesskapet, har han blitt anerkjent med forskjellige priser, inkludert den prestisjetunge «Årets beste forfatter» kontinuerlig i 2020 og 2021 på SQLShack.
Raj er alltid interessert i nye utfordringer, så hvis du trenger rådgivning hjelp til ethvert emne som dekkes av hans forfatterskap, kan du nås på [email protected]
Se alle innlegg av Rajendra Gupta
- Tidsavbrudd for økt i SQL Server Alltid på tilgjengelighet Grupper – 8. februar 2021
- Utføre mindre og større versjonsoppgraderinger for AWS RDS SQL Server – 29. januar 2021
- Distribuere AWS RDS PostgreSQL-forekomster – 27. januar 2021