sql >> Databáze >  >> RDS >> Database

SQL COUNT() pro začátečníky

V SQL, COUNT() function je agregační funkce, která vrací počet položek nalezených ve skupině.

Můžete použít COUNT() ve více částech dotazu. Můžete jej například použít v SELECT nebo HAVING klauzule při filtrování skupin.

Ukázková tabulka

Předpokládejme, že máme následující tabulku:

SELECT * FROM Pets;

Výsledek:

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

Následující příklady budou používat COUNT() funkce při dotazu na tuto tabulku.

Příklad

Zde je jednoduchý příklad, jak začít.

SELECT COUNT(*) AS Count
FROM Pets;

Výsledek:

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

To nám říká, že v tabulce je 8 řádků. Víme to, protože jsme použili zástupný znak hvězdička (* ) specifikovat všechny řádky a všechny sloupce.

Počítání konkrétního sloupce

Můžete také určit konkrétní sloupec, který se má počítat. COUNT() funkce počítá pouze jiné než NULL výsledky, takže pokud zadáte sloupec, který obsahuje NULL hodnoty, tyto hodnoty se nebudou počítat.

Zde je příklad, který demonstruje, co tím myslím.

SELECT COUNT(DOB) AS Count
FROM Pets;

Výsledek:

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

V tomto případě Pets tabulka obsahuje dvě NULL hodnoty v DOB sloupec (dva domácí mazlíčci neuvedli své datum narození), a tak COUNT(DOB) vrátí 6 místo 8, když jsme použili COUNT(*) .

Důvod COUNT(*) v předchozím příkladu vrátil všechny řádky, protože tyto dva řádky uvedly mít data v ostatních sloupcích.

V mém příkladu můj DBMS také vrátil varování o tomto. V závislosti na vaší DBMS a vaší konkrétní konfiguraci se může nebo nemusí zobrazit varování.

Filtrované výsledky

COUNT() Funkce počítá řádky vrácené dotazem. Pokud tedy filtrujete výsledky, výsledek COUNT() to bude odrážet.

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

Výsledek:

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

V tomto případě jsou to dva mazlíčci se jménem Fluffy. Dotaz by tedy vrátil dva řádky a výsledek COUNT() je 2 .

Počítání odlišných sloupců

Ve výchozím nastavení COUNT() funkce obsahuje implicitní ALL klíčové slovo. To znamená, že ve výsledcích zahrnuje duplikáty.

Ale máte také možnost přidat DISTINCT klíčové slovo pro určení, že budou vráceny pouze odlišné hodnoty. To znamená, že můžete určit, že to vylučuje duplikáty.

Vyberme PetName sloupec. Pokud se podíváte na původní tabulku výše, můžete vidět, že PetName sloupec obsahuje dva řádky se stejnou hodnotou (Fluffy ).

Nejprve spustíme COUNT(ALL PetName) dotaz k zahrnutí všech duplicitních hodnot do počtu:

SELECT COUNT(ALL PetName) AS Count
FROM Pets;

Výsledek:

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

Existuje tedy osm řádků. Pamatujte, že toto je stejný výsledek, jaký bychom dostali, kdybychom nezahrnuli ALL klíčové slovo, protože ALL je výchozí.

Nyní spustíme COUNT(DISTINCT PetName) k odstranění všech duplikátů z počítání.

SELECT COUNT(DISTINCT PetName) AS Count
FROM Pets;

Výsledek:

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

Tentokrát je výsledek 7 . Důvodem je, že naše duplicitní hodnota byla odstraněna. To znamená, že s duplicitní hodnotou bylo zacházeno, jako by existovala pouze jedna hodnota.

Pomocí COUNT() pomocí HAVING Ustanovení

Můžete zahrnout COUNT() funkce ve více částech dotazu. Není omezeno pouze na SELECT seznam.

Zde je příklad, který používá COUNT() v obou HAVING klauzule a SELECT seznam.

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

Výsledek:

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

V tomto případě jsme použili HAVING klauzule ve spojení s GROUP BY klauzule vrátit pouze ty řádky, které mají COUNT(PetTypeId) větší než 2 .

Nejste omezeni pouze na ) Operátor pro začátečníky”>větší než operátor (> ) při použití HAVING doložka. Můžete použít stejné operátory, které můžete použít s WHERE klauzule (například = , ) Operator for Beginners">< , =) Operator for Beginners">>= , IN , LIKE , atd.).

Seznam operátorů dostupných v SQL naleznete v části Operátory SQL.

Funkce okna

V závislosti na vašem DBMS možná budete moci použít OVER klauzule s vaším COUNT() funkce pro vytvoření funkce okna.

Funkce okna provádí operaci podobnou agregaci na sadě řádků dotazu. Vytváří výsledek pro každý řádek dotazu. To je na rozdíl od agregované operace, která seskupuje řádky dotazu do jednoho řádku výsledku.

Zde je příklad pro demonstraci konceptu.

Už jsme viděli Pets stůl. Naše databáze má také Owners tabulka a obsahuje následující údaje:

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

Můžeme načíst data z těchto tabulek a prezentovat je jako jednu sadu výsledků pomocí spojení.

Můžeme také použít COUNT() funkce s OVER klauzule k aplikaci funkce okna na 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;

Výsledek:

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

V tomto případě jsme použili OVER klauzule s naším COUNT() klauzule k rozdělení počtu pouze na jméno vlastníka.

Výsledkem je, že majitelé s více mazlíčky jsou zobrazeni na více řádcích (protože každé domácí zvíře musí být také zobrazeno) a každý řádek obsahuje celkový počet mazlíčků tohoto majitele.

Tento koncept lze také aplikovat na další agregační funkce v SQL, jako je SUM() , MIN() , MAX() a AVG() .

COUNT_BIG()

Pokud na serveru SQL počítáte opravdu velké datové sady, možná zjistíte, že COUNT() funkce způsobí chybu, protože číslo je příliš vysoké. To se stane pouze váš počet je větší než 2 147 483 647.

V takových případech můžete použít COUNT_BIG() , která dokáže pokrýt mnohem větší počty.

Viz Jak COUNT_BIG() Funguje v SQL Server a COUNT() vs COUNT_BIG() pro podrobnější vysvětlení.

Standard ANSI SQL

COUNT() funkce je uvedena ve standardu SQL a je k dispozici ve většině (ne-li ve všech) hlavních DBMS a funguje v nich téměř stejně.

Příklady kódu provedené v různých DBMS najdete v SQLite COUNT() , SQL Server COUNT() a MySQL COUNT() .


  1. Jak změním výchozí schéma ve vývojáři sql?

  2. Ad-hoc spojovací řetězce a heterogenní dotazy pro MS Access

  3. Vyhledávání bez rozlišení malých a velkých písmen v Oracle

  4. Psaní volitelných parametrů v rámci uložených procedur v MySQL?