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

SQL AVG() pour les débutants

En SQL, le AVG() La fonction est une fonction d'agrégation qui renvoie la moyenne de toutes les valeurs d'une expression donnée.

Il peut également être utilisé pour renvoyer la moyenne de toutes les valeurs distinctes (uniques) dans une expression.

L'expression doit être numérique (il ne peut pas s'agir d'une chaîne de caractères, d'une chaîne de bits ou d'une date/heure).

Vous trouverez ci-dessous quelques exemples de base pour montrer comment cela fonctionne.

Exemple de tableau

Supposons que nous ayons le tableau suivant :

SELECT * FROM Products; 

Résultat :

+-------------+------------+--------------------------- --------------+----------------+------------------ ------------------------+| ID produit | ID du fournisseur | NomProduit | ProduitPrix | Description du produit ||-------------+------------+-------------------- -------------+----------------+---------------------------- ----------------------|| 1 | 1001 | Tournevis gaucher | 25,99 | Violet. Comprend une boîte de transport pour gaucher. || 2 | 1001 | Poids long (bleu) | 14.75 | Comprend une longue attente. || 3 | 1001 | Poids long (vert) | 11,99 | Environ 30 minutes d'attente. || 4 | 1002 | Marteau de masse | 33,49 | Manche en bois. Verres à vin gratuits. || 5 | 1003 | Tronçonneuse | 245,00 | Orange. Comprend des doigts de rechange. || 6 | 1003 | Boîte pour chien en paille | NUL | Attaché avec des vignes. Très à croquer. || 7 | 1004 | Tasses à café sans fond (lot de 4) | 9,99 | Céramique brune avec poignée solide. || 8 | 1001 | Tournevis droitier | 25,99 | Bleu. Comprend une boîte de transport pour droitier. |+-------------+------------+--------------------- ------------+----------------+-------------------- ---------------------+

Exemple

Nous pouvons utiliser la requête suivante pour obtenir la moyenne de tous les prix.

SELECT AVG(ProductPrice)
FROM Products; 

Résultat :

+--------------------+| (Aucun nom de colonne)   ||--------------------|| 52.457142          |+--------------------+

Dans ce cas, les informations de prix sont stockées dans le ProductPrice colonne, et nous la passons donc comme argument à la AVG() fonction, qui calcule ensuite la moyenne et renvoie le résultat.

Utiliser des alias de colonne

Vous remarquerez que les résultats précédents n'incluent pas de nom de colonne. Il faut s'y attendre, car le AVG() La fonction ne renvoie aucune colonne. Vous pouvez facilement fournir un nom de colonne en attribuant un alias.

SELECT AVG(ProductPrice) AS Average
FROM Products; 

Résultat :

+-----------+| Moyenne   ||-----------|| 52.457142 |+-----------+

Résultats filtrés

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

SELECT AVG(ProductPrice) AS Average
FROM Products
WHERE VendorId = 1001; 

Résultat :

+-----------+| Moyenne   ||-----------|| 19.680000 |+-----------+

Dans ce cas, 19,680000 est le prix moyen de tous les produits proposés par le fournisseur spécifié.

NULL Valeurs

Le AVG() la fonction ignore tout NULL valeurs. Dans notre exemple de tableau ci-dessus, numéro de produit 6 a NULL dans son ProductPrice colonne, mais cela a été ignoré dans notre AVG() exemple.

En fonction de votre SGBD et de vos paramètres, vous pouvez ou non voir un avertissement indiquant que NULL les valeurs ont été éliminées dans le jeu de résultats.

Voici un exemple de ce que vous pourriez voir :

SELECT AVG(ProductPrice) AS Average
FROM Products; 

Résultat :

+-----------+| Moyenne   ||-----------|| 52.457142 |+-----------+Avertissement :la valeur nulle est éliminée par un agrégat ou une autre opération SET.

Tout cela nous indique que la colonne contenait au moins un NULL valeur, et qu'elle a été ignorée lors du calcul des résultats.

Données de date/heure

Le AVG() la fonction n'accepte pas les expressions de date/heure.

Supposons que nous ayons le tableau suivant :

SELECT PetName, DOB 
FROM Pets; 

Résultat :

+-----------+------------+| NomAnimal | Date de naissance ||-----------+------------|| Moelleux | 2020-11-20 || Récupérer | 2019-08-16 || gratter | 2018-10-01 || remuer | 2020-03-15 || Tweeter | 2020-11-28 || Moelleux | 2020-09-17 || Écorce | NUL || Miaou | NULL |+-----------+------------+

Si nous essayons d'utiliser AVG() le DOB colonne, nous aurons une erreur.

SELECT AVG(DOB) AS Average
FROM Pets; 

Résultat :

Msg 8117, Niveau 16, État 1, Ligne 1Le type de données de l'opérande date n'est pas valide pour l'opérateur avg.

Données de personnage

