Database
 sql >> Base de données >  >> RDS >> Database

SQL COUNT() pour les débutants

En SQL, le COUNT() La fonction est une fonction d'agrégation qui renvoie le nombre d'éléments trouvés dans un groupe.

Vous pouvez utiliser COUNT() dans plusieurs parties d'une requête. Par exemple, vous pouvez l'utiliser dans le SELECT liste, ou la HAVING clause lors du filtrage des groupes.

Exemple de tableau

Supposons que nous ayons le tableau suivant :

SELECT * FROM Pets;

Résultat :

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

Les exemples suivants utiliseront le COUNT() fonction lors de l'interrogation de cette table.

Exemple

Voici un exemple simple pour commencer.

SELECT COUNT(*) AS Count
FROM Pets;

Résultat :

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

Cela nous indique qu'il y a 8 lignes dans le tableau. Nous le savons parce que nous avons utilisé le caractère générique astérisque (* ) pour spécifier toutes les lignes et toutes les colonnes.

Compter une colonne spécifique

Vous pouvez également spécifier une colonne particulière à compter. Le COUNT() la fonction ne compte que les non-NULL résultats, donc si vous spécifiez une colonne qui contient NULL valeurs, ces valeurs ne seront pas comptées.

Voici un exemple pour illustrer ce que je veux dire.

SELECT COUNT(DOB) AS Count
FROM Pets;

Résultat :

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

Dans ce cas, les Pets table contient deux NULL valeurs dans le DOB colonne (deux animaux n'ont pas fourni leur date de naissance), et donc COUNT(DOB) renvoie 6, au lieu de 8 lorsque nous utilisions COUNT(*) .

La raison COUNT(*) dans l'exemple précédent a renvoyé toutes les lignes, c'est parce que ces deux lignes l'ont fait avoir des données dans les autres colonnes.

Dans mon exemple, mon SGBD a également renvoyé un avertissement à ce sujet. Vous pouvez ou non recevoir un avertissement, selon votre SGBD et votre configuration spécifique.

Résultats filtrés

Le COUNT() La fonction compte les lignes renvoyées par la requête. Donc, si vous filtrez les résultats, le résultat de COUNT() reflétera cela.

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

Résultat :

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

Dans ce cas, il y a deux animaux de compagnie avec un nom de Fluffy. Par conséquent, deux lignes auraient été renvoyées par la requête, et le résultat de COUNT() est 2 .

Compter des colonnes distinctes

Par défaut, le COUNT() la fonction inclut un ALL implicite mot-clé. Cela signifie qu'il inclut les doublons dans ses résultats.

Mais vous avez également la possibilité d'ajouter le DISTINCT mot-clé pour spécifier que seules des valeurs distinctes sont renvoyées. Autrement dit, vous pouvez spécifier qu'il exclut les doublons.

Choisissons le PetName colonne. Si vous regardez le tableau original ci-dessus, vous pouvez voir que le PetName la colonne comprend deux lignes avec la même valeur (Fluffy ).

Nous allons d'abord exécuter un COUNT(ALL PetName) requête pour inclure toutes les valeurs en double dans le décompte :

SELECT COUNT(ALL PetName) AS Count
FROM Pets;

Résultat :

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

Donc, il y a huit rangées. Rappelez-vous que c'est le même résultat que nous aurions obtenu si nous n'avions pas inclus le ALL mot-clé, car ALL est la valeur par défaut.

Nous allons maintenant exécuter un COUNT(DISTINCT PetName) pour éliminer les doublons du décompte.

SELECT COUNT(DISTINCT PetName) AS Count
FROM Pets;

Résultat :

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

Cette fois, le résultat est 7 . C'est parce que notre valeur en double a été éliminée. Autrement dit, la valeur en double a été traitée comme s'il n'y avait qu'une seule valeur.

Utiliser COUNT() avec le HAVING Article

Vous pouvez inclure le COUNT() fonction dans plusieurs parties d'une requête. Ce n'est pas seulement limité au SELECT liste.

Voici un exemple qui utilise COUNT() à la fois dans le HAVING clause et le SELECT liste.

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

Résultat :

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

Dans ce cas, nous avons utilisé le HAVING clause en conjonction avec le GROUP BY clause pour renvoyer uniquement les lignes qui ont un COUNT(PetTypeId) supérieur à 2 .

Vous n'êtes pas limité à l'opérateur ) pour les débutants » > opérateur supérieur à (> ) lors de l'utilisation de HAVING clause. Vous pouvez utiliser les mêmes opérateurs que vous pouvez utiliser avec WHERE clause (telle que = , ) Operator for Beginners">< , =) Operator for Beginners">>= , IN , LIKE , etc.).

Voir Opérateurs SQL pour une liste des opérateurs disponibles dans SQL.

Fonctions de la fenêtre

Selon votre SGBD, vous pourrez peut-être utiliser un OVER clause avec votre COUNT() fonction pour créer une fonction de fenêtre.

Une fonction de fenêtre effectue une opération de type agrégat sur un ensemble de lignes de requête. Il produit un résultat pour chaque ligne de requête. Cela contraste avec une opération d'agrégation, qui regroupe les lignes de requête en une seule ligne de résultat.

Voici un exemple pour illustrer le concept.

Nous avons déjà vu les Pets table. Notre base de données a également un Owners table, et elle contient les données suivantes :

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

Nous pouvons récupérer des données à partir de ces tables et les présenter sous la forme d'un ensemble de résultats à l'aide d'une jointure.

Nous pouvons également utiliser le COUNT() fonction avec le OVER clause pour appliquer une fonction de fenêtre aux données.

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;

Résultat :

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

Dans ce cas, nous avons utilisé le OVER clause avec notre COUNT() clause pour partitionner le compte uniquement au nom du propriétaire.

Le résultat est que les propriétaires de plusieurs animaux sont affichés sur plusieurs lignes (car chaque animal doit également être affiché), et chaque ligne contient le nombre total d'animaux de ce propriétaire.

Ce concept peut également être appliqué à d'autres fonctions d'agrégation en SQL, telles que SUM() , MIN() , MAX() , et AVG() .

COUNT_BIG()

Si vous comptez des ensembles de données très volumineux dans SQL Server, vous constaterez peut-être que le COUNT() fonction produit une erreur, car le nombre est trop élevé. Cela n'arrivera que si votre nombre est supérieur à 2 147 483 647.

Dans de tels cas, vous pouvez utiliser COUNT_BIG() , qui peut prendre en charge des nombres beaucoup plus importants.

Découvrez comment COUNT_BIG() Fonctionne dans SQL Server et COUNT() contre COUNT_BIG() pour une explication plus détaillée.

Norme SQL ANSI

Le COUNT() La fonction est répertoriée dans la norme SQL, et elle est disponible dans la plupart (sinon la totalité) des principaux SGBD, et fonctionne à peu près de la même manière entre eux.

Pour des exemples de code réalisés dans divers SGBD, voir SQLite COUNT() , SQL Server COUNT() , et MySQL COUNT() .