In MariaDB ROWNUM()
ist eine integrierte Funktion, die die aktuelle Anzahl akzeptierter Zeilen im aktuellen Kontext zurückgibt. Sein Hauptzweck ist die Emulation von ROWNUM
Pseudospalte in Oracle.
ROWNUM()
kann ähnlich wie LIMIT
verwendet werden -Klausel – um die Anzahl der von einer Abfrage zurückgegebenen Ergebnisse zu begrenzen.
Im Oracle-Modus kann es als ROWNUM
aufgerufen werden (d.h. ohne die Klammern).
Die ROWNUM()
Funktion wird von MariaDB 10.6.1 unterstützt.
Syntax
Die Syntax lautet wie folgt:
ROWNUM()
Es sind keine Argumente erforderlich oder akzeptiert.
Im Oracle-Modus kann es wie folgt ohne Klammern aufgerufen werden:
ROWNUM
Die Verwendung dieser Syntax imitiert die ROWNUM
Pseudo-Spalte in Oracle.
Beispiel
Lassen Sie uns eine Abfrage ausführen, die alle Zeilen aus einer Tabelle namens Pets
zurückgibt :
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets;
Ergebnis:
+----------+-------+---------+ | 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)
Wir können sehen, dass acht Zeilen zurückgegeben wurden.
Der von ROWNUM()
zurückgegebene Wert Funktion inkrementiert mit jeder Zeile. In diesem Fall stimmt es mit den Werten in der PetId
überein Spalte, aber das ist rein zufällig. Die PetId
Spalte hätte jeden Wert verwenden können, außer ROWNUM()
würde bleiben, wie es hier ist.
Um zu veranschaulichen, was ich meine, lassen Sie uns die Abfrage so verfeinern, dass weniger Ergebnisse zurückgegeben werden:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE PetId > 4;
Ergebnis:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 5 | Tweet | | 2 | 6 | Fluffy | | 3 | 7 | Bark | | 4 | 8 | Meow | +----------+-------+---------+ 4 rows in set (0.010 sec)
Einschränken der zurückgegebenen Zeilen
Wie bereits erwähnt, ROWNUM()
kann ähnlich wie LIMIT
verwendet werden -Klausel – um die Anzahl der von einer Abfrage zurückgegebenen Ergebnisse zu begrenzen.
Hier ist ein Beispiel:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE ROWNUM() <= 5;
Ergebnis:
+----------+-------+---------+ | 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)
So erzielen wir denselben Effekt mit LIMIT
Klausel:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
LIMIT 5;
Ergebnis:
+----------+-------+---------+ | 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)
Es gibt einen Unterschied zwischen der Verwendung von LIMIT
und ROWNUM()
um die zurückgegebenen Zeilen zu begrenzen.
Der Hauptunterschied ist das LIMIT
arbeitet an der Ergebnismenge, während ROWNUM
arbeitet mit der Anzahl der akzeptierten Zeilen (vor jeder ORDER
oder GROUP BY
Klauseln).
Hier ist ein Beispiel, das diesen Unterschied demonstriert:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE ROWNUM() <= 5
ORDER BY PetId Desc;
Ergebnis:
+----------+-------+---------+ | 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)
Und hier wird das LIMIT
verwendet Klausel:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
ORDER BY PetId Desc
LIMIT 5;
Ergebnis:
+----------+-------+---------+ | 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)
Weglassen der Klammern
Bei der Ausführung im Oracle-Modus ist es möglich, die Klammern wegzulassen. Dadurch können Sie die ROWNUM
emulieren Pseudo-Spalte in Oracle.
Hier ist ein Beispiel für den Wechsel in den Oracle-Modus:
SET SQL_MODE='ORACLE';
Jetzt können wir ROWNUM
ausführen ohne Klammern:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
Ergebnis:
+--------+-------+---------+ | 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)
Beachten Sie, dass dies nur im Oracle-Modus verfügbar ist. Mit ROWNUM
ohne Klammern, wenn nicht im Oracle-Modus, führt zu einem Fehler.
Wechseln wir zur Demonstration in den Standardmodus:
SET SQL_MODE=DEFAULT;
Führen Sie nun die Abfrage erneut aus:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
Ergebnis:
ERROR 1054 (42S22): Unknown column 'ROWNUM' in 'field list'
In der MariaDB-Dokumentation finden Sie einige Überlegungen zur Optimierung und anderen Faktoren.