Le AVG() la fonction n'accepte pas non plus les expressions de chaînes de caractères.

Voici ce qui se passe si nous essayons d'utiliser AVG() sur le ProductName colonne de nos Products table (qui utilise un type de données de varchar):

SELECT AVG(ProductName) AS Average
FROM Products; 

Résultat :

Msg 8117, Niveau 16, État 1, Ligne 1Le type de données d'opérande varchar n'est pas valide pour l'opérateur avg.

Le DISTINCT Mot clé

Vous pouvez utiliser le DISTINCT mot-clé avec AVG() pour ne calculer que des valeurs distinctes. Autrement dit, s'il existe des valeurs en double, elles sont traitées comme une seule valeur.

Exemple :

SELECT AVG(DISTINCT ProductPrice) AS DistinctAverage
FROM Products; 

Résultat :

+-------------------+| Moyenne distincte   ||-------------------|| 56.868333         |+-------------------+

Nous pouvons voir que ce résultat est supérieur au résultat obtenu sans le DISTINCT mot-clé.

Pour récapituler, nous avons obtenu 52,457142 sans le DISTINCT mot-clé, et 56.868333 avec le DISTINCT mot-clé.

En effet, deux articles partagent le même prix (le tournevis pour gaucher et le tournevis pour droitier sont tous deux au prix de 25,99). Par conséquent, le AVG() fonction, lorsqu'elle est utilisée avec la fonction DISTINCT mot-clé, traite ces deux valeurs comme une seule et calcule son résultat en conséquence.

Fonctions de la fenêtre

Selon votre SGBD, vous pourrez peut-être utiliser un OVER clause avec votre AVG() 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 Products table. Notre base de données possède également un Customers table, et elle contient les données suivantes :

+--------------+----------------------+-------- -----------+------------+-----------------+------- -----+-----------+----------------+| ID client | NomClient | AdressePostale | Ville | ÉtatProvince | Code postal | Pays | Téléphone ||--------------+----------------------+--------- ----------+------------+-----------------+-------- ----+-----------+----------------+| 1001 | garde-manger palmier | 20 Esplanade | Townville | QLD | 2040 | AUS | (308) 555-0100 || 1002 | Grand coquelicot | 12 route principale | Colomb | OH | 43333 | États-Unis | (310) 657-0134 || 1003 | Créatures folles | 10 boucles infinies | Cairns | QLD | 4870 | AUS | (418) 555-0143 || 1004 | Oups Média | 4 promenade en bord de mer | Perth | WA | 1234 | AUS | (405) 443-5987 || 1005 | Noms étranges Inc. | 789, rue George | Sidney | Nouvelle-Galles du Sud | 2000 | AUD | (318) 777-0177 || 1006 | Solutionnistes Hi-Five | 5 rue principale | Hautes Terres | SALUT | 1254 | AUS | (415) 413-5182 |+--------------+----------------------+---- ---------------+------------+-----------------+--- ---------+-----------+----------------+

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 AVG() fonction avec le OVER clause pour appliquer une fonction de fenêtre aux données.

SELECT 
    v.VendorName,
    p.ProductName,
    p.ProductPrice,
    AVG(ProductPrice) OVER (PARTITION BY v.VendorName) AS "Average For This Vendor"
FROM Products p 
INNER JOIN Vendors v 
ON v.VendorId = p.VendorId
ORDER BY VendorName, ProductPrice, "Average For This Vendor"; 

Résultat :

+---------------+------------------------------ ---+-----------------+---------------------------+| Nom du fournisseur    | Nom du produit                     | ProduitPrix   | Moyenne pour ce fournisseur   ||---------------+----------------------------------- -----+-----------------+--------------------------- || Chatons Katty | Tasses à café sans fond (lot de 4) | 9,99           | 9.99000                  || Fournitures Mars | Poids long (vert)             | 11,99          | 19.680000                 || Fournitures Mars | Poids long (bleu)              | 14.75          | 19.680000                 || Fournitures Mars | Tournevis pour droitier        | 25,99          | 19.680000                 || Fournitures Mars | Tournevis pour gaucher         | 25,99          | 19.680000                 || Médailles de pédale | Boîte pour chien en paille                   | NULL           | 245.000000                || Médailles de pédale | Tronçonneuse                        | 245,00         | 245.000000                || Randy Couvreurs | Marteau de forgeron                   | 33.49          | 33.490000                 |+---------------+------------------------------ --+----------------+-----------------------------------+ 

Dans ce cas, nous avons utilisé le OVER clause avec notre AVG() fonction pour partitionner le résultat par nom de fournisseur.

Ce faisant, nous avons pu renvoyer des informations sur les prix de chaque produit, ainsi que le prix moyen de tous les produits de ce fournisseur donné. Le prix moyen change à mesure que le fournisseur change (à moins que plusieurs fournisseurs aient la même moyenne), mais reste le même pour tous les produits du même fournisseur.

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