MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

3 modi per selezionare la riga con il valore minimo in SQL

Ecco tre esempi di utilizzo di SQL per trovare e selezionare la riga con il valore minimo in una determinata colonna.

Gli esempi funzionano nella maggior parte dei principali RDBMS, inclusi MySQL, MariaDB, PostgreSQL, SQLite, Oracle e SQL Server.

Dati campione

Iniziamo con i seguenti dati:

SELECT * FROM PetShow;

Risultato:

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

Opzione 1

Ecco la nostra prima opzione per selezionare la riga con il valore minimo dalla tabella sopra:

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

Risultato:

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

Qui, abbiamo usato il MIN() funzione all'interno di una sottoquery per trovare il valore minimo e ha restituito l'intera riga con la query esterna.

Quando ci sono più righe con il valore minimo

Utilizzando questo metodo, se sono presenti più righe con il valore minimo, vengono restituite tutte.

Supponiamo di inserire un'altra riga nella nostra tabella con lo stesso punteggio del punteggio minimo esistente:

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

La nostra tabella ora si presenta così:

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

Possiamo vedere che sia Scratch che Punch hanno il punteggio basso di 3.

Eseguiamo nuovamente la query precedente per restituire il valore minimo da quella colonna:

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

Risultato:

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

Vengono restituite entrambe le righe con i valori minimi.

Possiamo limitare il set di risultati a una sola riga, se necessario. Il codice esatto dipenderà dall'RDBMS utilizzato.

Il LIMIT può essere utilizzata con RDBS come PostgreSQL, MariaDB, MySQL e SQLite:

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

Risultato:

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

In SQL Server possiamo usare TOP clausola:

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

Risultato:

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

E in Oracle Database, possiamo farlo:

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

Risultato:

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

Opzione 2

Se vogliamo che venga restituita solo una riga, possiamo effettivamente eliminare la maggior parte dell'altro codice e ottenere semplicemente la prima riga dai risultati ordinati:

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

Risultato:

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

In SQL Server:

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

Risultato:

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

E nel database Oracle:

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

Risultato:

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

Opzione 3

Un altro modo per selezionare la riga con il valore minimo è unire la tabella su se stessa, in questo modo:

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

Risultato:

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

Come nell'esempio precedente, possiamo limitare i risultati a una riga (o a un altro numero), se necessario.