MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

3 façons de sélectionner la ligne avec la valeur minimale en SQL

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.