Database
 sql >> Database >  >> RDS >> Database

SQL COUNT() per principianti

In SQL, il COUNT() function è una funzione aggregata che restituisce il numero di elementi trovati in un gruppo.

Puoi usare COUNT() in più parti di una query. Ad esempio, puoi usarlo in SELECT elenco, o il HAVING clausola durante il filtraggio dei gruppi.

Tabella di esempio

Supponiamo di avere la seguente tabella:

SELECT * FROM Pets;

Risultato:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+

Gli esempi seguenti utilizzeranno COUNT() funzione quando si interroga questa tabella.

Esempio

Ecco un semplice esempio per iniziare.

SELECT COUNT(*) AS Count
FROM Pets;

Risultato:

+---------+
| Count   |
|---------|
| 8       |
+---------+

Questo ci dice che ci sono 8 righe nella tabella. Lo sappiamo perché abbiamo utilizzato il carattere jolly asterisco (* ) per specificare tutte le righe e tutte le colonne.

Conta una colonna specifica

Puoi anche specificare una particolare colonna da contare. Il COUNT() la funzione conta solo non NULL risultati, quindi se specifichi una colonna che contiene NULL valori, quei valori non verranno conteggiati.

Ecco un esempio per dimostrare cosa intendo.

SELECT COUNT(DOB) AS Count
FROM Pets;

Risultato:

+---------+
| Count   |
|---------|
| 6       |
+---------+
Warning: Null value is eliminated by an aggregate or other SET operation.

In questo caso, il Pets la tabella contiene due NULL valori nel DOB colonna (due animali domestici non hanno fornito la loro data di nascita), e quindi COUNT(DOB) restituisce 6, invece di 8 quando abbiamo usato COUNT(*) .

Il motivo COUNT(*) nell'esempio precedente hanno restituito tutte le righe, perché quelle due righe hanno fatto avere dati nelle altre colonne.

Nel mio esempio, anche il mio DBMS ha restituito un avviso al riguardo. Potresti ricevere o meno un avviso, a seconda del tuo DBMS e della tua configurazione specifica.

Risultati filtrati

Il COUNT() la funzione conta le righe restituite dalla query. Quindi, se filtri i risultati, il risultato di COUNT() lo rifletterà.

SELECT COUNT(*) AS Count
FROM Pets
WHERE PetName = 'Fluffy';

Risultato:

+---------+
| Count   |
|---------|
| 2       |
+---------+

In questo caso, ci sono due animali domestici con il nome di Fluffy. Pertanto, la query avrebbe restituito due righe e il risultato di COUNT() è 2 .

Conta colonne distinte

Per impostazione predefinita, il COUNT() la funzione include un implicito ALL parola chiave. Ciò significa che include duplicati nei suoi risultati.

Ma hai anche la possibilità di aggiungere il DISTINCT parola chiave per specificare che vengono restituiti solo valori distinti. Cioè, puoi specificare che esclude i duplicati.

Scegliamo il PetName colonna. Se guardi la tabella originale sopra, puoi vedere che il PetName colonna include due righe con lo stesso valore (Fluffy ).

Per prima cosa eseguiremo un COUNT(ALL PetName) query per includere tutti i valori duplicati nel conteggio:

SELECT COUNT(ALL PetName) AS Count
FROM Pets;

Risultato:

+---------+
| Count   |
|---------|
| 8       |
+---------+

Quindi, ci sono otto righe. Ricorda che questo è lo stesso risultato che otterremmo se non avessimo incluso ALL parola chiave, perché ALL è l'impostazione predefinita.

Ora eseguiremo un COUNT(DISTINCT PetName) per eliminare eventuali duplicati dal conteggio.

SELECT COUNT(DISTINCT PetName) AS Count
FROM Pets;

Risultato:

+---------+
| Count   |
|---------|
| 7       |
+---------+

Questa volta il risultato è 7 . Questo perché il nostro valore duplicato è stato eliminato. Cioè, il valore duplicato è stato trattato come se fosse presente un solo valore.

Utilizzo di COUNT() con il HAVING Clausola

Puoi includere COUNT() funzione in più parti di una query. Non è solo limitato a SELECT elenco.

Ecco un esempio che utilizza COUNT() in entrambi i HAVING clausola e il SELECT elenco.

SELECT 
    PetTypeId, 
    COUNT(PetTypeId) AS Count
FROM Pets
GROUP BY PetTypeId
HAVING COUNT(PetTypeId) > 2
ORDER BY Count DESC;

Risultato:

+-------------+---------+
| PetTypeId   | Count   |
|-------------+---------|
| 3           | 4       |
| 2           | 3       |
+-------------+---------+

