ROWNUM Oracle : Guide complet avec exemples SQL

Maîtrisez ROWNUM en Oracle SQL : définition, syntaxe, exemples pratiques et erreurs courantes. Apprenez à limiter vos résultats efficacement.

Illustration du tutoriel SQL Oracle : ROWNUM Oracle : Guide complet avec exemples SQL

ROWNUM Oracle : tout savoir sur cette pseudocolonne SQL

En Oracle SQL, ROWNUM est une pseudocolonne incontournable qui permet de numéroter les lignes retournées par une requête et de limiter le nombre de résultats affichés. Contrairement à d’autres bases de données qui utilisent LIMIT, Oracle repose sur ROWNUM pour filtrer et paginer les données. Comprendre son fonctionnement précis est essentiel pour éviter des erreurs silencieuses et écrire des requêtes performantes.

Publicité

Définition et utilisation de ROWNUM en Oracle

ROWNUM est une pseudocolonne Oracle, c’est-à-dire une colonne virtuelle automatiquement disponible dans toute requête SELECT, sans qu’elle soit physiquement stockée dans la table. Elle attribue un numéro séquentiel (1, 2, 3…) à chaque ligne au moment où elle est retournée par le moteur Oracle, avant tout tri ou regroupement.

Cas d’usage en entreprise

Dans un contexte professionnel, ROWNUM est utilisé pour :

  • Limiter le nombre de résultats : afficher uniquement les 10 premières commandes d’un client.
  • Paginer des données : implémenter un système de pagination dans une application métier (page 1, page 2…).
  • Extraire un échantillon : isoler un sous-ensemble de données pour des tests ou des analyses.
  • Identifier les N premiers enregistrements : retrouver les 5 meilleurs vendeurs du mois selon leur chiffre d’affaires.

Depuis Oracle 12c, la clause FETCH FIRST n ROWS ONLY offre une alternative plus lisible, mais ROWNUM reste massivement présent dans les bases de code existantes et continue d’être enseigné dans les certifications Oracle.

Syntaxe de ROWNUM

ROWNUM s’utilise directement dans la clause WHERE d’une requête SELECT. Voici la structure générale :

SELECT colonne1, colonne2, ...
FROM nom_table
WHERE ROWNUM <= n;

Explication des paramètres

  • colonne1, colonne2 : les colonnes à afficher dans le résultat.
  • nom_table : la table source des données.
  • ROWNUM <= n : filtre les n premières lignes retournées par Oracle.

Opérateurs compatibles avec ROWNUM

OpérateurUtilisationRésultat
ROWNUM <= nLimiter à n lignes✅ Fonctionne
ROWNUM < nLimiter à n-1 lignes✅ Fonctionne
ROWNUM = 1Retourner uniquement la 1ère ligne✅ Fonctionne
ROWNUM = n (n > 1)Retourner la n-ième ligne❌ Ne retourne rien
ROWNUM >= nIgnorer les n premières lignes❌ Ne retourne rien

⚠️ Point crucial : ROWNUM est assigné avant l’exécution du ORDER BY. Pour trier avant de filtrer, il est indispensable d’utiliser une sous-requête.

Exemples pratiques de ROWNUM en Oracle SQL

Exemple 1 — Afficher les 5 premières commandes d’un client

Contexte métier : Une application CRM doit afficher les 5 commandes les plus récentes pour un client donné sur le tableau de bord d’un commercial.

-- Sélection des 5 premières commandes du client numéro 1042
-- en les triant par date décroissante (plus récentes en premier)

SELECT *
FROM (
    SELECT
        commande_id,
        date_commande,
        montant_total,
        statut
    FROM commandes
    WHERE client_id = 1042
    ORDER BY date_commande DESC  -- On trie d'abord dans la sous-requête
)
WHERE ROWNUM <= 5;  -- On limite ensuite les résultats à 5 lignes

💡 Pourquoi une sous-requête ? Sans sous-requête, Oracle appliquerait ROWNUM avant le tri, ce qui retournerait 5 lignes aléatoires plutôt que les 5 plus récentes. La sous-requête garantit que le tri est effectué en premier.

Exemple 2 — Pagination : afficher la page 2 (lignes 11 à 20) des produits

