sql >> Databasteknik >  >> RDS >> Database

SQL COUNT() för nybörjare

I SQL, COUNT() funktion är en aggregerad funktion som returnerar antalet objekt som finns i en grupp.

Du kan använda COUNT() i flera delar av en fråga. Du kan till exempel använda den i SELECT listan, eller HAVING sats vid filtrering av grupper.

Exempeltabell

Anta att vi har följande tabell:

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öljande exempel kommer att använda COUNT() funktion när du frågar den här tabellen.

Exempel

Här är ett enkelt exempel för att komma igång.

SELECT COUNT(*) AS Count
FROM Pets;

Resultat:

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

Detta säger oss att det finns 8 rader i tabellen. Vi vet det eftersom vi använde asterisk-jokertecknet (* ) för att ange alla rader och alla kolumner.

Räkna en specifik kolumn

Du kan också ange att en viss kolumn ska räknas. COUNT() funktionen räknar endast icke-NULL resultat, så om du anger en kolumn som innehåller NULL värden, kommer dessa värden inte att räknas.

Här är ett exempel för att visa vad jag menar.

SELECT COUNT(DOB) AS Count
FROM Pets;

Resultat:

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

I det här fallet, Husdjur Tabellen innehåller två NULL värden i DOB kolumnen (två husdjur har inte angett sitt födelsedatum) och så COUNT(DOB) returnerar 6 istället för 8 när vi använde COUNT(*) .

Orsaken COUNT(*) i föregående exempel returnerade alla rader, beror på att de två raderna gjorde har data i de andra kolumnerna.

I mitt exempel returnerade min DBMS också en varning om detta. Du får eller kanske inte får en varning, beroende på ditt DBMS och din specifika konfiguration.

Filtrerade resultat

COUNT() funktion räknar raderna som returneras av frågan. Så om du filtrerar resultaten blir resultatet av COUNT() kommer att återspegla det.

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

Resultat:

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

I det här fallet finns det två husdjur med namnet Fluffy. Därför skulle två rader ha returnerats av frågan och resultatet av COUNT() är 2 .

Räkna distinkta kolumner

Som standard är COUNT() funktionen inkluderar en implicit ALL nyckelord. Det betyder att den inkluderar dubbletter i sina resultat.

Men du har också möjlighet att lägga till DISTINCT nyckelord för att ange att bara distinkta värden returneras. Det vill säga, du kan ange att det utesluter dubbletter.

Låt oss välja PetName kolumn. Om du tittar på den ursprungliga tabellen ovan kan du se att PetName kolumnen innehåller två rader med samma värde (Fluffy ).

Först kör vi en COUNT(ALL PetName) fråga för att inkludera alla dubbletter av värden i antalet:

SELECT COUNT(ALL PetName) AS Count
FROM Pets;

Resultat:

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

Så det finns åtta rader. Kom ihåg att detta är samma resultat som vi skulle få om vi inte hade inkluderat ALL nyckelord, eftersom ALL är standard.

Nu kör vi en COUNT(DISTINCT PetName) för att eliminera eventuella dubbletter från räkningen.

SELECT COUNT(DISTINCT PetName) AS Count
FROM Pets;

Resultat:

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

Den här gången är resultatet 7 . Detta beror på att vårt dubblettvärde har eliminerats. Det vill säga, dubblettvärdet behandlades som om det bara fanns ett värde.

Med COUNT() med HAVING Klausul

Du kan inkludera COUNT() fungerar i flera delar av en fråga. Det är inte bara begränsat till SELECT lista.

Här är ett exempel som använder COUNT() i både HAVING satsen och SELECT lista.

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 det här fallet använde vi HAVING sats i kombination med GROUP BY sats för att returnera bara de rader som har en COUNT(PetTypeId) större än 2 .

Du är inte begränsad till bara ) Operatör för nybörjare">större än operatör (> ) när du använder HAVING klausul. Du kan använda samma operatorer som du kan använda med WHERE klausul (som = , ) Operatör för nybörjare">< , =) Operatör för nybörjare">>= , IN , GILLA osv.).

Se SQL-operatorer för en lista över tillgängliga operatorer i SQL.

Fönsterfunktioner

Beroende på ditt DBMS kan du kanske använda en OVER sats med din COUNT() funktion för att skapa en fönsterfunktion.

En fönsterfunktion utför en aggregatliknande operation på en uppsättning frågerader. Det ger ett resultat för varje frågerad. Detta till skillnad från en aggregerad operation, som grupperar frågerader i en enda resultatrad.

Här är ett exempel för att demonstrera konceptet.

Vi har redan sett Husdjur tabell. Vår databas har också en Ägare tabell och den innehåller följande 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 hämta data från dessa tabeller och presentera dem som en resultatuppsättning genom att använda en join.

Vi kan också använda COUNT() funktion med OVER sats för att tillämpa en fönsterfunktion på data.

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 det här fallet använde vi OVER sats med vår COUNT() klausul för att dela upp antalet till bara ägarens namn.

Resultatet är att ägare med flera husdjur visas på flera rader (eftersom varje husdjur också måste visas), och varje rad innehåller det sammanlagda antalet ägares husdjur.

Det här konceptet kan också tillämpas på andra aggregerade funktioner i SQL, såsom SUM() , MIN() , MAX() och AVG() .

COUNT_BIG()

Om du räknar allvarligt stora datamängder i SQL Server kan du upptäcka att COUNT() funktionen ger ett fel, på grund av att antalet är för högt. Detta kommer bara att hända ditt antal är större än 2 147 483 647.

I sådana fall kan du använda COUNT_BIG() , som kan ta emot mycket större antal.

Se hur COUNT_BIG() Fungerar i SQL Server och COUNT() kontra COUNT_BIG() för en mer detaljerad förklaring.

ANSI SQL Standard

COUNT() funktion är listad i SQL-standarden, och den är tillgänglig i de flesta (om inte alla) av de stora DBMS:erna och fungerar ungefär likadant över dem.

För kodexempel gjorda i olika DBMS, se SQLite COUNT() , SQL Server COUNT() , och MySQL COUNT() .


  1. Förstå vad sp_updatestats verkligen uppdaterar

  2. Markörbaserade poster i PostgreSQL

  3. Hur man skapar ett tillägg för SSMS 2019 (v18)

  4. SQL - Call Stored Procedure för varje post