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

SQL COUNT() for begyndere

I SQL er COUNT() funktion er en aggregeret funktion, der returnerer antallet af elementer fundet i en gruppe.

Du kan bruge COUNT() i flere dele af en forespørgsel. For eksempel kan du bruge det i SELECT listen eller HAVING klausul ved filtrering af grupper.

Eksempeltabel

Antag, at vi har følgende tabel:

SELECT * FROM Pets;

Resultat:

+---------+-------------+-----------+-----------+------------+
| 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       |
+---------+-------------+-----------+-----------+------------+

Følgende eksempler vil bruge COUNT() funktion, når du forespørger i denne tabel.

Eksempel

Her er et enkelt eksempel for at komme i gang.

SELECT COUNT(*) AS Count
FROM Pets;

Resultat:

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

Dette fortæller os, at der er 8 rækker i tabellen. Vi ved det, fordi vi brugte stjerne-jokertegnet (* ) for at angive alle rækker og alle kolonner.

Tæl en specifik kolonne

Du kan også angive en bestemt kolonne, der skal tælles. COUNT() funktion tæller kun ikke-NULL resultater, så hvis du angiver en kolonne, der indeholder NULL værdier, vil disse værdier ikke blive talt med.

Her er et eksempel for at vise, hvad jeg mener.

SELECT COUNT(DOB) AS Count
FROM Pets;

Resultat:

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

I dette tilfælde er Kæledyr tabel indeholder to NULL værdier i DOB kolonne (to kæledyr har ikke oplyst deres fødselsdato), og så COUNT(DOB) returnerer 6 i stedet for 8, når vi brugte COUNT(*) .

Årsagen COUNT(*) i det forrige eksempel returnerede alle rækker, fordi de to rækker gjorde har data i de andre kolonner.

I mit eksempel returnerede mit DBMS også en advarsel om dette. Du kan muligvis ikke få en advarsel, afhængigt af dit DBMS og din specifikke konfiguration.

Filtrerede resultater

COUNT() funktion tæller rækkerne, der returneres af forespørgslen. Så hvis du filtrerer resultaterne, er resultatet af COUNT() vil afspejle det.

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

Resultat:

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

I dette tilfælde er der to kæledyr med navnet Fluffy. Derfor ville to rækker være blevet returneret af forespørgslen og resultatet af COUNT() er 2 .

Tæl forskellige kolonner

Som standard er COUNT() funktion inkluderer en implicit ALL søgeord. Det betyder, at den inkluderer dubletter i sine resultater.

Men du har også mulighed for at tilføje DISTINCT nøgleord for at angive, at der kun returneres forskellige værdier. Det vil sige, at du kan angive, at det udelukker dubletter.

Lad os vælge PetName kolonne. Hvis du ser på den originale tabel ovenfor, kan du se, at PetName kolonne indeholder to rækker med samme værdi (Fluffy ).

Først kører vi en COUNT(ALL PetName) forespørgsel for at inkludere alle duplikerede værdier i optællingen:

SELECT COUNT(ALL PetName) AS Count
FROM Pets;

Resultat:

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

Så der er otte rækker. Husk, at dette er det samme resultat, som vi ville få, hvis vi ikke havde inkluderet ALL søgeord, fordi ALL er standard.

Nu kører vi en COUNT(DISTINCT PetName) for at fjerne eventuelle dubletter fra optællingen.

SELECT COUNT(DISTINCT PetName) AS Count
FROM Pets;

Resultat:

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

Denne gang er resultatet 7 . Dette skyldes, at vores duplikatværdi blev elimineret. Det vil sige, at duplikatværdien blev behandlet, som om der kun var én værdi.

Ved brug af COUNT() med HAVING Klausul

Du kan inkludere COUNT() fungerer i flere dele af en forespørgsel. Det er ikke kun begrænset til SELECT liste.

Her er et eksempel, der bruger COUNT() i både HAVING klausulen og SELECT liste.

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

Resultat:

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

I dette tilfælde brugte vi HAVING klausul i forbindelse med GROUP BY klausul for kun at returnere de rækker, der har en COUNT(PetTypeId) på større end 2 .

Du er ikke begrænset til kun ) Operatør for begyndere">større end operatør (> ) når du bruger HAVING klausul. Du kan bruge de samme operatorer, som du kan bruge med WHERE klausul (såsom = , ) Operatør for begyndere">< , =) Operatør for begyndere">>= , IN , LIKE osv.).

Se SQL-operatører for en liste over tilgængelige operatorer i SQL.

Vinduefunktioner

Afhængigt af dit DBMS, kan du muligvis bruge en OVER klausul med din COUNT() funktion for at oprette en vinduesfunktion.

En vinduesfunktion udfører en aggregatlignende operation på et sæt forespørgselsrækker. Det producerer et resultat for hver forespørgselsrække. Dette er i modsætning til en aggregeret operation, som grupperer forespørgselsrækker i en enkelt resultatrække.

Her er et eksempel for at demonstrere konceptet.

Vi har allerede set Kæledyr bord. Vores database har også en Ejere tabel, og den indeholder følgende data:

+-----------+-------------+------------+----------------+-------------------+
| 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]  |
+-----------+-------------+------------+----------------+-------------------+

Vi kan hente data fra disse tabeller og præsentere dem som ét resultatsæt ved at bruge en join.

Vi kan også bruge COUNT() funktion med OVER klausul for at anvende en vinduesfunktion til dataene.

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;

Resultat:

+---------------+-----------+----------------------------------+
| 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                                |
+---------------+-----------+----------------------------------+

I dette tilfælde brugte vi OVER klausul med vores COUNT() klausul for at opdele antallet til kun ejerens navn.

Resultatet er, at ejere med flere kæledyr vises på flere rækker (fordi hvert kæledyr også skal vises), og hver række indeholder det samlede antal af denne ejers kæledyr.

Dette koncept kan også anvendes på andre aggregerede funktioner i SQL, såsom SUM() , MIN() , MAX() og AVG() .

COUNT_BIG()

Hvis du tæller seriøst store datasæt i SQL Server, vil du muligvis opdage, at COUNT() funktion producerer en fejl, fordi tallet er for højt. Dette vil kun ske, dit antal er større end 2.147.483.647.

I sådanne tilfælde kan du bruge COUNT_BIG() , som kan tage højde for meget større antal.

Se hvordan COUNT_BIG() Virker i SQL Server og COUNT() vs COUNT_BIG() for en mere detaljeret forklaring.

ANSI SQL Standard

COUNT() funktion er opført i SQL-standarden, og den er tilgængelig i de fleste (hvis ikke alle) af de store DBMS'er og fungerer stort set det samme på tværs af dem.

For kodeeksempler udført i forskellige DBMS'er, se SQLite COUNT() , SQL Server COUNT() , og MySQL COUNT() .


  1. Bedste praksis:.NET:Hvordan returnerer jeg PK mod en oracle-database?

  2. Betinget INSERT INTO-erklæring i postgres

  3. Liste over områder, der understøttes af Oracle-databasen

  4. Opdater en kolonne i en tabel med en kolonne i en anden tabel i PostgreSQL