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.