Retour à la liste des articles Articles
9 minutes de lecture

Les fonctions SQL MIN et MAX expliquées en 6 exemples

Que sont les fonctions SQL MIN() et MAX() ? Quand devez-vous les utiliser comme fonctions d'agrégation et quand devez-vous les utiliser avec des fonctions de fenêtre ? Nous l'expliquons à l'aide d'exemples pratiques.

Il est difficile d'imaginer SQL sans les fonctions d'agrégation MIN() et MAX(). Elles sont très utiles chez de nombreux professionnels des données car elles nous permettent de résoudre de nombreux problèmes commerciaux. Dans cet article, je vais expliquer ce que fait chaque fonction et aborder plusieurs cas d'utilisation.

Commençons.

Qu'est-ce que la fonction MIN() en SQL ?

La norme SQL, prise en charge par la plupart des moteurs de bases de données relationnelles, comprend plusieurs fonctions d'agrégation. Ces fonctions d'agrégation effectuent des calculs sur des données numériques. Le Guide du débutant sur les fonctions d'agrégation SQL les aborde toutes en détail ; cet article ne porte que sur deux de ces fonctions : MIN() et MAX().

Tout d'abord, parlons de la fonction MIN(). Elle renvoie la plus petite valeur d'un ensemble de valeurs. Ces valeurs peuvent provenir d'une colonne numérique ou être le résultat d'une expression renvoyant une valeur numérique. (Remarque : la colonne peut provenir d'une table ou d'une vue.) Il s'agit d'une fonction scalaire qui renvoie une valeur numérique.

La syntaxe de la fonction MIN() est présentée ci-dessous :

MIN(column_or_expression)

Comme vous le voyez, cette fonction prend un argument - une colonne ou une expression avec des valeurs numériques. Il est important que les valeurs soient numériques, car la fonction trouve la valeur minimale parmi celles-ci. Par exemple, à partir de cet ensemble de valeurs ...

4, 5, 8, 2, 14

... MIN() renvoie 2.

Qu'est-ce que la fonction MAX() en SQL ?

Comme MIN(), MAX() est une fonction d'agrégation qui renvoie une valeur numérique à partir d'un ensemble. La différence est qu'elle renvoie la valeur la plus grande (maximale). Les valeurs peuvent provenir d'une colonne ou être le résultat d'une expression qui renvoie une ou plusieurs valeurs numériques. Il s'agit d'une fonction scalaire qui renvoie une valeur.

Voici la syntaxe de la fonction MAX():

MAX(column_or_expression)

A partir de cet ensemble de valeurs ...

4, 5, 8, 2, 14 

... MAX() renvoie 14.

L'échantillon de données

Avant de commencer à analyser les cas d'utilisation de MIN() et MAX(), examinons les données que nous allons utiliser dans la table cosmetics:

idnamecategorydelivered_yearprice
1shampoohair202011
2night creamface202012
3cleanserface20205
4brushhair20203
5mascaraeye20218
6eyebroweye202115
7conditionerhair202121
8sprayhair202113
9eyelinereye202120
10tonicface202021
11face maskface202110
12eye creameye202122
13hair maskhair20203

Cette table stocke des informations sur les produits cosmétiques dans trois catégories (la colonne category) : cheveux, visage et yeux. Les noms des produits figurent dans la colonne nom. Les deux dernières colonnes contiennent des données sur la date de livraison du produit (delivered_year) et son prix ( price). Il n'y a que deux années (2020 et 2021) dans la colonne delivered_year.

Si vous avez besoin d'aide pour comprendre les instructions et les fonctions SQL que nous utilisons dans cet article, essayez la fiche d'aide SQL pour les débutants .

Exemples de cas d'utilisation de MIN() et MAX()

1. Utilisation de MIN() ou MAX() comme colonne unique

Les fonctions agrégées comme MIN() peuvent être utilisées comme une seule colonne dans la requête SELECT. Par exemple :

SELECT MIN(price) FROM cosmetics;

Voici le résultat :

min
3

Après le mot-clé SELECT, nous mettons MIN() et le nom de la colonne (dans ce cas, price). Ensuite, nous mettons le mot-clé FROM et le nom de la table (cosmetics). Le résultat est la plus petite valeur de la colonne price, qui est 3.

Vous pouvez utiliser MAX() exactement de la même manière pour trouver le prix du produit le plus élevé :

SELECT MAX(price) FROM cosmetics;

Et voici le résultat :

max
22

Le prix maximum dans la table cosmetics est 22 (le prix de la crème pour les yeux).

