MariaDB
 sql >> Base de données >  >> RDS >> MariaDB

MariaDB ROWNUM() expliqué

Dans MariaDB, ROWNUM() est une fonction intégrée qui renvoie le nombre actuel de lignes acceptées dans le contexte actuel. Son objectif principal est d'émuler le ROWNUM pseudo colonne dans Oracle.

ROWNUM() peut être utilisé d'une manière qui a un effet similaire à la LIMIT clause – pour limiter le nombre de résultats renvoyés par une requête.

En mode Oracle, il peut être appelé en tant que ROWNUM (c'est-à-dire sans les parenthèses).

Le ROWNUM() la fonction est prise en charge à partir de MariaDB 10.6.1.

Syntaxe

La syntaxe ressemble à ceci :

ROWNUM()

Aucun argument n'est requis ou accepté.

En mode Oracle, il peut être appelé sans les parenthèses, comme ceci :

ROWNUM

L'utilisation de cette syntaxe imite le ROWNUM pseudo colonne dans Oracle.

Exemple

Exécutons une requête qui renvoie toutes les lignes d'une table appelée Pets :

SELECT 
    ROWNUM(),
    PetId,
    PetName
FROM Pets;

Résultat :

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

Nous pouvons voir que huit lignes ont été renvoyées.

La valeur renvoyée par ROWNUM() la fonction s'incrémente à chaque ligne. Dans ce cas, il arrive qu'il coïncide avec les valeurs du PetId colonne, mais c'est une pure coïncidence. Le PetId la colonne aurait pu utiliser n'importe quelle valeur, mais le ROWNUM() resterait tel qu'il est ici.

Pour illustrer ce que je veux dire, affinons la requête pour renvoyer moins de résultats :

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

Résultat :

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

Limiter les lignes renvoyées

Comme mentionné, ROWNUM() peut être utilisé d'une manière qui a un effet similaire à la LIMIT clause – pour limiter le nombre de résultats renvoyés par une requête.

Voici un exemple :

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

Résultat :

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

Voici comment nous obtiendrions le même effet en utilisant le LIMIT clause :

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

Résultat :

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

Il y a une différence entre l'utilisation de LIMIT et ROWNUM() pour limiter les lignes renvoyées.

La principale différence est que LIMIT fonctionne sur l'ensemble de résultats tandis que ROWNUM fonctionne sur le nombre de lignes acceptées (avant tout ORDER ou GROUP BY clauses).

Voici un exemple qui illustre cette différence :

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

Résultat :

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

Et ici, il utilise le LIMIT clause :

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

Résultat :

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

Omettre les parenthèses

Lors de l'exécution en mode Oracle, il est possible d'omettre les parenthèses. Cela vous permet d'émuler le ROWNUM pseudo colonne dans Oracle.

Voici un exemple de passage en mode Oracle :

SET SQL_MODE='ORACLE';

Nous pouvons maintenant exécuter ROWNUM sans parenthèses :

SELECT 
    ROWNUM,
    PetId,
    PetName
FROM Pets;

Résultat :

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

Notez que cela n'est disponible qu'en mode Oracle. Utilisation de ROWNUM sans parenthèses lorsqu'il n'est pas en mode Oracle entraîne une erreur.

Pour illustrer, passons au mode par défaut :

SET SQL_MODE=DEFAULT;

Exécutez à nouveau la requête :

SELECT 
    ROWNUM,
    PetId,
    PetName
FROM Pets;

Résultat :

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

Consultez la documentation de MariaDB pour certaines considérations concernant l'optimisation et d'autres facteurs.