MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

MariaDB ROWNUM() erklärt

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.