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

Spiegazione di MariaDB ROWNUM()

In MariaDB, ROWNUM() è una funzione incorporata che restituisce il numero corrente di righe accettate nel contesto corrente. Il suo scopo principale è emulare il ROWNUM pseudo colonna in Oracle.

ROWNUM() può essere utilizzato in un modo che ha un effetto simile al LIMIT clausola – per limitare il numero di risultati restituiti da una query.

In modalità Oracle, può essere chiamato come ROWNUM (cioè senza parentesi).

Il ROWNUM() la funzione è supportata da MariaDB 10.6.1.

Sintassi

La sintassi è questa:

ROWNUM()

Nessun argomento è richiesto o accettato.

In modalità Oracle, può essere chiamato senza parentesi, in questo modo:

ROWNUM

L'utilizzo di questa sintassi imita il ROWNUM pseudo colonna in Oracle.

Esempio

Eseguiamo una query che restituisce tutte le righe da una tabella chiamata Pets :

SELECT 
    ROWNUM(),
    PetId,
    PetName
FROM Pets;

Risultato:

+----------+-------+---------+
| 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)

Possiamo vedere che sono state restituite otto righe.

Il valore restituito da ROWNUM() la funzione aumenta ad ogni riga. In questo caso, coincide con i valori nel PetId colonna, ma questo è puramente casuale. Il PetId la colonna potrebbe aver utilizzato qualsiasi valore, ma ROWNUM() rimarrebbe com'è qui.

Per illustrare cosa intendo, perfezioniamo la query per restituire meno risultati:

SELECT 
    ROWNUM(),
    PetId,
    PetName
FROM Pets
WHERE PetId > 4;

Risultato:

+----------+-------+---------+
| ROWNUM() | PetId | PetName |
+----------+-------+---------+
|        1 |     5 | Tweet   |
|        2 |     6 | Fluffy  |
|        3 |     7 | Bark    |
|        4 |     8 | Meow    |
+----------+-------+---------+
4 rows in set (0.010 sec)

Limitazione delle righe restituite

Come accennato, ROWNUM() può essere utilizzato in un modo che ha un effetto simile al LIMIT clausola – per limitare il numero di risultati restituiti da una query.

Ecco un esempio:

SELECT 
    ROWNUM(),
    PetId,
    PetName
FROM Pets
WHERE ROWNUM() <= 5;

Risultato:

+----------+-------+---------+
| 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)

Ecco come otterremmo lo stesso effetto utilizzando il LIMIT clausola:

SELECT 
    ROWNUM(),
    PetId,
    PetName
FROM Pets
LIMIT 5;

Risultato:

+----------+-------+---------+
| 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)

C'è una differenza nell'usare LIMIT e ROWNUM() per limitare le righe restituite.

La differenza principale è che LIMIT funziona sul set di risultati mentre ROWNUM funziona sul numero di righe accettate (prima di qualsiasi ORDERGROUP BY clausole).

Ecco un esempio che dimostra questa differenza:

SELECT 
    ROWNUM(),
    PetId,
    PetName
FROM Pets
WHERE ROWNUM() <= 5
ORDER BY PetId Desc;

Risultato:

+----------+-------+---------+
| 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)

Ed eccolo qui usando il LIMIT clausola:

SELECT 
    ROWNUM(),
    PetId,
    PetName
FROM Pets
ORDER BY PetId Desc
LIMIT 5;

Risultato:

+----------+-------+---------+
| 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)

Omissione delle parentesi

Quando si esegue in modalità Oracle, è possibile omettere le parentesi. In questo modo puoi emulare il ROWNUM pseudo colonna in Oracle.

Ecco un esempio di passaggio alla modalità Oracle:

SET SQL_MODE='ORACLE';

Ora possiamo eseguire ROWNUM senza parentesi:

SELECT 
    ROWNUM,
    PetId,
    PetName
FROM Pets;

Risultato:

+--------+-------+---------+
| 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)

Si noti che questo è disponibile solo in modalità Oracle. Usando ROWNUM senza parentesi quando non in modalità Oracle genera un errore.

Per dimostrare, passiamo alla modalità predefinita:

SET SQL_MODE=DEFAULT;

Ora esegui di nuovo la query:

SELECT 
    ROWNUM,
    PetId,
    PetName
FROM Pets;

Risultato:

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

Consulta la documentazione di MariaDB per alcune considerazioni sull'ottimizzazione e altri fattori.