MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

MariaDB ROWNUM() Explicado


No MariaDB, ROWNUM() é uma função interna que retorna o número atual de linhas aceitas no contexto atual. Seu objetivo principal é emular o ROWNUM pseudo coluna no Oracle.

ROWNUM() pode ser usado de uma maneira que tenha um efeito semelhante ao LIMIT cláusula – para limitar o número de resultados retornados por uma consulta.

Quando no modo Oracle, pode ser chamado como ROWNUM (ou seja, sem os parênteses).

ROWNUM() A função é suportada pelo MariaDB 10.6.1.

Sintaxe


A sintaxe fica assim:
ROWNUM()

Nenhum argumento é necessário ou aceito.

Quando estiver no modo Oracle, pode ser chamado sem os parênteses, assim:
ROWNUM

O uso dessa sintaxe imita o ROWNUM pseudo coluna no Oracle.

Exemplo


Vamos executar uma consulta que retorna todas as linhas de uma tabela chamada 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 oito linhas foram retornadas.

O valor retornado por ROWNUM() função incrementa a cada linha. Nesse caso, coincide com os valores no PetId coluna, mas isso é mera coincidência. O PetId coluna poderia ter usado qualquer valor, mas o ROWNUM() permaneceria como está aqui.

Para ilustrar o que quero dizer, vamos refinar a consulta para retornar 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)

Limitando as linhas retornadas


Como mencionado, ROWNUM() pode ser usado de uma maneira que tenha um efeito semelhante ao LIMIT cláusula – para limitar o número de resultados retornados por uma consulta.

Aqui está um exemplo:
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)

Veja como obteríamos o mesmo efeito usando o 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)

Há uma diferença entre usar LIMIT e ROWNUM() para limitar as linhas retornadas.

A principal diferença é que LIMIT funciona no conjunto de resultados enquanto ROWNUM funciona no número de linhas aceitas (antes de qualquer ORDER ou GROUP BY cláusulas).

Aqui está um exemplo que demonstra essa diferença:
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)

E aqui está usando o 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)

Omitindo os parênteses


Ao executar no modo Oracle, é possível omitir os parênteses. Isso permite que você emule o ROWNUM pseudo coluna no Oracle.

Aqui está um exemplo de mudança para o modo Oracle:
SET SQL_MODE='ORACLE';

Agora podemos executar ROWNUM sem parênteses:
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)

Observe que isso só está disponível no modo Oracle. Usando ROWNUM sem parênteses quando não estiver no modo Oracle resulta em erro.

Para demonstrar, vamos mudar para o modo padrão:
SET SQL_MODE=DEFAULT;

Agora execute a consulta novamente:
SELECT 
    ROWNUM,
    PetId,
    PetName
FROM Pets;

Resultado:
ERROR 1054 (42S22): Unknown column 'ROWNUM' in 'field list'

Consulte a documentação do MariaDB para algumas considerações sobre otimização e outros fatores.