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). O
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.