sql >> Databasteknik >  >> RDS >> MariaDB

MariaDB ROWNUM() Förklarad

I MariaDB, ROWNUM() är en inbyggd funktion som returnerar det aktuella antalet accepterade rader i det aktuella sammanhanget. Dess huvudsakliga syfte är att emulera ROWNUM pseudokolumn i Oracle.

ROWNUM() kan användas på ett sätt som har en liknande effekt som LIMIT klausul – för att begränsa antalet resultat som returneras av en fråga.

I Oracle-läge kan det kallas ROWNUM (dvs utan parenteser).

Den ROWNUM() funktionen stöds från MariaDB 10.6.1.

Syntax

Syntaxen ser ut så här:

ROWNUM()

Inga argument krävs eller accepteras.

I Oracle-läge kan den anropas utan parentes, så här:

ROWNUM

Att använda denna syntax efterliknar ROWNUM pseudokolumn i Oracle.

Exempel

Låt oss köra en fråga som returnerar alla rader från en tabell som heter Husdjur :

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 att åtta rader returnerades.

Värdet som returneras av ROWNUM() funktion stegar med varje rad. I det här fallet råkar det sammanfalla med värdena i PetId kolumn, men detta är en ren slump. PetId kolumnen kunde ha använt vilket värde som helst, men ROWNUM() skulle förbli som det är här.

För att illustrera vad jag menar, låt oss förfina frågan för att ge färre resultat:

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änsa antalet returnerade rader

Som nämnts, ROWNUM() kan användas på ett sätt som har en liknande effekt som LIMIT klausul – för att begränsa antalet resultat som returneras av en fråga.

Här är ett exempel:

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å här får vi samma effekt med 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)

Det är skillnad på att använda LIMIT och ROWNUM() för att begränsa antalet returnerade rader.

Den största skillnaden är att LIMIT fungerar på resultatuppsättningen medan ROWNUM fungerar på antalet godkända rader (före någon ORDER eller GRUPPER EFTER klausuler).

Här är ett exempel som visar denna skillnad:

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)

Och här använder 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)

Utesluter parenteserna

När du kör i Oracle-läge är det möjligt att utelämna parenteserna. Genom att göra detta kan du emulera ROWNUM pseudokolumn i Oracle.

Här är ett exempel på hur du byter till Oracle-läge:

SET SQL_MODE='ORACLE';

Nu kan vi köra ROWNUM utan 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)

Observera att detta endast är tillgängligt i Oracle-läge. Använder ROWNUM utan parentes när den inte är i Oracle-läge resulterar i ett fel.

För att demonstrera, låt oss byta till standardläge:

SET SQL_MODE=DEFAULT;

Kör nu frågan igen:

SELECT 
    ROWNUM,
    PetId,
    PetName
FROM Pets;

Resultat:

ERROR 1054 (42S22): Unknown column 'ROWNUM' in 'field list'

Se MariaDB-dokumentationen för några överväganden kring optimering och andra faktorer.


  1. Lista alla funktioner i Oracle Database

  2. Hur konverterar man en hel MySQL-databas teckenuppsättning och sortering till UTF-8?

  3. Få aktuellt AUTO_INCREMENT-värde för valfri tabell

  4. SQL Server String Sammansättning med Null