Aqui estão três exemplos de uso do SQL para localizar e selecionar a linha com o valor mínimo em uma determinada coluna.
Os exemplos funcionam na maioria dos principais RDBMSs, incluindo MySQL, MariaDB, PostgreSQL, SQLite, Oracle e SQL Server.
Dados de amostra
Vamos começar com os seguintes dados:
SELECT * FROM PetShow;
Resultado:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | +---------+-----------+---------+
Opção 1
Aqui está nossa primeira opção para selecionar a linha com o valor mínimo da tabela acima:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow );
Resultado:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Aqui, usamos o
MIN()
função dentro de uma subconsulta para encontrar o valor mínimo e retornou a linha inteira com a consulta externa. Quando há várias linhas com o valor mínimo
Usando esse método, se houver várias linhas com o valor mínimo, todas elas serão retornadas.
Suponha que inserimos outra linha em nossa tabela com a mesma pontuação que a pontuação mínima existente:
INSERT INTO PetShow VALUES (7, 'Punch', 3);
SELECT * FROM PetShow;
Nossa tabela agora está assim:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | | 7 | Punch | 3 | +---------+-----------+---------+
Podemos ver que tanto o Scratch quanto o Punch obtiveram a pontuação baixa de 3.
Vamos executar a consulta anterior novamente para retornar o valor mínimo dessa coluna:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow );
Resultado:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | | 7 | Punch | 3 | +---------+-----------+---------+
Ambas as linhas com os valores mínimos são retornadas.
Podemos limitar o conjunto de resultados a apenas uma linha, se necessário. O código exato dependerá do RDBMS que está sendo usado.
O
LIMIT
cláusula pode ser usada com RDBSs como PostgreSQL, MariaDB, MySQL e SQLite:SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1;
Resultado:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 2 | Scratch | 3 | +-------+---------+-------+
No SQL Server, podemos usar o
TOP
cláusula:SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC;
Resultado:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
E no Oracle Database, podemos fazer isso:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MIN(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY;
Resultado:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Opção 2
Se quisermos apenas uma linha retornada, podemos eliminar a maior parte do outro código e apenas obter a primeira linha dos resultados ordenados:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC
LIMIT 1;
Resultado:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 7 | Punch | 3 | +-------+---------+-------+
No SQL Server:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC;
Resultado:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
E no banco de dados Oracle:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score ASC
FETCH FIRST 1 ROW ONLY;
Resultado:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 2 | Scratch | 3 | +---------+-----------+---------+
Opção 3
Outra forma de selecionar a linha com o valor mínimo é juntar a tabela em si mesma, assim:
SELECT
p1.PetId,
p1.PetName,
p1.Score
FROM PetShow p1
LEFT JOIN PetShow p2 ON p1.Score < p2.Score
WHERE p2.PetId IS NULL;
Resultado:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Assim como no exemplo anterior, podemos limitar os resultados a uma linha (ou algum outro número), se necessário.