sql >> Database teknologi >  >> RDS >> MariaDB

MariaDB ROWNUM() Forklaret

I MariaDB, ROWNUM() er en indbygget funktion, der returnerer det aktuelle antal accepterede rækker i den aktuelle kontekst. Dens hovedformål er at efterligne ROWNUM pseudo kolonne i Oracle.

ROWNUM() kan bruges på en måde, der har en lignende effekt som LIMIT klausul – for at begrænse antallet af resultater, der returneres af en forespørgsel.

Når den er i Oracle-tilstand, kan den kaldes som ROWNUM (dvs. uden parenteser).

 ROWNUM() funktionen understøttes fra MariaDB 10.6.1.

Syntaks

Syntaksen ser sådan ud:

ROWNUM()

Ingen argumenter er påkrævet eller accepteret.

Når den er i Oracle-tilstand, kan den kaldes uden parentes, sådan her:

ROWNUM

Brug af denne syntaks efterligner ROWNUM pseudo kolonne i Oracle.

Eksempel

Lad os køre en forespørgsel, der returnerer alle rækker fra en tabel kaldet Pets :

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, at otte rækker blev returneret.

Værdien returneret af ROWNUM() funktionstrin med hver række. I dette tilfælde falder det tilfældigvis sammen med værdierne i PetId kolonne, men dette er rent tilfældigt. PetId kolonne kunne have brugt en hvilken som helst værdi, men ROWNUM() ville forblive, som det er her.

For at illustrere, hvad jeg mener, lad os finjustere forespørgslen for at returnere færre resultater:

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ænsning af de returnerede rækker

Som nævnt, ROWNUM() kan bruges på en måde, der har en lignende effekt som LIMIT klausul – for at begrænse antallet af resultater, der returneres af en forespørgsel.

Her er et eksempel:

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ådan får vi den samme effekt ved at bruge 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)

Der er forskel på at bruge LIMIT og ROWNUM() for at begrænse de returnerede rækker.

Den største forskel er, at LIMIT virker på resultatsættet, mens ROWNUM virker på antallet af accepterede rækker (før enhver ORDER). eller GROUP BY klausuler).

Her er et eksempel, der viser denne forskel:

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)

Og her bruger 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)

Udeladelse af parenteser

Når du kører i Oracle-tilstand, er det muligt at udelade parenteserne. Hvis du gør dette, kan du efterligne ROWNUM pseudo kolonne i Oracle.

Her er et eksempel på at skifte til Oracle-tilstand:

SET SQL_MODE='ORACLE';

Nu kan vi køre ROWNUM uden 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)

Bemærk, at dette kun er tilgængeligt i Oracle-tilstand. Bruger ROWNUM uden parentes, når den ikke er i Oracle-tilstand resulterer i en fejl.

For at demonstrere, lad os skifte til standardtilstand:

SET SQL_MODE=DEFAULT;

Kør nu forespørgslen igen:

SELECT 
    ROWNUM,
    PetId,
    PetName
FROM Pets;

Resultat:

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

Se MariaDB-dokumentationen for nogle overvejelser omkring optimering og andre faktorer.


  1. Om SQLite

  2. Kan ikke oprette forbindelse til MySQL fra Java:NullPointerException inde i MySQL-driverforbindelseslogikken

  3. Dårlig praksis i databasedesign

  4. Er sp_-præfikset stadig et nej-nej?