Voici trois exemples qui utilisent SQL pour rechercher et sélectionner la ligne avec la valeur maximale dans une colonne donnée.
Les exemples fonctionnent dans la plupart des principaux SGBDR, y compris MySQL, MariaDB, PostgreSQL, SQLite, Oracle et SQL Server.
Exemple de données
Nous allons commencer avec les données suivantes :
SELECT * FROM PetShow;
Résultat :
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | | 7 | Punch | 3 | +---------+-----------+---------+
Option 1
Voici un exemple de sélection de la ligne avec la valeur maximale du Score
colonne dans le tableau ci-dessus :
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow );
Résultat :
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Nous avons utilisé le MAX()
fonction dans une sous-requête pour trouver la valeur maximale, et a renvoyé la ligne entière avec la requête externe.
Lorsqu'il y a plusieurs lignes avec la valeur maximale
En utilisant cette méthode, s'il y a plus d'une ligne avec la valeur max, elles sont toutes renvoyées.
Supposons que nous insérions une autre ligne dans notre tableau avec le même score que le score max existant :
INSERT INTO PetShow VALUES (8, 'Purr', 85);
SELECT * FROM PetShow;
Notre tableau ressemble maintenant à ceci :
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | | 7 | Punch | 3 | | 8 | Purr | 85 | +---------+-----------+---------+
Nous pouvons voir que Wag et Purr ont obtenu le score le plus élevé de 85.
Exécutons à nouveau la requête précédente pour renvoyer la valeur maximale de cette colonne :
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow );
Résultat :
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Les deux lignes avec les valeurs maximales sont renvoyées comme prévu.
Nous pouvons limiter le jeu de résultats à une seule ligne si nécessaire. Le code exact dépendra du SGBDR utilisé.
La LIMIT
La clause peut être utilisée avec des RDBS tels que PostgreSQL, MariaDB, MySQL et SQLite :
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1;
Résultat :
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
Dans SQL Server, nous pouvons utiliser le TOP
clause :
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC;
Résultat :
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
Et dans la base de données Oracle :
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY;
Résultat :
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
Option 2
Si nous voulons qu'une seule ligne soit renvoyée, nous pouvons en fait supprimer la plupart des autres codes et n'obtenir que la première ligne des résultats triés :
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
LIMIT 1;
Résultat :
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Dans SQL Server :
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC;
Résultat :
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Et dans la base de données Oracle :
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
FETCH FIRST 1 ROW ONLY;
Résultat :
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Option 3
Une autre façon de sélectionner la ligne avec la valeur maximale est de joindre la table sur elle-même, comme ceci :
SELECT
p1.PetId,
p1.PetName,
p1.Score
FROM PetShow p1
LEFT JOIN PetShow p2 ON p1.Score < p2.Score
WHERE p2.PetId IS NULL;
Résultat :
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Comme dans l'exemple précédent, nous pouvons limiter les résultats à une ligne (ou à un autre nombre) si nécessaire.