Cláusulas TOP, ALL y DISTINCT en SQL

Existen ciertas cláusulas que generalmente se sitúan en el SELECT antes del FROM y ayudan en el filtrado de registros. Estas cláusulas son a menudo conocidas como predicados y en esta sección veremos su funcionamiento.

TOP

TOP limita el número de registros que devuelve la consulta a la cantidad especificada en la cláusula.

SELECT TOP 4 *
FROM Clientes
ORDER BY idClientes DESC;
idClientes nombre apellidos dirección cuenta
7 Ignacio Herrero Dominguez C/ del girasol 3 NULL
6 Paloma Sanz Valdivia Av. de la Ilustración 49 790763467
5 Alejandro Valero Martinez C/ Serrano 67 778345112
4 Luis Sanchez García C/ de la luz 21 447824556

En el resultado de la ejecución, podemos observar que ha devuelto únicamente los últimos 4 registros de la tabla Clientes.

ALL

ALL devuelve todos los registros de la tabla. A diferencia de SELECT *, en SQL Server, SELECT ALL debe ir acompañado de al menos una columna, por lo que su uso es a menudo redundante e innecesario.

SELECT ALL idClientes
FROM Clientes;
idClientes
1
2
3
4
5
6
7

Sin embargo, ALL puede sernos útiles para realizar comparaciones utilizando SUBSELECTS:

SELECT idClientes,
       idPedidos,
       producto,
       precio
FROM Pedidos
WHERE precio > ALL
    (SELECT precio
    FROM Pedidos
    WHERE idClientes = 2)
idClientes idPedidos producto precio
1 4 MacBook Pro M1 2449,5
NULL 8 Horno Balay 699,55

Esta ejecución nos está devolviendo los registros de la tabla Pedidos cuyos precios sean mayores a todos los precios del idClientes = 2.

La tabla Pedidos, consta de 2 registros para el idClientes = 2 con un precio de 549,95 y 499,99 respectivamente, por lo que nuestra consulta ha devuelto los valores adecuados.

Para entender mejor la importancia de esta cláusula, vamos ha intentar ejecutar la SELECT anterior sin la cláusula ALL:

SELECT idClientes,
       idPedidos,
       producto,
        precio
FROM Pedidos
WHERE precio >
    (SELECT precio
    FROM Pedidos
    WHERE idClientes = 2)

La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión.

Al tener la tabla Pedidos más de un registro con idClientes = 2, el sistema no es capaz de establecer la comparación. La cláusula ALL en este caso, indicaría al sistema que validase todos los registros con idClientes = 2 y devolver los campos indicados en la consulta principal.

DISTINCT

DISTINCT omite los registros cuyos campos seleccionados contienen datos duplicados.

SELECT DISTINCT idClientes
FROM Pedidos
WHERE idClientes IS NOT NULL
ORDER BY idClientes ASC;
idClientes
1
2
3
4
5

Si ejecutáramos la misma consulta sin la cláusula DISTICT, vemos que devuelve registros duplicados, ya que en nuestro sistema hay varios pedidos realizados por el mismo cliente. lo que se traduce que la tabla Pedidos contiene registros con el campo idClientes duplicados.

SELECT idClientes
FROM Pedidos
WHERE idClientes IS NOT NULL
ORDER BY idClientes ASC;
idClientes
1
2
2
3
4
4
5