SQLShack (Română)

Acest articol explorează operatorul SQL Count Distinct pentru eliminarea rândurile duplicate din setul de rezultate.

Un dezvoltator trebuie să obțină date dintr-un tabel SQL cu condiții multiple. Uneori, vrem să obținem toate rândurile dintr-un tabel, dar să eliminăm valorile NULL disponibile. Să presupunem că dorim să obținem evidențe distincte ale clienților care au plasat o comandă anul trecut.

Să mergem mai departe și să avem o prezentare rapidă a funcției SQL Count.

Funcția SQL Count

Folosim funcția agregată SQL Count pentru a obține numărul de rânduri din ieșirea. Să presupunem că avem un tabel de produse care deține înregistrări pentru toate produsele vândute de o companie. Vrem să știm numărul de produse vândute în ultimul trimestru. Putem utiliza funcția SQL Count pentru a returna numărul de rânduri în condiția specificată.

Sintaxa funcției SQL COUNT:
COUNT (expresie);

În mod implicit, Funcția SQL Server Count folosește Toate cuvintele cheie. Înseamnă că SQL Server numără toate înregistrările dintr-un tabel. De asemenea, include rândurile cu valori duplicate.

Haideți să creăm un eșantion de tabel și să inserăm câteva înregistrări în acesta.

În acest tabel avem și valori duplicate și valori NULL .

În următoarea captură de ecran, putem observa că:

  • Număr (* ) include valori duplicate, precum și valori NULL
  • Numărul (Col1) include valori duplicate, dar nu include valori NULL

Să presupunem că dorim să cunoaștem valorile distincte disponibile în tabel. Putem folosi SQL COUNT DISTINCT pentru a face acest lucru.

1
2

Selectați numărul (DISTINCT COL1)
din ## TestTable

În următoarea ieșire, obținem doar 2 rânduri. SQL COUNT Distinct nu elimină valorile duplicate și NULL din setul de rezultate.

Să vedem un alt exemplu. În acest exemplu, avem un tabel de locație care constă din două coloane Oraș și Stat.

Acum, executați următoarea interogare pentru a afla un număr al orașului distinct din tabel.

1
2

SELECTAȚI NUMĂRUL (DISTINCT (Oraș))
DIN Locație;

Returnează numărul numărului unic de orașe 2 (Gurgaon și Jaipur) din setul nostru de rezultate.

Dacă ne uităm la date, avem un nume de oraș similar prezent într-un alt starea de asemenea. Combinația dintre oraș și stat este unică și nu dorim ca acea combinație unică să fie eliminată din ieșire.

Putem utiliza funcția SQL DISTINCT și pe o combinație de coloane. Verifică combinația de valori și elimină dacă combinația nu este unică.

1
2

SELECT DISTINCT Oraș, stat
DIN Locație;

Nu elimină numele de oraș duplicat din ieșire datorită unei combinații unice de valori.

Să introducem încă un rând în tabelul de locații.

1

Introduceți în valorile locației („Gurgaon „,” Haryana „)

Avem 5 înregistrări în tabelul de localizare. În date, puteți vedea că avem o combinație de oraș și stat care nu este unică.

Executați din nou SELECT DISTINCT și ar trebui să returneze doar 4 rânduri de data aceasta.

Nu putem folosi funcția SQL COUNT DISTINCT direct cu mai multe coloane . Veți primi următorul mesaj de eroare.

Putem folosi un tabel temporar pentru a obține înregistrări din funcția SQL DISTINCT și apoi folosiți count (*) pentru a verifica numărul de rânduri.

1
2
3
4

SELECT DISTINCT Oraș, stat
în #Temp
FROM Locație;
Selectați numărul (*) din #Temp

Obținem numărul de rânduri 4 în ieșire.

Dacă folosim o combinație de coloane pentru a obține distincte valori și oricare dintre coloane conțin valori NULL, devine, de asemenea, o combinație unică pentru SQL Server.

Pentru a verifica acest lucru, să inserăm mai multe înregistrări în tabelul de locații. Nu am specificat nicio stare în această interogare.

1
2

Inserați în valorile locației („Gurgaon”, „”)
Inserați în valorile locației (orașului) („Gurgaon”)

Să ne uităm la datele tabelului de locație.

Executați din nou interogarea pentru a obține distincte rânduri din tabelul de locații.

1
2

SELECT oraș distinct, stat
FROM Locație;

În rezultat, putem vedea că nu elimină combinația dintre oraș și stat cu valorile necompletate sau NULL.

