Aqui estão três exemplos que usam SQL para localizar e selecionar a linha com o valor máximo em uma determinada coluna.
Os exemplos funcionam na maioria dos principais RDBMSs, incluindo MySQL, MariaDB, PostgreSQL, SQLite, Oracle e SQL Server.
Dados de amostra
Começaremos 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 | | 7 | Punch | 3 | +---------+-----------+---------+
Opção 1
Aqui está um exemplo de como selecionar a linha com o valor máximo da
Score
coluna da tabela acima:SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow );
Resultado:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Usamos o
MAX()
função dentro de uma subconsulta para encontrar o valor máximo e retornou a linha inteira com a consulta externa. Quando há várias linhas com o valor máximo
Usando este método, se houver mais de uma linha com o valor máximo, todas elas serão retornadas.
Suponha que inserimos outra linha em nossa tabela com a mesma pontuação que a pontuação máxima existente:
INSERT INTO PetShow VALUES (8, 'Purr', 85);
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 | | 8 | Purr | 85 | +---------+-----------+---------+
Podemos ver que Wag e Purr obtiveram a pontuação mais alta de 85.
Vamos executar a consulta anterior novamente para retornar o valor máximo dessa coluna:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow );
Resultado:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Ambas as linhas com os valores máximos são retornadas conforme o esperado.
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 MAX(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1;
Resultado:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
No SQL Server, podemos usar o
TOP
cláusula:SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC;
Resultado:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
E no banco de dados Oracle:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY;
Resultado:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
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 DESC
LIMIT 1;
Resultado:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
No SQL Server:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC;
Resultado:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
E no banco de dados Oracle:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
FETCH FIRST 1 ROW ONLY;
Resultado:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Opção 3
Outra forma de selecionar a linha com o valor máximo é 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.