Nous continuons dans notre série d’articles sur le langage SQL et cette fois-ci, nous allons découvrir une fonction. En SQL, pour trouver la valeur maximale dans une colonne de donnée de type numérique ou alphanumérique, il faut utiliser la fonction d’agrégation SQL MAX ().
On peut s’en servir, par exemple, pour connaître le produit le plus cher dans la base de données d’une boutique. Pareillement, pour obtenir la note la plus élevée d’un élève ou encore pour déterminer l’âge maximum d’une personne dans une liste, c’est cette fonction qu’il faut utiliser.
SQL MAX : syntaxe
La syntaxe de la fonction max en SQL est la suivante :
SELECT MAX (nom_colonne) FROM table
Cette fonction peut être combinée avec la commande GROUP BY et la syntaxe ressemblera à ceci :
SELECT colonne1, MAX (colonne2) FROM table GROUP BY colonne1
Illustration de la fonction MAX ()
Considérons que nous avons la table de données d’un site e-commerce de vente de matériel informatique et que l’on souhaite obtenir la valeur maximum des produits. La table que nous allons utiliser ressemble à ceci :
Pour afficher le résultat souhaité, nous allons exécuter la commande suivante :
SELECT MAX(prix) FROM info
Le résultat ci-dessus montre juste le prix du produit élevé. Toutefois, nous avons la possibilité d’afficher le nom du produit le plus cher en même temps que son prix. Pour ce faire, il faut ajouter le nom ainsi que son id à notre requête :
SELECT id, nom, MAX(prix) FROM info;
Comment utiliser la fonction MAX () avec la clause GROUP BY ?
Il est possible d’utiliser la clause GROUP BY avec la fonction MAX() pour obtenir la valeur maximum d’une colonne sur chaque groupe. Utilisons la table suivante pour illustrer cela :
Pour obtenir les informations sur le lieu et la commission maximale pour chaque agent de chaque lieu à partir de la table agent, l’instruction à exécuter est la suivante :
SELECT Lieu, MAX(commi) FROM agent GROUP BY Lieu;
Comment utiliser la fonction SQL MAX () avec la clause GROUP BY et ORDER BY ?
On peut également utiliser la fonction MAX() avec GROUP BY et ORDER BY afin de grouper le résultat obtenu en fonction d’un champ précis et dans un ordre préétabli.
Par exemple, pour obtenir les données du pays, du lieu et de la commission maximale de la table agent, la requête ressemblera à ceci :
SELECT pays, Lieu, MAX(commi) FROM agent GROUP BY pays, Lieu ORDER BY pays;
Comment utiliser la fonction MAX () avec la clause HAVING ?
HAVING est la clause que l’on utilise avec GROUP BY pour filtrer les groupes de résultats en fonction d’une condition spécifique. On peut inclure cette clause à une requête contenant une fonction MAX() et une instruction GROUP BY.
L’exemple suivant recherche les noms des agents et la commission la plus élevée pour chacun. De plus, il utilise la clause HAVING pour filtrer tous les agents dont la commission la plus élevée est inférieure ou égale à 0.15 :
SELECT
nom_agent,
MAX(commi) max_list_price
FROM
agent
GROUP BY
nom_agent
HAVING
MAX(commi) > 0.15
ORDER BY
max_list_price DESC;
En conclusion, la fonction MAX() ne traite pas les valeurs nulles. Quand il ne trouve aucune ligne à sélectionner, il retourne une valeur nulle. Elle est déterministe lorsqu’elle est employée avec les clauses OVER et ORDER BY.
Nous terminons cet article sur la fonction MAX() avec cette conclusion. Vous connaissez maintenant tous les cas d’utilisation de cette fonction d’agrégation et vous pouvez les appliquer dans vos prochaines requêtes SQL. Si vous souhaitez continuer votre apprentissage, vous pouvez vous rendre sur notre blog, car nous avons plusieurs articles sur ce langage. Nous vous invitons aussi à télécharger gratuitement cette formation sur Spark avec Scala si vous souhaitez augmenter vos compétences en Big Data.
Votre instruction « SELECT id, nom, MAX(prix) FROM info » ne retourne pas le nom correspondant au prix maximum mais uniquement le premier nom (« clavier »). On pourrait s’attendre à ce qu’elle retourne « Disque dur » mais ce n’est pas le cas. Comment faire ??
Bonjour Van,
c’est une erreur de notre part. en fait, il faudrait rajouter un GROUP BY sur l’id.
Voici la requête SQL exacte :
SELECT id, MAX(prix) FROM info GROUP BY id
Cordialement,
Juvénal
Bonjour,
Je ne suis pas certain que cette requête fournisse le résultat escompté. Je l’ai appliquée à une table et je reçois une ligne par ID mais pas un ligne unique correspondant au maximum. Ceci correspond d’ailleurs à votre exemple « SELECT Lieu, MAX(commi) FROM agent GROUP BY Lieu; » qui renvoie le maximum pour chaque valeur de Lieu mais pas le maximum de toute la table (dans le cas « GROUP BY ID » on reçoit le max pour chaque ID càd la valeur de chaque ligne car les ID sont en principe uniques et chaque groupe ne contient donc qu’une seule ligne)
Cdlt,
R. Van de Moosdyk
Bonjour Van,
Ah ok. Je n’ai pas perçu que tu voulais une ligne unique correspondant au maximum. Dans ce cas, il te suffit de faire : SELECT MAX(commi) FROM agent ;
Cela te renverra le résultat escompté.
Cordialement,
Juvénal
Bonjour,
On revient à ma première question. Je ne veux pas que la valeur max mais aussi celle d’un autre champ issu de l’enregistrement dont provient cette valeur max (le champ « nom » p.ex.). Et la commande « SELECT id, nom, MAX(prix) FROM info » citée plus haut dans cet article ne retourne pas la bonne valeur du champ « nom » ( l’exemple montre « nom = clavier » alors qu’on s’attend à recevoir « nom = disque dure » qui est celle correspondant à la valeur maximale de 252 pour le champ « prix »; la valeur « clavier n’est pas celle dont le prix vaut 252!). Je ne vois toujours pas comment faire.
Cordialement,
R. Van de Moosdyk
Bonjour,
Je pense que c’est cette requête qu’il vous faut
SELECT nom FROM info
WHERE info.prix in (SELECT MAX(prix) FROM info);
Cordialement
Aurélien