In questo caso, abbiamo usato il HAVING clausola unitamente al GROUP BY clausola per restituire solo quelle righe che hanno un COUNT(PetTypeId) maggiore di 2 .

Non sei limitato al solo ) Operatore per principianti">maggiore di operatore (> ) quando si utilizza il HAVING clausola. Puoi usare gli stessi operatori che puoi usare con WHERE clausola (come = , ) Operator for Beginners">< , =) Operator for Beginners">>= , IN , LIKE , ecc).

Vedere Operatori SQL per un elenco di operatori disponibili in SQL.

Funzioni della finestra

A seconda del tuo DBMS, potresti essere in grado di utilizzare un OVER clausola con il tuo COUNT() funzione per creare una funzione finestra.

Una funzione finestra esegue un'operazione di tipo aggregato su un insieme di righe di query. Produce un risultato per ogni riga di query. Ciò è in contrasto con un'operazione di aggregazione, che raggruppa le righe di query in un'unica riga di risultati.

Ecco un esempio per dimostrare il concetto.

Abbiamo già visto i Pets tavolo. Il nostro database ha anche un Owners tabella e contiene i seguenti dati:

+-----------+-------------+------------+----------------+-------------------+
| OwnerId   | FirstName   | LastName   | Phone          | Email             |
|-----------+-------------+------------+----------------+-------------------|
| 1         | Homer       | Connery    | (308) 555-0100 | [email protected] |
| 2         | Bart        | Pitt       | (231) 465-3497 | [email protected]  |
| 3         | Nancy       | Simpson    | (489) 591-0408 | NULL              |
| 4         | Boris       | Trump      | (349) 611-8908 | NULL              |
| 5         | Woody       | Eastwood   | (308) 555-0112 | [email protected] |
| 6         | Burt        | Tyson      | (309) 565-0112 | [email protected]  |
+-----------+-------------+------------+----------------+-------------------+

Possiamo recuperare i dati da queste tabelle e presentarli come un set di risultati utilizzando un join.

Possiamo anche usare COUNT() funzione con il OVER clausola per applicare una funzione finestra ai dati.

SELECT 
    CONCAT(o.FirstName, ' ', o.LastName) AS Owner,
    p.PetName,
    COUNT(PetId) OVER (PARTITION BY CONCAT(o.FirstName, ' ', o.LastName)) AS "Number of pets from this owner"
FROM Owners o 
INNER JOIN Pets p 
ON p.OwnerId = o.OwnerId
ORDER BY "Number of pets from this owner" DESC;

Risultato:

+---------------+-----------+----------------------------------+
| Owner         | PetName   | Number of pets from this owner   |
|---------------+-----------+----------------------------------|
| Nancy Simpson | Wag       | 3                                |
| Nancy Simpson | Fluffy    | 3                                |
| Nancy Simpson | Fetch     | 3                                |
| Bart Pitt     | Scratch   | 2                                |
| Bart Pitt     | Bark      | 2                                |
| Boris Trump   | Meow      | 2                                |
| Boris Trump   | Fluffy    | 2                                |
| Homer Connery | Tweet     | 1                                |
+---------------+-----------+----------------------------------+

In questo caso abbiamo usato il OVER clausola con il nostro COUNT() clausola per partizionare il conteggio solo per il nome del proprietario.

Il risultato è che i proprietari con più animali domestici vengono visualizzati su più righe (perché anche ogni animale domestico deve essere visualizzato) e ogni riga contiene il conteggio aggregato degli animali domestici di quel proprietario.

Questo concetto può essere applicato anche ad altre funzioni aggregate in SQL, come SUM() , MIN() , MAX() e AVG() .

COUNT_BIG()

Se stai contando set di dati di grandi dimensioni in SQL Server, potresti scoprire che COUNT() la funzione produce un errore, a causa del numero troppo alto. Ciò accadrà solo che il tuo conteggio è maggiore di 2.147.483.647.

In questi casi, puoi utilizzare COUNT_BIG() , che può soddisfare numeri molto più grandi.

Guarda come COUNT_BIG() Funziona in SQL Server e COUNT() rispetto a COUNT_BIG() per una spiegazione più dettagliata.

Standard ANSI SQL

Il COUNT() La funzione è elencata nello standard SQL ed è disponibile nella maggior parte (se non in tutti) dei principali DBMS e funziona praticamente allo stesso modo su di essi.

Per esempi di codice eseguiti in vari DBMS, vedere SQLite COUNT() , SQL Server COUNT() e MySQL COUNT() .