I MariaDB, ROWNUM()
er en indbygget funktion, der returnerer det aktuelle antal accepterede rækker i den aktuelle kontekst. Dens hovedformål er at efterligne ROWNUM
pseudo kolonne i Oracle.
ROWNUM()
kan bruges på en måde, der har en lignende effekt som LIMIT
klausul – for at begrænse antallet af resultater, der returneres af en forespørgsel.
Når den er i Oracle-tilstand, kan den kaldes som ROWNUM
(dvs. uden parenteser).
ROWNUM()
funktionen understøttes fra MariaDB 10.6.1.
Syntaks
Syntaksen ser sådan ud:
ROWNUM()
Ingen argumenter er påkrævet eller accepteret.
Når den er i Oracle-tilstand, kan den kaldes uden parentes, sådan her:
ROWNUM
Brug af denne syntaks efterligner ROWNUM
pseudo kolonne i Oracle.
Eksempel
Lad os køre en forespørgsel, der returnerer alle rækker fra en tabel kaldet Pets
:
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, at otte rækker blev returneret.
Værdien returneret af ROWNUM()
funktionstrin med hver række. I dette tilfælde falder det tilfældigvis sammen med værdierne i PetId
kolonne, men dette er rent tilfældigt. PetId
kolonne kunne have brugt en hvilken som helst værdi, men ROWNUM()
ville forblive, som det er her.
For at illustrere, hvad jeg mener, lad os finjustere forespørgslen for at returnere færre resultater:
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ænsning af de returnerede rækker
Som nævnt, ROWNUM()
kan bruges på en måde, der har en lignende effekt som LIMIT
klausul – for at begrænse antallet af resultater, der returneres af en forespørgsel.
Her er et eksempel:
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ådan får vi den samme effekt ved at bruge 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)
Der er forskel på at bruge LIMIT
og ROWNUM()
for at begrænse de returnerede rækker.
Den største forskel er, at LIMIT
virker på resultatsættet, mens ROWNUM
virker på antallet af accepterede rækker (før enhver ORDER
). eller GROUP BY
klausuler).
Her er et eksempel, der viser denne forskel:
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)
Og her bruger 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)
Udeladelse af parenteser
Når du kører i Oracle-tilstand, er det muligt at udelade parenteserne. Hvis du gør dette, kan du efterligne ROWNUM
pseudo kolonne i Oracle.
Her er et eksempel på at skifte til Oracle-tilstand:
SET SQL_MODE='ORACLE';
Nu kan vi køre ROWNUM
uden 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)
Bemærk, at dette kun er tilgængeligt i Oracle-tilstand. Bruger ROWNUM
uden parentes, når den ikke er i Oracle-tilstand resulterer i en fejl.
For at demonstrere, lad os skifte til standardtilstand:
SET SQL_MODE=DEFAULT;
Kør nu forespørgslen igen:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
Resultat:
ERROR 1054 (42S22): Unknown column 'ROWNUM' in 'field list'
Se MariaDB-dokumentationen for nogle overvejelser omkring optimering og andre faktorer.