sql >> Base de Datos >  >> RDS >> MariaDB

MariaDB ROWNUM() explicado

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 ORDERGROUP 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.