MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

3 maneiras de selecionar a linha com o valor mínimo em SQL


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.