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 :

table-info

Pour afficher le résultat souhaité, nous allons exécuter la commande suivante :

SELECT MAX(prix) FROM info
sql-max

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;
max-colonnes

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 :

table-agent

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;
select-groupby

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;
select-max-groupby

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.


Juvénal JVC

Juvénal est spécialisé depuis 2011 dans la valorisation à large échelle des données. Son but est d'aider les professionnels de la data à développer les compétences indispensables pour réussir dans le Big Data. Il travaille actuellement comme Lead Data Engineer auprès des grands comptes. Lorsqu'il n'est pas en voyage, Juvénal rédige des livres ou est en train de préparer la sortie d'un de  ses livres. Vous pouvez télécharger un extrait de son dernier livre en date ici : https://www.data-transitionnumerique.com/extrait-ecosystme-hadoop/

  • Van de Moosdyk R. dit :

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

    • Juvénal JVC dit :

      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

      • Van de Moosdyk R. dit :

        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

        • Juvénal JVC dit :

          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

          • Van de Moosdyk R. dit :

            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

          • Aurélien dit :

            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

  • >