En MariaDB, ROWNUM()
es una función integrada que devuelve el número actual de filas aceptadas en el contexto actual. Su propósito principal es emular el ROWNUM
pseudocolumna en Oracle.
ROWNUM()
se puede usar de una manera que tenga un efecto similar al LIMIT
cláusula:para limitar el número de resultados devueltos por una consulta.
Cuando está en modo Oracle, se puede llamar como ROWNUM
(es decir, sin paréntesis).
El ROWNUM()
La función es compatible con MariaDB 10.6.1.
Sintaxis
La sintaxis es así:
ROWNUM()
No se requieren ni se aceptan argumentos.
Cuando está en modo Oracle, se puede llamar sin paréntesis, así:
ROWNUM
El uso de esta sintaxis imita el ROWNUM
pseudocolumna en Oracle.
Ejemplo
Ejecutemos una consulta que devuelva todas las filas de una tabla llamada Pets
:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets;
Resultado:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 1 | Fluffy | | 2 | 2 | Fetch | | 3 | 3 | Scratch | | 4 | 4 | Wag | | 5 | 5 | Tweet | | 6 | 6 | Fluffy | | 7 | 7 | Bark | | 8 | 8 | Meow | +----------+-------+---------+ 8 rows in set (0.001 sec)
Podemos ver que se devolvieron ocho filas.
El valor devuelto por ROWNUM()
la función se incrementa con cada fila. En este caso, coincide con los valores del PetId
columna, pero esto es pura coincidencia. El PetId
columna podría haber usado cualquier valor, pero el ROWNUM()
permanecería como está aquí.
Para ilustrar lo que quiero decir, perfeccionemos la consulta para que arroje menos resultados:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE PetId > 4;
Resultado:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 5 | Tweet | | 2 | 6 | Fluffy | | 3 | 7 | Bark | | 4 | 8 | Meow | +----------+-------+---------+ 4 rows in set (0.010 sec)
Limitar las filas devueltas
Como se mencionó, ROWNUM()
se puede usar de una manera que tenga un efecto similar al LIMIT
cláusula:para limitar el número de resultados devueltos por una consulta.
He aquí un ejemplo:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE ROWNUM() <= 5;
Resultado:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 1 | Fluffy | | 2 | 2 | Fetch | | 3 | 3 | Scratch | | 4 | 4 | Wag | | 5 | 5 | Tweet | +----------+-------+---------+ 5 rows in set (0.001 sec)
Así es como obtendríamos el mismo efecto usando LIMIT
cláusula:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
LIMIT 5;
Resultado:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 1 | Fluffy | | 2 | 2 | Fetch | | 3 | 3 | Scratch | | 4 | 4 | Wag | | 5 | 5 | Tweet | +----------+-------+---------+ 5 rows in set (0.001 sec)
Hay una diferencia entre usar LIMIT
y ROWNUM()
para limitar las filas devueltas.
La principal diferencia es que LIMIT
funciona en el conjunto de resultados mientras ROWNUM
funciona en la cantidad de filas aceptadas (antes de cualquier ORDER
o GROUP BY
cláusulas).
Aquí hay un ejemplo que demuestra esta diferencia:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE ROWNUM() <= 5
ORDER BY PetId Desc;
Resultado:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 5 | 5 | Tweet | | 4 | 4 | Wag | | 3 | 3 | Scratch | | 2 | 2 | Fetch | | 1 | 1 | Fluffy | +----------+-------+---------+ 5 rows in set (0.129 sec)
Y aquí está usando el LIMIT
cláusula:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
ORDER BY PetId Desc
LIMIT 5;
Resultado:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 8 | 8 | Meow | | 7 | 7 | Bark | | 6 | 6 | Fluffy | | 5 | 5 | Tweet | | 4 | 4 | Wag | +----------+-------+---------+ 5 rows in set (0.000 sec)
Omitir los paréntesis
Cuando se ejecuta en modo Oracle, es posible omitir los paréntesis. Hacer esto le permite emular el ROWNUM
pseudocolumna en Oracle.
Este es un ejemplo de cómo cambiar al modo Oracle:
SET SQL_MODE='ORACLE';
Ahora podemos ejecutar ROWNUM
sin paréntesis:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
Resultado:
+--------+-------+---------+ | ROWNUM | PetId | PetName | +--------+-------+---------+ | 1 | 1 | Fluffy | | 2 | 2 | Fetch | | 3 | 3 | Scratch | | 4 | 4 | Wag | | 5 | 5 | Tweet | | 6 | 6 | Fluffy | | 7 | 7 | Bark | | 8 | 8 | Meow | +--------+-------+---------+ 8 rows in set (0.029 sec)
Tenga en cuenta que esto solo está disponible en modo Oracle. Usando ROWNUM
sin paréntesis cuando no está en modo Oracle da como resultado un error.
Para demostrarlo, cambiemos al modo predeterminado:
SET SQL_MODE=DEFAULT;
Ahora ejecuta la consulta de nuevo:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
Resultado:
ERROR 1054 (42S22): Unknown column 'ROWNUM' in 'field list'
Consulte la documentación de MariaDB para conocer algunas consideraciones sobre la optimización y otros factores.