Contexte métier : Un site e-commerce affiche des produits par page de 10 articles. L’utilisateur navigue sur la page 2 : il faut retourner les enregistrements 11 à 20.

-- Pagination avec ROWNUM : récupérer les lignes 11 à 20
-- On utilise deux niveaux de sous-requêtes

SELECT produit_id, nom_produit, prix_unitaire
FROM (
    SELECT
        produit_id,
        nom_produit,
        prix_unitaire,
        ROWNUM AS rn  -- On capture ROWNUM dans un alias
    FROM (
        SELECT
            produit_id,
            nom_produit,
            prix_unitaire
        FROM produits
        WHERE actif = 'O'
        ORDER BY nom_produit ASC  -- Tri alphabétique pour une pagination cohérente
    )
    WHERE ROWNUM <= 20  -- On récupère au maximum les 20 premières lignes
)
WHERE rn >= 11;  -- On filtre pour ne garder que les lignes 11 à 20

💡 Pourquoi trois niveaux ? La pseudocolonne ROWNUM ne peut pas être filtrée avec >= directement. Il faut d’abord la capturer dans un alias (rn) via une couche intermédiaire, puis filtrer sur cet alias dans la requête externe.

Publicité

Erreurs courantes avec ROWNUM en Oracle

Erreur : utiliser ROWNUM avec ORDER BY dans la même requête

C’est l’erreur la plus fréquente des développeurs qui découvrent Oracle. Considérons cette requête :

-- ❌ INCORRECT : ROWNUM est appliqué AVANT le tri
SELECT employe_id, nom, salaire
FROM employes
WHERE ROWNUM <= 3
ORDER BY salaire DESC;

Cette requête ne retourne pas les 3 employés les mieux payés. Elle récupère d’abord 3 lignes arbitraires dans la table, puis les trie par salaire. Le résultat est imprévisible et incorrect.

Solution : encapsuler le tri dans une sous-requête

-- ✅ CORRECT : on trie d'abord, puis on limite
SELECT employe_id, nom, salaire
FROM (
    SELECT employe_id, nom, salaire
    FROM employes
    ORDER BY salaire DESC  -- Tri dans la sous-requête
)
WHERE ROWNUM <= 3;  -- Limitation dans la requête externe

Avec cette structure, Oracle effectue d’abord le tri complet dans la sous-requête, puis applique la limitation. Les 3 salaires les plus élevés sont correctement retournés.

Résumé

Tableau récapitulatif — ROWNUM Oracle

Point cléDétail
NaturePseudocolonne Oracle (non stockée physiquement)
Rôle principalLimiter et paginer les résultats d’une requête
Moment d’assignationAvant le tri (ORDER BY)
Opérateur recommandé<= ou <
Piège principalUtiliser ORDER BY sans sous-requête
Alternative Oracle 12c+FETCH FIRST n ROWS ONLY
PaginationNécessite 2 niveaux de sous-requêtes

2 bonnes pratiques Oracle

  1. Toujours trier dans une sous-requête avant d’appliquer ROWNUM. Ne jamais combiner WHERE ROWNUM <= n et ORDER BY dans la même requête sans encapsulation.
  2. Préférer FETCH FIRST pour les nouveaux développements sur Oracle 12c et versions supérieures : la syntaxe est plus lisible, moins sujette aux erreurs, et optimisée par l’optimiseur Oracle.

Aller plus loin

Pour approfondir vos connaissances sur la manipulation et la pagination des données en Oracle SQL, voici trois sujets complémentaires :

  • FETCH FIRST ROWS ONLY en Oracle — Découvrez la syntaxe moderne introduite en Oracle 12c pour limiter les résultats de façon plus intuitive et lisible que ROWNUM.
  • Fonction analytique ROW_NUMBER() en Oracle — Comprenez la différence entre la pseudocolonne ROWNUM et la fonction analytique ROW_NUMBER() OVER(), bien plus puissante pour la numérotation conditionnelle.
  • Les sous-requêtes en Oracle SQL — Maîtrisez les sous-requêtes imbriquées, indispensables pour utiliser ROWNUM correctement et construire des requêtes complexes et performantes.

Sur le même thème

Publicité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Publicité