I MariaDB, ROWNUM()
är en inbyggd funktion som returnerar det aktuella antalet accepterade rader i det aktuella sammanhanget. Dess huvudsakliga syfte är att emulera ROWNUM
pseudokolumn i Oracle.
ROWNUM()
kan användas på ett sätt som har en liknande effekt som LIMIT
klausul – för att begränsa antalet resultat som returneras av en fråga.
I Oracle-läge kan det kallas ROWNUM
(dvs utan parenteser).
Den ROWNUM()
funktionen stöds från MariaDB 10.6.1.
Syntax
Syntaxen ser ut så här:
ROWNUM()
Inga argument krävs eller accepteras.
I Oracle-läge kan den anropas utan parentes, så här:
ROWNUM
Att använda denna syntax efterliknar ROWNUM
pseudokolumn i Oracle.
Exempel
Låt oss köra en fråga som returnerar alla rader från en tabell som heter Husdjur
:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets;
Resultat:
+----------+-------+---------+ | 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)
Vi kan se att åtta rader returnerades.
Värdet som returneras av ROWNUM()
funktion stegar med varje rad. I det här fallet råkar det sammanfalla med värdena i PetId
kolumn, men detta är en ren slump. PetId
kolumnen kunde ha använt vilket värde som helst, men ROWNUM()
skulle förbli som det är här.
För att illustrera vad jag menar, låt oss förfina frågan för att ge färre resultat:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE PetId > 4;
Resultat:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 5 | Tweet | | 2 | 6 | Fluffy | | 3 | 7 | Bark | | 4 | 8 | Meow | +----------+-------+---------+ 4 rows in set (0.010 sec)
Begränsa antalet returnerade rader
Som nämnts, ROWNUM()
kan användas på ett sätt som har en liknande effekt som LIMIT
klausul – för att begränsa antalet resultat som returneras av en fråga.
Här är ett exempel:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE ROWNUM() <= 5;
Resultat:
+----------+-------+---------+ | 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)
Så här får vi samma effekt med LIMIT
klausul:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
LIMIT 5;
Resultat:
+----------+-------+---------+ | 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)
Det är skillnad på att använda LIMIT
och ROWNUM()
för att begränsa antalet returnerade rader.
Den största skillnaden är att LIMIT
fungerar på resultatuppsättningen medan ROWNUM
fungerar på antalet godkända rader (före någon ORDER
eller GRUPPER EFTER
klausuler).
Här är ett exempel som visar denna skillnad:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE ROWNUM() <= 5
ORDER BY PetId Desc;
Resultat:
+----------+-------+---------+ | 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)
Och här använder den LIMIT
klausul:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
ORDER BY PetId Desc
LIMIT 5;
Resultat:
+----------+-------+---------+ | 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)
Utesluter parenteserna
När du kör i Oracle-läge är det möjligt att utelämna parenteserna. Genom att göra detta kan du emulera
Här är ett exempel på hur du byter till Oracle-läge:
SET SQL_MODE='ORACLE';
Nu kan vi köra ROWNUM
utan parentes:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
Resultat:
+--------+-------+---------+ | 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)
Observera att detta endast är tillgängligt i Oracle-läge. Använder ROWNUM
utan parentes när den inte är i Oracle-läge resulterar i ett fel.
För att demonstrera, låt oss byta till standardläge:
SET SQL_MODE=DEFAULT;
Kör nu frågan igen:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
Resultat:
ERROR 1054 (42S22): Unknown column 'ROWNUM' in 'field list'
Se MariaDB-dokumentationen för några överväganden kring optimering och andra faktorer.