In MariaDB, ROWNUM()
è una funzione incorporata che restituisce il numero corrente di righe accettate nel contesto corrente. Il suo scopo principale è emulare il ROWNUM
pseudo colonna in Oracle.
ROWNUM()
può essere utilizzato in un modo che ha un effetto simile al LIMIT
clausola – per limitare il numero di risultati restituiti da una query.
In modalità Oracle, può essere chiamato come ROWNUM
(cioè senza parentesi).
Il ROWNUM()
la funzione è supportata da MariaDB 10.6.1.
Sintassi
La sintassi è questa:
ROWNUM()
Nessun argomento è richiesto o accettato.
In modalità Oracle, può essere chiamato senza parentesi, in questo modo:
ROWNUM
L'utilizzo di questa sintassi imita il ROWNUM
pseudo colonna in Oracle.
Esempio
Eseguiamo una query che restituisce tutte le righe da una tabella chiamata Pets
:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets;
Risultato:
+----------+-------+---------+ | 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)
Possiamo vedere che sono state restituite otto righe.
Il valore restituito da ROWNUM()
la funzione aumenta ad ogni riga. In questo caso, coincide con i valori nel PetId
colonna, ma questo è puramente casuale. Il PetId
la colonna potrebbe aver utilizzato qualsiasi valore, ma ROWNUM()
rimarrebbe com'è qui.
Per illustrare cosa intendo, perfezioniamo la query per restituire meno risultati:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE PetId > 4;
Risultato:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 5 | Tweet | | 2 | 6 | Fluffy | | 3 | 7 | Bark | | 4 | 8 | Meow | +----------+-------+---------+ 4 rows in set (0.010 sec)
Limitazione delle righe restituite
Come accennato, ROWNUM()
può essere utilizzato in un modo che ha un effetto simile al LIMIT
clausola – per limitare il numero di risultati restituiti da una query.
Ecco un esempio:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE ROWNUM() <= 5;
Risultato:
+----------+-------+---------+ | 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)
Ecco come otterremmo lo stesso effetto utilizzando il LIMIT
clausola:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
LIMIT 5;
Risultato:
+----------+-------+---------+ | 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)
C'è una differenza nell'usare LIMIT
e ROWNUM()
per limitare le righe restituite.
La differenza principale è che LIMIT
funziona sul set di risultati mentre ROWNUM
funziona sul numero di righe accettate (prima di qualsiasi ORDER
o GROUP BY
clausole).
Ecco un esempio che dimostra questa differenza:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE ROWNUM() <= 5
ORDER BY PetId Desc;
Risultato:
+----------+-------+---------+ | 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)
Ed eccolo qui usando il LIMIT
clausola:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
ORDER BY PetId Desc
LIMIT 5;
Risultato:
+----------+-------+---------+ | 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)
Omissione delle parentesi
Quando si esegue in modalità Oracle, è possibile omettere le parentesi. In questo modo puoi emulare il ROWNUM
pseudo colonna in Oracle.
Ecco un esempio di passaggio alla modalità Oracle:
SET SQL_MODE='ORACLE';
Ora possiamo eseguire ROWNUM
senza parentesi:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
Risultato:
+--------+-------+---------+ | 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)
Si noti che questo è disponibile solo in modalità Oracle. Usando ROWNUM
senza parentesi quando non in modalità Oracle genera un errore.
Per dimostrare, passiamo alla modalità predefinita:
SET SQL_MODE=DEFAULT;
Ora esegui di nuovo la query:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
Risultato:
ERROR 1054 (42S22): Unknown column 'ROWNUM' in 'field list'
Consulta la documentazione di MariaDB per alcune considerazioni sull'ottimizzazione e altri fattori.