sql >> Base de Datos >  >> NoSQL >> MongoDB

3 formas de seleccionar la fila con el valor mínimo en SQL

Aquí hay tres ejemplos del uso de SQL para buscar y seleccionar la fila con el valor mínimo en una columna determinada.

Los ejemplos funcionan en la mayoría de los principales RDBMS, incluidos MySQL, MariaDB, PostgreSQL, SQLite, Oracle y SQL Server.

Datos de muestra

Comencemos con los siguientes datos:

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      |
+---------+-----------+---------+

Opción 1

Esta es nuestra primera opción para seleccionar la fila con el valor mínimo de la tabla anterior:

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

Resultado:

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

Aquí, usamos el MIN() dentro de una subconsulta para encontrar el valor mínimo y devolvió la fila completa con la consulta externa.

Cuando hay varias filas con el valor mínimo

Con este método, si hay varias filas con el valor mínimo, se devuelven todas.

Supongamos que insertamos otra fila en nuestra tabla con la misma puntuación que la puntuación mínima existente:

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

Nuestra tabla ahora se ve así:

+---------+-----------+---------+
| 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 Scratch como Punch tienen una puntuación baja de 3.

Ejecutemos la consulta anterior nuevamente para devolver el valor mínimo de esa columna:

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

Resultado:

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

Se devuelven ambas filas con los valores mínimos.

Podemos limitar el conjunto de resultados a una sola fila si es necesario. El código exacto dependerá del RDBMS que se utilice.

El LIMIT La cláusula se puede usar con RDBS como PostgreSQL, MariaDB, MySQL y 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 |
+-------+---------+-------+

En SQL Server, podemos usar el 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       |
+---------+-----------+---------+

Y en Oracle Database, podemos hacer esto:

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       |
+---------+-----------+---------+

Opción 2

Si solo queremos que se devuelva una fila, podemos eliminar la mayor parte del otro código y obtener la primera fila de los resultados ordenados:

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

Resultado:

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

En SQL Server:

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

Resultado:

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

Y en base de datos Oracle:

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

Resultado:

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

Opción 3

Otra forma de seleccionar la fila con el valor mínimo es unir la tabla sobre sí misma, así:

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      |
+---------+-----------+---------+

Al igual que con el ejemplo anterior, podemos limitar los resultados a una fila (o algún otro número) si es necesario.