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 |