sql >> Database >  >> NoSQL >> MongoDB

3 manieren om de rij met de minimumwaarde in SQL te selecteren

Hier zijn drie voorbeelden van het gebruik van SQL om de rij met de minimumwaarde in een bepaalde kolom te zoeken en te selecteren.

De voorbeelden werken in de meeste grote RDBMS'en, waaronder MySQL, MariaDB, PostgreSQL, SQLite, Oracle en SQL Server.

Voorbeeldgegevens

Laten we beginnen met de volgende gegevens:

SELECT * FROM PetShow;

Resultaat:

+---------+-----------+---------+
| PetId   | PetName   | Score   |
|---------+-----------+---------|
| 1       | Wag       | 85      |
| 2       | Scratch   | 3       |
| 3       | Tweet     | 65      |
| 4       | Bark      | 8       |
| 5       | Ruff      | 15      |
| 6       | Woof      | 20      |
+---------+-----------+---------+

Optie 1

Dit is onze eerste optie voor het selecteren van de rij met de minimumwaarde uit de bovenstaande tabel:

SELECT 
    PetId,
    PetName,
    Score
FROM PetShow 
WHERE Score = ( SELECT MIN(Score) FROM PetShow );

Resultaat:

+---------+-----------+---------+
| PetId   | PetName   | Score   |
|---------+-----------+---------|
| 2       | Scratch   | 3       |
+---------+-----------+---------+

Hier gebruikten we de MIN() functie binnen een subquery om de minimumwaarde te vinden, en retourneerde de hele rij met de buitenste query.

Als er meerdere rijen zijn met de minimale waarde

Als er met deze methode meerdere rijen met de minimumwaarde zijn, worden ze allemaal geretourneerd.

Stel dat we een andere rij in onze tabel invoegen met dezelfde score als de bestaande minimumscore:

INSERT INTO PetShow VALUES (7, 'Punch', 3);
SELECT * FROM PetShow;

Onze tabel ziet er nu als volgt uit:

+---------+-----------+---------+
| PetId   | PetName   | Score   |
|---------+-----------+---------|
| 1       | Wag       | 85      |
| 2       | Scratch   | 3       |
| 3       | Tweet     | 65      |
| 4       | Bark      | 8       |
| 5       | Ruff      | 15      |
| 6       | Woof      | 20      |
| 7       | Punch     | 3       |
+---------+-----------+---------+

We kunnen zien dat zowel Scratch als Punch de lage score van 3 hebben.

Laten we de vorige query opnieuw uitvoeren om de minimumwaarde uit die kolom te retourneren:

SELECT 
    PetId,
    PetName,
    Score
FROM PetShow 
WHERE Score = ( SELECT MIN(Score) FROM PetShow );

Resultaat:

+---------+-----------+---------+
| PetId   | PetName   | Score   |
|---------+-----------+---------|
| 2       | Scratch   | 3       |
| 7       | Punch     | 3       |
+---------+-----------+---------+

Beide rijen met de minimumwaarden worden geretourneerd.

We kunnen de resultatenset desgewenst beperken tot slechts één rij. De exacte code is afhankelijk van het RDBMS dat wordt gebruikt.

De LIMIT clausule kan worden gebruikt met RDBS'en zoals PostgreSQL, MariaDB, MySQL en SQLite:

SELECT 
    PetId,
    PetName,
    Score
FROM PetShow 
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1;

Resultaat:

+-------+---------+-------+
| PetId | PetName | Score |
+-------+---------+-------+
|     2 | Scratch |     3 |
+-------+---------+-------+

In SQL Server kunnen we de TOP . gebruiken clausule:

SELECT TOP 1
    PetId,
    PetName,
    Score
FROM PetShow 
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC;

Resultaat:

+---------+-----------+---------+
| PetId   | PetName   | Score   |
|---------+-----------+---------|
| 2       | Scratch   | 3       |
+---------+-----------+---------+

En in Oracle Database kunnen we dit doen:

SELECT
    PetId,
    PetName,
    Score
FROM PetShow 
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY;

Resultaat:

+---------+-----------+---------+
| PetId   | PetName   | Score   |
|---------+-----------+---------|
| 2       | Scratch   | 3       |
+---------+-----------+---------+

Optie 2

Als we slechts één rij willen retourneren, kunnen we de meeste andere code weglaten en gewoon de eerste rij uit de geordende resultaten halen:

SELECT 
    PetId,
    PetName,
    Score
FROM PetShow 
ORDER BY Score ASC
LIMIT 1;

Resultaat:

+-------+---------+-------+
| PetId | PetName | Score |
+-------+---------+-------+
|     7 | Punch   |     3 |
+-------+---------+-------+

In SQL Server:

SELECT TOP 1
    PetId,
    PetName,
    Score
FROM PetShow 
ORDER BY Score ASC;

Resultaat:

+---------+-----------+---------+
| PetId   | PetName   | Score   |
|---------+-----------+---------|
| 2       | Scratch   | 3       |
+---------+-----------+---------+

En in Oracle Database:

SELECT
    PetId,
    PetName,
    Score
FROM PetShow 
ORDER BY Score ASC
FETCH FIRST 1 ROW ONLY;

Resultaat:

+---------+-----------+---------+
| PetId   | PetName   | Score   |
|---------+-----------+---------|
| 2       | Scratch   | 3       |
+---------+-----------+---------+

Optie 3

Een andere manier om de rij met de minimumwaarde te selecteren, is door de tabel op zichzelf te voegen, als volgt:

SELECT 
    p1.PetId, 
    p1.PetName, 
    p1.Score
FROM PetShow p1
LEFT JOIN PetShow p2 ON p1.Score < p2.Score
WHERE p2.PetId IS NULL;

Resultaat:

+---------+-----------+---------+
| PetId   | PetName   | Score   |
|---------+-----------+---------|
| 1       | Wag       | 85      |
| 8       | Purr      | 85      |
+---------+-----------+---------+

Net als bij het eerdere voorbeeld kunnen we de resultaten desgewenst beperken tot één rij (of een ander nummer).


  1. Hoe converteer je een bestaande relationele database naar een key-value store?

  2. $ slice-operator gebruiken om het laatste element van de array te krijgen

  3. vervaldatum instellen voor Hashmap-waarden in Redis?

  4. $unionWith - MongoDB's equivalent van UNION ALL