sql >> Database >  >> RDS >> MariaDB

MariaDB ROWNUM() uitgelegd

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.


  1. Inzicht in het opslaan van gegevens in SQL-databases door Android.com Zelfstudie

  2. Voer de opdracht Insert uit en retourneer de ingevoegde Id in Sql

  3. Hoe "Vind ik leuk" in SQL te gebruiken?

  4. MySQL:Verleen **alle** rechten op database