
La commande SELECT en SQL Oracle : guide complet avec exemples
La commande SELECT en SQL Oracle est la pierre angulaire de tout langage de requête structuré. Elle permet d’extraire, de filtrer et d’afficher des données stockées dans une base de données relationnelle. Que vous soyez développeur, analyste ou administrateur de base de données, maîtriser le SELECT SQL Oracle est une compétence incontournable pour exploiter pleinement la puissance du moteur Oracle Database.
Définition et utilisation du SELECT en SQL Oracle
La commande SELECT est une instruction de type DQL (Data Query Language). Son rôle est exclusivement de lire des données sans modifier le contenu de la base. Elle ne fait aucune écriture, aucune mise à jour : elle interroge.
En entreprise, le SELECT est omniprésent dans des contextes variés :
- Reporting métier : générer des états financiers, des tableaux de bord commerciaux ou des rapports RH.
- Audit de données : vérifier la cohérence ou l’intégrité d’enregistrements dans des tables de production.
- Développement applicatif : alimenter des interfaces utilisateurs en données dynamiques via des requêtes SQL embarquées.
- Exploration et analyse : comprendre la structure et le contenu d’une base lors d’une prise en main ou d’une migration.
Oracle Database, avec son optimiseur de requêtes avancé (le Cost-Based Optimizer), analyse chaque requête SELECT pour déterminer le plan d’exécution le plus performant. Il est donc crucial d’écrire des requêtes bien structurées pour en tirer le meilleur parti.
Syntaxe complète du SELECT SQL Oracle
Voici la syntaxe générale de la commande SELECT dans Oracle :
SELECT [DISTINCT | ALL] { * | expression [alias], ... }
FROM nom_table [alias_table]
[WHERE condition]
[GROUP BY expression]
[HAVING condition_groupe]
[ORDER BY expression [ASC | DESC]]
[FETCH FIRST n ROWS ONLY];
Explication des paramètres essentiels
- DISTINCT / ALL :
DISTINCTélimine les doublons dans le résultat.ALL(valeur par défaut) retourne toutes les lignes. - * ou expression : L’astérisque
*sélectionne toutes les colonnes. Il est préférable de nommer explicitement les colonnes souhaitées pour des raisons de performance et de lisibilité. - alias : Permet de renommer une colonne ou une table dans le résultat, en utilisant le mot-clé optionnel
AS. - FROM : Indique la ou les tables sources. Oracle supporte les jointures multi-tables dans cette clause.
- WHERE : Filtre les lignes selon une condition logique. Peut utiliser des opérateurs (
=,LIKE,BETWEEN,IN,IS NULL, etc.). - GROUP BY : Regroupe les résultats selon une ou plusieurs colonnes, en général pour utiliser des fonctions d’agrégation (
SUM,COUNT,AVG…). - HAVING : Filtre les groupes créés par
GROUP BY, à ne pas confondre avecWHERE. - ORDER BY : Trie les résultats en ordre croissant (
ASC, par défaut) ou décroissant (DESC). - FETCH FIRST n ROWS ONLY : Clause Oracle (depuis la version 12c) pour limiter le nombre de lignes retournées, en remplacement de
ROWNUM.
Exemples pratiques de SELECT en SQL Oracle
Exemple 1 – Lister les employés d’un département avec filtre et tri
Contexte métier : Le service RH souhaite obtenir la liste des employés du département 10 (comptabilité), triés par ordre de salaire décroissant, avec leur nom, prénom et salaire annuel.
-- Sélection des colonnes spécifiques avec un alias pour le salaire annuel
SELECT
e.LAST_NAME AS "Nom",
e.FIRST_NAME AS "Prénom",
e.SALARY * 12 AS "Salaire Annuel" -- calcul d'expression directement dans le SELECT
FROM
EMPLOYEES e -- alias de table 'e' pour alléger la syntaxe
WHERE
e.DEPARTMENT_ID = 10 -- filtre sur le département comptabilité
ORDER BY
e.SALARY DESC; -- tri du plus haut au plus bas salaire
Résultat attendu : Une liste ordonnée des collaborateurs du département 10 avec leur rémunération annuelle calculée à la volée. L’alias de colonne entre guillemets doubles permet d’afficher des libellés avec des espaces et des accents, ce qui est propre à Oracle.
Exemple 2 – Analyse des ventes par catégorie de produit avec agrégation
Contexte métier : Un contrôleur de gestion veut connaître le chiffre d’affaires total par catégorie de produit, uniquement pour les catégories ayant généré plus de 50 000 euros de revenus au cours du dernier exercice.
-- Agrégation du chiffre d'affaires par catégorie de produit
SELECT
p.CATEGORY_NAME AS "Catégorie",
COUNT(o.ORDER_ID) AS "Nombre de commandes",
SUM(oi.QUANTITY * oi.UNIT_PRICE) AS "Chiffre d'Affaires" -- calcul du CA total
FROM
ORDER_ITEMS oi
JOIN ORDERS o ON oi.ORDER_ID = o.ORDER_ID
JOIN PRODUCTS p ON oi.PRODUCT_ID = p.PRODUCT_ID
WHERE
EXTRACT(YEAR FROM o.ORDER_DATE) = 2024 -- filtre sur l'exercice 2024 (syntaxe Oracle)
GROUP BY
p.CATEGORY_NAME -- regroupement par catégorie
HAVING
SUM(oi.QUANTITY * oi.UNIT_PRICE) > 50000 -- filtre post-agrégation sur le CA
ORDER BY
"Chiffre d'Affaires" DESC; -- tri sur l'alias de colonne
Résultat attendu : Un tableau synthétique des meilleures catégories de produits par chiffre d’affaires, idéal pour alimenter un rapport de direction ou un outil de Business Intelligence. Notez l’utilisation de EXTRACT, fonction native Oracle pour manipuler les composantes d’une date.
Erreurs courantes avec SELECT en Oracle
Erreur : utiliser un alias de colonne dans la clause WHERE
Une erreur fréquente chez les débutants consiste à réutiliser un alias défini dans le SELECT directement dans la clause WHERE. Oracle retourne alors l’erreur ORA-00904: invalid identifier.
Exemple incorrect :
-- ? Erreur : l'alias "Salaire Annuel" n'est pas encore connu au moment du WHERE
SELECT SALARY * 12 AS "Salaire Annuel"
FROM EMPLOYEES
WHERE "Salaire Annuel" > 60000;
Solution correcte : Répétez l’expression dans le WHERE, ou utilisez une sous-requête (subquery) :
-- ? Solution 1 : répéter l'expression dans le WHERE
SELECT SALARY * 12 AS "Salaire Annuel"
FROM EMPLOYEES
WHERE SALARY * 12 > 60000;
-- ? Solution 2 : utiliser une sous-requête (inline view)
SELECT *
FROM (
SELECT SALARY * 12 AS "Salaire Annuel"
FROM EMPLOYEES
)
WHERE "Salaire Annuel" > 60000;
Explication : Oracle traite les clauses SQL dans un ordre logique précis : FROM ? WHERE ? GROUP BY ? HAVING ? SELECT ? ORDER BY. Les alias définis dans le SELECT ne sont donc disponibles que dans la clause ORDER BY (et dans le HAVING dans certains cas).
Résumé
| Clause | Rôle | Obligatoire ? |
|---|---|---|
SELECT | Définit les colonnes ou expressions à afficher | ? Oui |
FROM | Indique la ou les tables sources | ? Oui (sauf SELECT sur DUAL) |
WHERE | Filtre les lignes avant agrégation | ? Non |
GROUP BY | Regroupe les lignes pour les fonctions d’agrégation | ? Non |
HAVING | Filtre les groupes après agrégation | ? Non |
ORDER BY | Trie le résultat final | ? Non |
FETCH FIRST | Limite le nombre de lignes retournées (Oracle 12c+) | ? Non |
2 bonnes pratiques Oracle à retenir
- Évitez SELECT * en production : listez explicitement les colonnes nécessaires. Cela réduit la quantité de données transférées, améliore les performances et rend votre code plus robuste face aux évolutions de schéma.
- Utilisez des alias de table systématiquement : dès que votre requête implique plusieurs tables, préfixez chaque colonne avec l’alias de sa table (
e.SALARYplutôt queSALARY). Cela évite les ambiguïtés et facilite la maintenance du code SQL.
Aller plus loin avec SQL Oracle
Vous maîtrisez maintenant les fondamentaux de la commande SELECT en SQL Oracle. Pour approfondir vos compétences, découvrez ces sujets complémentaires :
- Les jointures SQL Oracle (JOIN, LEFT JOIN, FULL OUTER JOIN) : apprenez à combiner des données issues de plusieurs tables avec précision et efficacité.
- Les fonctions d’agrégation Oracle (SUM, COUNT, AVG, MAX, MIN) : exploitez toute la puissance des calculs statistiques dans vos requêtes SELECT.
- Les sous-requêtes et vues inline en Oracle : maîtrisez les requêtes imbriquées pour résoudre des problématiques complexes d’analyse de données.
Vidéo : Vidéo SQL ORACLE – 02 : Les requêtes DML (SELECT, INSERT, UPDATE et DELETE).
https://www.youtube.com/watch?v=4IERHEJ-TRM[/embed]
