Comptez le nombre d’objets récupérés via une requête
Combien d’objets répondent à un critère (ou une requête SQL) donné ?
Par exemple, admettons qu’un utilisateur de Foodly souhaite savoir combien il existe d’aliments bio, ou que vous souhaitiez compter le nombre d’utilisateurs dans l’application.
Comment pourrait-on retranscrire cela en SQL ?
Il existe le mot clé COUNT
, qui permet justement cela. Appliqué à n’importe quelle commande SQL de type SELECT
, il vous donnera le nombre d’objets récupérés plutôt que leur valeur.
Vous souvenez-vous de la commande que nous avions effectuée pour récupérer uniquement les utilisateurs dont l’e-mail était un Gmail ? Comment l’adapter pour connaître le nombre d’utilisateurs avec une adresse Gmail dans la base ?
C’est simple, voici la commande :
SELECT COUNT(*)
FROM utilisateur
WHERE email LIKE "%gmail.com";
Copiez et collez cette commande dans votre terminal. Que voyez-vous ? Le chiffre 4 je suppose.
MySQL vous affiche le nombre d’objets plutôt que leur contenu. Vous voyez donc combien d’utilisateurs répondent à ce critère.
En effet, vous pouvez essayer la commande suivante :
SELECT COUNT(email)
FROM utilisateur
WHERE email LIKE "%gmail.com";
et constater que nous avons toujours 4 lignes.
Sympa mais à quoi cela sert de mettre une colonne et pas une * ?
Minute papillon j'y arrive ! 😀
Pour mieux comprendre prenons une requête au hasard :
SELECT *
FROM aliment
WHERE nom like "%pomme%";
Si vous tapez cette commande, vous devriez avoir 3 lignes distinctes dont les noms de produits contiennent tous 'pomme'.
Comptons-les :
SELECT COUNT(nom)
FROM aliment
WHERE nom LIKE "%pomme%";
Toujours 3, et on peut voir 'visuellement' que les 3 produits sont bien différents.
Soit, mais si nous avions de millions de produits différents, comment pourrait-on savoir s'il y a des données en double, ou plutôt des doublons ?
Il faudrait compter le nombre de produits qui sont distincts, c'est à dire qui ont un nom différent.
Et bien c'est possible grâce au mot clé DISTINCT
. Cela s'écrit comme ceci :
SELECT COUNT(DISTINCT nom)
FROM aliment
WHERE nom LIKE "%pomme%";
Notez que le résultat est toujours 3.
Mais on sait qu'il y a 3 produits qui ont 'pomme' dans leur nom et que ces 3 produits sont bien distincts. Il n'y a donc pas de doublons dans le nom des produits contenant le mot pomme.
Utilisez des alias
Allez, un dernier point avant de passer à la suite. En tapant la commande précédente on obtient ceci :
+---------------------+
| COUNT(DISTINCT nom) |
+---------------------+
| 3 |
+---------------------+
Sympa, mais leCOUNT(DISTINCT nom)
n'est pas très "sexy".
Je préfèrerai avoir un intitulé plus clair comme "noms différents de produits contenant le mot pomme". Est-ce c'est possible ?
Oui ! Il suffit d'utiliser ce que l'on appelle un alias avec le mot clé AS
. Cela donne :
SELECT COUNT(DISTINCT nom) AS "produits différents contenant le mot pomme"
FROM aliment
WHERE nom LIKE "%pomme%";
cela donne :
+---------------------------------------------+
| produits différents contenant le mot pomme |
+---------------------------------------------+
| 3 |
+---------------------------------------------+
Mieux, non ?
Les alias sont énormément utilisés en SQL. Nous n'allons pas plonger dedans, car cela dépasserait le scope de ce cours, mais retenez qu'ils existent.
Effectuez des opérations sur des données chiffrées
Si l’on peut compter, pourquoi ne pas directement effectuer des opérations ?
Admettons que l’on souhaite connaître le total calorique d’un groupe d’articles, ou bien la contenance moyenne en sucre d’un groupe d’aliments : au lieu de tout noter à la main depuis la base de données, laissez MySQL effectuer ces opérations pour vous !
Pour cela, il existe plusieurs mots clés que vous pouvez appliquer à une colonne lors d’une requête pour en modifier le résultat :
AVG
: nous donne la moyenne de la colonne sur la sélection ;SUM
: nous donne la somme de la colonne sur la sélection ;MAX
: nous donne le maximum de la colonne sur la sélection ;MIN
: nous donne le minimum de la colonne sur la sélection.
Envie de connaître le maximum de teneur en sucre des aliments dans notre base ? Rien de plus simple :
SELECT MAX(sucre) AS "taux de sucre maximum"
FROM aliment;
Nous obtenons :
+-----------------------+
| taux de sucre maximum |
+-----------------------+
| 64 |
+-----------------------+
Plus compliqué : quelle est la teneur moyenne en calories des aliments de 30 kcal ou plus :
SELECT AVG(calories) AS "calories moyennes des aliments > 30g"
FROM aliment
WHERE calories > 30;
Ce qui nous donne :
+--------------------------------------+
| calories moyennes des aliments > 30g |
+--------------------------------------+
| 119.7222 |
+--------------------------------------+
Bien mais peut-on faire mieux ? Par exemple avec la fonction ROUND
?
SELECT ROUND(AVG(calories)) AS "calories moyennes des aliments > 30g"
FROM aliment
WHERE calories > 30;
Je vous laisse taper la commande par vous-même. 😄
Appréhendez la puissance des fonctions
Vous l'aurez compris, en SQL des mots clés commeSUM
, MIN
, MAX
, AVG
, COUNT
, ROUND
, il en existe beaucoup !
Ce sont d'ailleurs plus que des mots clés, ce sont des fonctions. Elles ont pour particularités de s'appliquer à un type de donnée et de s'écrire avec des parenthèses.
Il en existe que pour les nombres ?
Et bien non ! Il en existe pour les dates, pour les textes, et pour toutes sortes de choses.
Pour passer du texte en majuscule on peut utiliserUPPER
, pour connaitre la date actuelle on peut utiliserNOW
etc..
Attends une minute, il faut que j'apprenne toutes les fonctions SQL ?
Non, rassurez-vous...
Pas besoin de les apprendre. Une petite recherche Google suffira à les retrouver.
Moi-même je n'en connais - par cœur - pas plus d'une dizaine. Pour le reste, mon ami Google est à ma disposition 24h/24, 7j/7. 😉
À vous de jouer !
Je vous laisse tester ces opérations avec MIN
et SUM
!
Pour voir à quoi cela ressemble dans le terminal, voici un screencast explicatif où je reprends une à une toutes ces commandes sur la liste des aliments qui ne sont pas bio :
En résumé
Il est possible de compter le nombre de lignes d'une requête grâce à la fonction
COUNT
.Pour identifier des doublons on peut utiliser la fonction
COUNT
combinée à la fonctionDISTINCT
.On peut utiliser des alias grâce au mot clé
AS
pour renommer des variables ou des colonnes .SQL propose une très grande variété de fonctions pour les nombres, pour les textes ou pour les dates.