En SQL, le MAX()
La fonction est une fonction d'agrégation qui renvoie la valeur maximale dans une expression donnée.
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 :
+-------------+------------+---------------------------------+----------------+-----------------------------------------+ | ProductId | VendorId | ProductName | ProductPrice | ProductDescription | |-------------+------------+---------------------------------+----------------+-----------------------------------------| | 1 | 1001 | Left handed screwdriver | 25.99 | Purple. Includes left handed carry box. | | 2 | 1001 | Long Weight (blue) | 14.75 | Includes a long wait. | | 3 | 1001 | Long Weight (green) | 11.99 | Approximate 30 minute waiting period. | | 4 | 1002 | Sledge Hammer | 33.49 | Wooden handle. Free wine glasses. | | 5 | 1003 | Chainsaw | 245.00 | Orange. Includes spare fingers. | | 6 | 1003 | Straw Dog Box | NULL | Tied with vines. Very chewable. | | 7 | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | Brown ceramic with solid handle. | +-------------+------------+---------------------------------+----------------+-----------------------------------------+
Exemple
Nous pouvons utiliser la requête suivante pour obtenir le prix maximum de cette table.
SELECT MAX(ProductPrice)
FROM Products;
Résultat :
+--------------------+ | (No column name) | |--------------------| | 245.00 | +--------------------+
Dans ce cas, les informations de prix sont stockées dans le ProductPrice
colonne, et nous la passons donc comme argument au MAX()
fonction, qui calcule ensuite 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. Certains SGBD peuvent utiliser quelque chose comme MAX(ProductPrice)
comme nom de colonne. Il faut s'y attendre, car le MAX()
La fonction ne renvoie aucune colonne. Vous pouvez facilement fournir un nom de colonne en attribuant un alias.
SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;
Résultat :
+----------------+ | MaximumPrice | |----------------| | 245.00 | +----------------+
Résultats filtrés
Le MAX()
La fonction opère sur les lignes renvoyées par la requête. Donc si vous filtrez les résultats, le résultat de MAX()
reflétera cela.
SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products
WHERE VendorId = 1001;
Résultat :
+----------------+ | MaximumPrice | |----------------| | 25.99 | +----------------+
Dans ce cas, 25,99 est le prix maximum de tous les produits proposés par le fournisseur spécifié.
NULL
Valeurs
Le MAX()
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 MAX()
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 MAX(ProductPrice) AS MaximumPrice
FROM Products;
Résultat :
+----------------+ | MaximumPrice | |----------------| | 245.00 | +----------------+ Warning: Null value is eliminated by an aggregate or other SET operation.
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
Vous pouvez utiliser MAX()
sur les valeurs de date/heure.
Supposons que nous ayons le tableau suivant :
SELECT PetName, DOB
FROM Pets;
Résultat :
+-----------+------------+ | PetName | DOB | |-----------+------------| | Fluffy | 2020-11-20 | | Fetch | 2019-08-16 | | Scratch | 2018-10-01 | | Wag | 2020-03-15 | | Tweet | 2020-11-28 | | Fluffy | 2020-09-17 | | Bark | NULL | | Meow | NULL | +-----------+------------+
Nous pouvons utiliser MAX()
pour trouver la date de naissance maximale (DOB
).
SELECT MAX(DOB) AS MaxDOB
FROM Pets;
Résultat :
+------------+ | MaxDOB | |------------| | 2020-11-28 | +------------+
Ce serait la date de naissance du plus jeune animal de compagnie. Comme mentionné, il ignore tout NULL
valeurs.
Données de personnage
Lorsqu'il est utilisé avec des colonnes de données de caractères, MAX()
trouve la valeur la plus élevée dans la séquence de classement.
Exemple :
SELECT MAX(ProductName) AS MaximumProductName
FROM Products;
Résultat :
+----------------------+ | MaximumProductName | |----------------------| | Straw Dog Box | +----------------------+
Le DISTINCT
Mot clé
Votre SGBD peut autoriser le DISTINCT
mot-clé à utiliser avec le MAX()
une fonction. Si c'est le cas, c'est probablement pour se conformer à la norme ISO SQL.
Par conséquent, vous pourrez peut-être faire ceci :
SELECT MAX(DISTINCT ProductPrice) AS MaximumPrice
FROM Products;
Résultat :
+----------------+ | MaximumPrice | |----------------| | 245.00 | +----------------+
Mais cela n'aura aucun impact sur les résultats.
Le DISTINCT
le mot-clé peut être très utile lorsqu'il est utilisé avec d'autres contextes (par exemple avec le COUNT()
fonction), mais elle n'a aucune signification lorsqu'elle est utilisée avec MAX()
. Le DISTINCT
le mot-clé supprime les doublons, mais dans le cas de MAX()
cela ne fera aucune différence car MAX()
renvoie le même résultat quel que soit le nombre de lignes partageant la même valeur maximale.
Fonctions de la fenêtre
Selon votre SGBD, vous pourrez peut-être utiliser un OVER
clause avec votre MAX()
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 :
+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+ | CustomerId | CustomerName | PostalAddress | City | StateProvince | ZipCode | Country | Phone | |--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+ | 1001 | Palm Pantry | 20 Esplanade | Townsville | QLD | 2040 | AUS | (308) 555-0100 | | 1002 | Tall Poppy | 12 Main Road | Columbus | OH | 43333 | USA | (310) 657-0134 | | 1003 | Crazy Critters | 10 Infinite Loops | Cairns | QLD | 4870 | AUS | (418) 555-0143 | | 1004 | Oops Media | 4 Beachside Drive | Perth | WA | 1234 | AUS | (405) 443-5987 | | 1005 | Strange Names Inc. | 789 George Street | Sydney | NSW | 2000 | AUD | (318) 777-0177 | | 1006 | Hi-Five Solutionists | 5 High Street | Highlands | HI | 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.
On peut aussi utiliser le MAX()
fonction avec le OVER
clause pour appliquer une fonction de fenêtre aux données.
SELECT
v.VendorName,
p.ProductName,
p.ProductPrice,
MAX(ProductPrice) OVER (PARTITION BY v.VendorName) AS "Maximum Price For This Vendor"
FROM Products p
INNER JOIN Vendors v
ON v.VendorId = p.VendorId
ORDER BY VendorName, ProductPrice, "Maximum Price For This Vendor";
Résultat :
+---------------+---------------------------------+----------------+---------------------------------+ | VendorName | ProductName | ProductPrice | Maximum Price For This Vendor | |---------------+---------------------------------+----------------+---------------------------------| | Katty Kittens | Bottomless Coffee Mugs (4 Pack) | 9.99 | 9.99 | | Mars Supplies | Long Weight (green) | 11.99 | 25.99 | | Mars Supplies | Long Weight (blue) | 14.75 | 25.99 | | Mars Supplies | Left handed screwdriver | 25.99 | 25.99 | | Pedal Medals | Straw Dog Box | NULL | 245.00 | | Pedal Medals | Chainsaw | 245.00 | 245.00 | | Randy Roofers | Sledge Hammer | 33.49 | 33.49 | +---------------+---------------------------------+----------------+---------------------------------+
Dans ce cas, nous avons utilisé le OVER
clause avec notre MAX()
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 maximum pour tous les produits de ce fournisseur donné. Ce prix maximum change à mesure que le fournisseur change (à moins que plusieurs fournisseurs aient le même prix maximum), 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()
, AVG()
, et COUNT()
.