
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.
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érateur | Utilisation | Résultat |
|---|---|---|
ROWNUM <= n | Limiter à n lignes | ✅ Fonctionne |
ROWNUM < n | Limiter à n-1 lignes | ✅ Fonctionne |
ROWNUM = 1 | Retourner uniquement la 1ère ligne | ✅ Fonctionne |
ROWNUM = n (n > 1) | Retourner la n-ième ligne | ❌ Ne retourne rien |
ROWNUM >= n | Ignorer 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.
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 |
|---|---|
| Nature | Pseudocolonne Oracle (non stockée physiquement) |
| Rôle principal | Limiter et paginer les résultats d’une requête |
| Moment d’assignation | Avant le tri (ORDER BY) |
| Opérateur recommandé | <= ou < |
| Piège principal | Utiliser ORDER BY sans sous-requête |
| Alternative Oracle 12c+ | FETCH FIRST n ROWS ONLY |
| Pagination | Nécessite 2 niveaux de sous-requêtes |
2 bonnes pratiques Oracle
- Toujours trier dans une sous-requête avant d’appliquer
ROWNUM. Ne jamais combinerWHERE ROWNUM <= netORDER BYdans la même requête sans encapsulation. - Préférer
FETCH FIRSTpour 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
ROWNUMet la fonction analytiqueROW_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
ROWNUMcorrectement et construire des requêtes complexes et performantes.
Sur le même thème
- ORDER BY en SQL Oracle : tri des résultats expliqué
- ROLLBACK Oracle : annuler une transaction SQL facilement
- DELETE en SQL Oracle : Syntaxe et Exemples Pratiques
- OFFSET en SQL Oracle : Pagination et Exemples Pratiques
- COMMIT Oracle SQL : valider vos transactions facilement
- FETCH FIRST Oracle : limiter les résultats SQL facilement