L'article Comment trouver les valeurs minimales dans les colonnes vous donne plus d'exemples sur la façon de trouver la valeur minimale.

2. Utilisation de MIN() et MAX() avec d'autres colonnes

Une utilisation plus avancée des fonctions MIN() ou MAX() consiste à les utiliser sur des groupes de lignes. Voici une autre requête :

SELECT category,
  MAX(price) AS max_price
FROM cosmetics
GROUP BY category;

Elle renvoie les données :

categorymax_price
hair21
face21
eye22

Il y a d'abord le mot-clé SELECT avec le nom de la colonne (category), puis la fonction MAX() avec la colonne price comme argument. Ensuite, nous avons max_price, l'alias de la nouvelle colonne créée par MAX().

Ensuite, nous avons le mot-clé FROM et le nom de la table. À la fin, nous avons la clause GROUP BY avec la colonne category. Cela détermine les groupes (c'est-à-dire que les produits sont regroupés par catégorie). Pour chaque groupe, nous obtenons sa plus grande valeur - dans ce cas, le prix le plus élevé parmi les produits de cette catégorie. Dans la catégorie "yeux", le prix le plus élevé est de 22 $ ; dans les catégories "visage" et "cheveux", il est de 21 $.

L'article Comment trouver les valeurs maximales dans les rangées vous donne d'autres exemples de cette fonction.

3. Utilisation de MIN() et MAX() dans une même requête

Vous pouvez utiliser les fonctions MIN et MAX dans une seule SELECT. Si vous utilisez uniquement ces fonctions sans aucune colonne, vous n'avez pas besoin de la clause GROUP BY.

Nous présentons ci-dessous une requête qui met en œuvre les deux fonctions :

 SELECT MIN(price) AS min_price,
  MAX(price) AS max_price
FROM cosmetics;

Cette requête renvoie les données :

min_pricemax_price
322

Dans SELECT, nous avons la fonction MIN() avec l'argument de la colonne price suivie de MAX() avec le même argument et leurs alias respectifs. Cette requête renvoie le prix minimum (3 $) et le prix maximum (22 $) pour tous les produits de la table.

Bien entendu, vous pouvez faire de même en calculant le prix minimum et maximum pour chaque catégorie. Cependant, ici, vous devrez utiliser GROUP BY :

SELECT category,
  MIN(price) AS min_price,
  MAX(price) AS max_price
FROM cosmetics
GROUP BY category;

Voici l'ensemble des résultats :

categorymin_pricemax_price
hair321
face521
eye822

Dans ce cas, le prix minimum dans la catégorie "cheveux" est de 3 $ et le prix maximum de 21 $, tandis que dans la catégorie "yeux", la valeur la plus basse est de 8 $ et la plus haute de 22 $.

Vous pouvez en savoir plus sur la recherche des valeurs minimales et maximales dans les articles Comment trouver la valeur minimale d'une colonne en SQL et Comment trouver la valeur maximale d'une colonne numérique en SQL.

4. Utilisation de MIN() ou MAX() dans la clause HAVING

Une autre façon d'utiliser MIN() ou MAX() consiste à filtrer les lignes en fonction de la valeur renvoyée par cette fonction - c'est-à-dire dans la clause HAVING.

La requête ci-dessous met en œuvre MIN() dans HAVING:

SELECT category,
  MAX(price) AS max_price
FROM cosmetics
GROUP BY category
HAVING MIN(price)>4;

Le jeu de résultats :

categorymax_price
face21
eye22

Dans SELECT, nous avons la colonne category. Ensuite, nous utilisons la fonction MAX() avec price comme argument. Pour chaque catégorie, on va calculer le prix maximum parmi les produits appartenant à cette catégorie. Après FROM cosmetics vient la clause GROUP BY avec la colonne category.

A la fin de la requête se trouve la clause HAVING avec la fonction MIN(). Celle-ci trouvera le prix le plus bas parmi les produits de chaque catégorie ; si ce prix est inférieur à 4, il ne sera pas inclus dans les résultats. Comme le prix minimum dans la catégorie "cheveux" est de 3 $, il n'a pas été affiché dans l'ensemble des résultats.

Notez que l'utilisation de l'une ou l'autre des fonctions dans HAVING ne nécessite pas son utilisation (ou celle de toute autre fonction d'agrégation) dans SELECT.

5. Utilisation de MIN() ou MAX() dans une fonction de fenêtre simple

L'utilisation la plus avancée de MIN() ou MAX() est dans une fonction fenêtre. Si vous n'êtes pas familier avec les fonctions de fenêtre, lisez l'article Exemples de fonctions de fenêtre SQL avec explications.

Voici une fonction fenêtre simple qui utilise la fonction MIN():

SELECT name, price, category, delivered_year,
  MIN(price) OVER (ORDER BY category DESC) AS min_price
FROM cosmetics;

La première chose que vous pouvez remarquer est la liste des colonnes de SELECT: name, price, category, delivered_year. Vient ensuite la fonction d'agrégation MIN(price), qui trouve la valeur la plus basse dans la colonne price. OVER est la raison pour laquelle il s'agit d'une fonction de fenêtre ; elle définit la fenêtre. ou l'ensemble des lignes dans le jeu de résultats de la requête. Cela nous permet de calculer une valeur agrégée pour chaque ligne de la fenêtre. Ici, OVER est associé à la catégorie ORDER BY DESC (c'est-à-dire par ordre décroissant) ; ainsi, le prix minimum est toujours de 3 $, car le prix le plus bas dans la catégorie "cheveux" est de 3 $, ce qui est inférieur au prix minimum de la catégorie suivante, qui est de 5 $.

Voici le résultat :

namepricecategorydelivered_yearmin_price
hair mask3hair20203
brush3hair20203
conditioner21hair20213
spray13hair20213
shampoo11hair20203
night cream12face20203
cleanser5face20203
tonic21face20203
face mask10face20213
mascara8eye20213
eye cream22eye20213
eyeliner20eye20213
eyebrow15eye20213

6. Utilisation de MIN/MAX dans une fonction de fenêtre partitionnée

Ensuite, utilisons MIN() ou MAX() dans une fonction fenêtre comportant la clause PARTITION BY. (Si vous avez besoin de vous rafraîchir la mémoire sur PARTITION BY, jetez un coup d'œil à la fiche de conseils SQL Fonctions de fenêtrage .) Voici la requête :

SELECT name, price, category, delivered_year,
  MIN(price) OVER (PARTITION BY delivered_year
           	ORDER BY category DESC)
  AS min_price
FROM cosmetics;

Cette requête calcule le prix minimum pour chaque partition sur la base de la colonne delivered_year et trie les lignes par catégorie.

Elle renvoie le jeu de résultats suivant :

namepricecategorydelivered_yearmin_price
shampoo11hair20203
brush3hair20203
hair mask3hair20203
tonic21face20203
night cream12face20203
cleanser5face20203
spray13hair202113
conditioner21hair202113
face mask10face202110
eyeliner20eye20218
mascara8eye20218
eyebrow15eye20218
eye cream22eye20218

Ces résultats contiennent la liste des cosmétiques, avec leur nom, leur prix, leur catégorie et l'année de livraison. Chaque ligne contient également le prix minimum pour cette année de livraison (qui est la partition). Dans chaque partition, les lignes sont triées en ordre décroissant par catégorie.

Dans ce cas, la clause OVER contient les clauses ORDER BY et PARTITION BY. PARTITION BY delivered_year indique que le prix minimum est calculé séparément pour chaque année. Les enregistrements de chaque partition (l'année où les produits ont été livrés) sont triés par catégorie dans l'ordre décroissant (ORDER BY catégorie DESC).

Ce que nous avons appris sur les fonctions MIN() et MAX() de SQL

Les fonctions d'agrégation SQL MIN() et MAX() sont très populaires. Dans cet article, j'ai expliqué comment les utiliser dans différents cas. La principale différence entre elles est que MIN() trouve la valeur minimale dans un ensemble de valeurs, tandis que MAX() renvoie la valeur maximale.

Maintenant que vous savez comment utiliser MIN() et MAX(), vous êtes prêt à.. :

  • Trouver les valeurs les plus grandes/petites parmi toutes les lignes ou groupes de lignes donnés.
  • Comparer les valeurs minimales et maximales avec d'autres lignes.
  • Utiliser ces fonctions sur des partitions et sur des fonctions de fenêtre simples.

Pour plus d'informations sur les différences entre les valeurs agrégées et les fonctions de fenêtre, essayez notre article SQL Fonctions de fenêtrage vs. SQL Aggregate Functions : Similitudes et différences.

Si vous êtes un débutant et que vous souhaitez approfondir vos connaissances de SQL, je vous recommande le cours de LearnSQL.fr. SQL pour les débutants de . Mais si vous êtes déjà familiarisé avec le langage SQL de base, vous pouvez suivre notre formation Fonctions de fenêtrage pour améliorer vos compétences.