În mod similar, puteți vedea numărul de rânduri 6 cu SQL COUNT Funcția DISTINCT.

Diferența dintre SELECT COUNT, COUNT (*) și SQL COUNT distinct

COUNT

Număr (*)

Count (Distinct)

Returnează numărul total de rânduri după îndeplinirea condițiilor specificate în clauza where.

Returnează numărul total de rânduri după îndeplinirea condițiilor specificate în clauza where.

Returnează numărul distinct de rânduri după îndeplinirea condițiilor specificate în clauza where .

Oferă numărul de rânduri. Nu elimină valorile duplicate.

Acesta ia în considerare toate rândurile, indiferent de orice valoare duplicată, NULL.

Oferă un număr distinct de rânduri după eliminarea valorilor NULL și a valorilor duplicate.

Elimină valorile NULL din ieșire.

Nu elimină valorile NULL din ieșire.

Elimină valorile NULL din ieșire.

Planul de execuție a funcției distincte SQL Count

Să vedem Planul de execuție real al funcției SQL COUNT DISTINCT. Trebuie să activați Planul de execuție real din bara de meniu SSMS, așa cum se arată mai jos.

Executați interogarea pentru a obține un plan de execuție. În acest plan de execuție, puteți vedea principalii operatori consumatori de resurse:

  • Sortare (Sortare distinctă) – Cost 78%
  • Scanare tabel – Cost 22%

Puteți trece cu mouse-ul peste operatorul de sortare și deschide un sfat cu detaliile operatorului.

În ferestrele cu proprietăți, obținem și mai multe detalii despre operatorul de sortare, inclusiv alocarea memoriei, statistici și numărul de rânduri.

Într-un tabel cu milioane de înregistrări, SQL Count Distinct poate cauza probleme de performanță, deoarece un operator de numărare distinct este un operator costisitor în planul de execuție real.

SQL Server 2019 îmbunătățește performanța operatorului SQL COUNT DISTINCT utilizând o nouă funcție Approx_count_distinct. Această nouă funcție a SQL Server 2019 oferă un număr distinct aproximativ de rânduri. S-ar putea să existe o ușoară diferență în ieșirea funcției SQL Count distinct și Approx_Count_distinct.

Puteți înlocui SQL COUNT DISTINCT cu cuvântul cheie Approx_Count_distinct pentru a utiliza această funcție din SQL Server 2019.

1
2

SELECT APPROX_COUNT_DISTINCT (Oraș)
DIN Locație;

Puteți explora mai multe despre această funcție în noua funcție SQL Server 2019 Approx_Count_Distinct.

Concluzie

În acest articol, am explorat funcția SQL COUNT cu diferite exemple. Am acoperit, de asemenea, noua funcție SQL Approx_Count_distinct disponibilă de la SQL Server 2019. Aș sugera să le revizuiți conform mediului dvs. Dacă aveți orice comentarii sau întrebări, nu ezitați să le lăsați în comentariile de mai jos.

  • Autor
  • Postări recente
În calitate de trainer certificat MCSA și certificat Microsoft în Gurgaon, India, cu 13 ani de experiență, Rajendra lucrează pentru o varietate de companii mari concentrându-se pe optimizarea performanței, monitorizare, disponibilitate ridicată și strategii și implementare de recuperare în caz de dezastru. Este autorul a sute de articole de autoritate despre SQL Server, Azure, MySQL, Linux, Power BI, Tuning de performanță, AWS / Amazon RDS, Git și tehnologii conexe care au fost vizualizate de peste 10 milioane de cititori până în prezent.
El este creatorul uneia dintre cele mai mari colecții online gratuite de articole pe un singur subiect, cu seria sa de 50 de părți despre SQL Server Always On Availability Groups. Pe baza contribuției sale la comunitatea SQL Server, a fost recunoscut cu diverse premii, inclusiv prestigiosul „Cel mai bun autor al anului” continuu în 2020 și 2021 la SQLShack.
Raj este mereu interesat de noi provocări, deci dacă aveți nevoie de consultanță ajutor cu privire la orice subiect acoperit în scrierile sale, el poate fi contactat la [email protected]
Vezi toate mesajele lui Rajendra Gupta

Ultimele postări ale lui Rajendra Gupta (vezi toate)
  • Timpul sesiunii în SQL Server întotdeauna disponibil Grupuri – 8 februarie 2021
  • Efectuarea actualizărilor versiunii minore și majore pentru AWS RDS SQL Server – 29 ianuarie 2021
  • Implementarea instanțelor AWS RDS PostgreSQL – 27 ianuarie 2021

Write a Comment

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *