In MariaDB, ROWNUM()
is een ingebouwde functie die het huidige aantal geaccepteerde rijen in de huidige context retourneert. Het belangrijkste doel is het emuleren van de ROWNUM
pseudokolom in Oracle.
ROWNUM()
kan worden gebruikt op een manier die een soortgelijk effect heeft als de LIMIT
clausule – om het aantal resultaten dat door een zoekopdracht wordt geretourneerd te beperken.
In Oracle-modus kan het worden aangeroepen als ROWNUM
(d.w.z. zonder de haakjes).
De ROWNUM()
functie wordt ondersteund vanaf MariaDB 10.6.1.
Syntaxis
De syntaxis gaat als volgt:
ROWNUM()
Er zijn geen argumenten vereist of geaccepteerd.
In Oracle-modus kan het zonder de haakjes worden aangeroepen, zoals dit:
ROWNUM
Het gebruik van deze syntaxis bootst de ROWNUM
. na pseudo-kolom in Oracle.
Voorbeeld
Laten we een query uitvoeren die alle rijen retourneert uit een tabel met de naam Pets
:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets;
Resultaat:
+----------+-------+---------+ | 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)
We kunnen zien dat er acht rijen zijn geretourneerd.
De waarde die wordt geretourneerd door ROWNUM()
functie neemt toe met elke rij. In dit geval valt het samen met de waarden in de PetId
kolom, maar dit is puur toeval. De PetId
kolom had elke waarde kunnen gebruiken, maar de ROWNUM()
zou blijven zoals het hier is.
Laten we, om te illustreren wat ik bedoel, de zoekopdracht verfijnen om minder resultaten te retourneren:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE PetId > 4;
Resultaat:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 5 | Tweet | | 2 | 6 | Fluffy | | 3 | 7 | Bark | | 4 | 8 | Meow | +----------+-------+---------+ 4 rows in set (0.010 sec)
Het aantal geretourneerde rijen beperken
Zoals vermeld, ROWNUM()
kan worden gebruikt op een manier die een soortgelijk effect heeft als de LIMIT
clausule – om het aantal resultaten dat door een zoekopdracht wordt geretourneerd te beperken.
Hier is een voorbeeld:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE ROWNUM() <= 5;
Resultaat:
+----------+-------+---------+ | 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)
Zo krijgen we hetzelfde effect met de LIMIT
clausule:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
LIMIT 5;
Resultaat:
+----------+-------+---------+ | 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)
Er is een verschil tussen het gebruik van LIMIT
en ROWNUM()
om de geretourneerde rijen te beperken.
Het belangrijkste verschil is dat LIMIT
werkt op de resultatenset terwijl ROWNUM
werkt op het aantal geaccepteerde rijen (vóór elke ORDER
of GROUP BY
clausules).
Hier is een voorbeeld dat dit verschil laat zien:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE ROWNUM() <= 5
ORDER BY PetId Desc;
Resultaat:
+----------+-------+---------+ | 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)
En hier gebruikt het de LIMIT
clausule:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
ORDER BY PetId Desc
LIMIT 5;
Resultaat:
+----------+-------+---------+ | 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)
De haakjes weglaten
Als u in Oracle-modus draait, is het mogelijk om de haakjes weg te laten. Als u dit doet, kunt u de ROWNUM
. emuleren pseudo-kolom in Oracle.
Hier is een voorbeeld van overschakelen naar Oracle-modus:
SET SQL_MODE='ORACLE';
Nu kunnen we ROWNUM
. uitvoeren zonder haakjes:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
Resultaat:
+--------+-------+---------+ | 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)
Merk op dat dit alleen beschikbaar is in Oracle-modus. ROWNUM
gebruiken zonder haakjes wanneer niet in Oracle-modus resulteert in een fout.
Laten we om te demonstreren naar de standaardmodus overschakelen:
SET SQL_MODE=DEFAULT;
Voer de query nu opnieuw uit:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
Resultaat:
ERROR 1054 (42S22): Unknown column 'ROWNUM' in 'field list'
Zie de MariaDB-documentatie voor enkele overwegingen rond optimalisatie en andere factoren.