Voici trois exemples d'utilisation de SQL pour rechercher et sélectionner la ligne avec la valeur minimale 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
Commençons par 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 | +---------+-----------+---------+
Option 1
Voici notre première option pour sélectionner la ligne avec la valeur minimale dans le tableau ci-dessus :
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow );
Résultat :
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Ici, nous avons utilisé le MIN()
fonction dans une sous-requête pour trouver la valeur minimale, et a renvoyé la ligne entière avec la requête externe.
Lorsqu'il y a plusieurs lignes avec la valeur minimale
En utilisant cette méthode, s'il y a plusieurs lignes avec la valeur minimale, elles sont toutes renvoyées.
Supposons que nous insérions une autre ligne dans notre tableau avec le même score que le score minimum existant :
INSERT INTO PetShow VALUES (7, 'Punch', 3);
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 | +---------+-----------+---------+
Nous pouvons voir que Scratch et Punch ont tous deux obtenu le score le plus bas de 3.
Exécutons à nouveau la requête précédente pour renvoyer la valeur minimale de cette colonne :
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow );
Résultat :
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | | 7 | Punch | 3 | +---------+-----------+---------+
Les deux lignes avec les valeurs minimales sont renvoyées.
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 MIN(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1;
Résultat :
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 2 | Scratch | 3 | +-------+---------+-------+
Dans SQL Server, nous pouvons utiliser le TOP
clause :
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC;
Résultat :
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Et dans Oracle Database, nous pouvons faire ceci :
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY;
Résultat :
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
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 ASC
LIMIT 1;
Résultat :
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 7 | Punch | 3 | +-------+---------+-------+
Dans SQL Server :
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC;
Résultat :
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Et dans la base de données Oracle :
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC
FETCH FIRST 1 ROW ONLY;
Résultat :
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Option 3
Une autre façon de sélectionner la ligne avec la valeur minimale 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.