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.