La requête SQL SELECT extrait des données depuis une ou plusieurs tables d’une base de données relationnelle et retourne un résultat sous forme de tableau.
Table des matières
Syntaxe de base
La syntaxe de la commande SELECT est identique sur MySQL, PostgreSQL, SQL Server, MariaDB et SQLite, ce qui en fait une instruction universelle.
-- Sélectionner une seule colonne
SELECT nom FROM clients;
-- Sélectionner plusieurs colonnes
SELECT nom, ville FROM clients;
-- Sélectionner toutes les colonnes
SELECT * FROM clients;
Une requête SELECT minimale contient trois éléments obligatoires : le mot-clé SELECT, une liste de colonnes ou le caractère *, et le mot-clé FROM suivi du nom de la table. Le point-virgule clôt la requête et est obligatoire dans les scripts contenant plusieurs instructions. Cette structure retourne les données demandées sous forme de tableau, chaque ligne correspondant à un enregistrement de la table.
Sélectionner toutes les colonnes
SELECT * retourne l’intégralité des colonnes d’une table sans qu’il soit nécessaire de les lister individuellement. Cette forme convient aux explorations rapides et aux vérifications de structure sur une table inconnue. En revanche, elle n’est pas recommandée en production car elle charge des colonnes potentiellement inutiles.
La table clients contient les colonnes id, nom, ville, age et solde. La requête suivante extrait toutes ces colonnes en une seule instruction sans aucun filtre appliqué.
SELECT * FROM clients;
| id | nom | ville | age | solde |
|---|---|---|---|---|
| 1 | Dupont | Paris | 28 | 1500 |
| 2 | Martin | Lyon | 35 | 2200 |
| 3 | Durand | Marseille | 42 | 1800 |
| 4 | Leroy | Paris | 31 | 1900 |
Le résultat affiche les quatre lignes avec l’ensemble des cinq colonnes de la table. Vérifiez que le nombre de colonnes retournées correspond bien à la structure réelle de la table.
Sélectionner des colonnes précises
Lister les colonnes explicitement réduit le volume de données transféré entre la base et l’application. C’est la pratique recommandée pour toute requête destinée à un environnement de production. Par exemple, si la table contient vingt colonnes et que l’application n’en utilise que deux, SELECT * charge dix-huit colonnes inutilement.
Pour extraire uniquement les noms et les soldes des clients, on liste ces deux colonnes directement après le mot-clé SELECT.
SELECT nom, solde FROM clients;
| nom | solde |
|---|---|
| Dupont | 1500 |
| Martin | 2200 |
| Durand | 1800 |
| Leroy | 1900 |
Le résultat ne contient que les deux colonnes demandées, toutes les autres étant exclues du tableau retourné. Vérifiez que les noms de colonnes correspondent exactement à ceux définis dans la structure de la table.
Utiliser un alias avec AS
AS assigne un alias lisible à une colonne dans le résultat de la requête, sans modifier le nom réel de la colonne en base de donnée. Cette instruction est particulièrement utile pour les interfaces utilisateur qui affichent directement les en-têtes de colonnes. Un alias peut contenir des espaces à condition d’être encadré par des guillemets doubles.
Pour afficher la colonne nom sous le libellé « Nom complet » et la colonne solde sous « Solde du compte », on utilise AS directement après chaque nom de colonne.
SELECT nom AS "Nom complet", solde AS "Solde du compte"
FROM clients;
| Nom complet | Solde du compte |
|---|---|
| Dupont | 1500 |
| Martin | 2200 |
L’alias remplace le nom de colonne dans l’en-tête du tableau retourné par le moteur. Notez que cet alias n’est pas utilisable dans la clause WHERE de la même requête, car WHERE s’exécute avant SELECT.
Ordre d’exécution des clauses
Le moteur SQL n’exécute pas les clauses dans l’ordre où elles sont écrites dans la requête. L’ordre réel de traitement suit une logique interne précise qui détermine quelles données sont disponibles à chaque étape.
| Ordre | Clause | Rôle |
|---|---|---|
| 1 | FROM | Identifie les tables sources |
| 2 | WHERE | Filtre les lignes |
| 3 | GROUP BY | Regroupe les lignes |
| 4 | HAVING | Filtre les groupes |
| 5 | SELECT | Projette les colonnes |
| 6 | ORDER BY | Trie les résultats |
| 7 | LIMIT | Restreint le nombre de lignes |
Cet ordre explique pourquoi un alias défini dans SELECT n’est pas utilisable dans WHERE : WHERE s’exécute avant SELECT et ne connaît pas encore cet alias. En revanche, ORDER BY s’exécute après SELECT et accepte les alias sans générer d’erreur.
SELECT nom, solde AS montant
FROM clients
WHERE solde > 1600
ORDER BY montant DESC;
Bonnes pratiques
Règle 1 — Lister les colonnes explicitement
SELECT * charge toutes les colonnes, y compris celles que l’application n’utilise pas. Par exemple, SELECT nom, solde FROM clients transfère deux fois moins de données que SELECT * FROM clients sur une table à dix colonnes.
Règle 2 — Utiliser des alias lisibles avec AS
Un alias clarifie la lecture des résultats, notamment dans les rapports. Par exemple, SELECT solde AS "Solde client" est plus explicite que SELECT solde pour un utilisateur non technique.
Règle 3 — Tester sur des données de recette
Validez chaque nouvelle requête sur un jeu de données de test avant de l’exécuter sur la base de production.
Règle 4 — Terminer chaque requête par un point-virgule
Le point-virgule est obligatoire dans les scripts multi-requêtes pour que le moteur délimite correctement chaque instruction.
Règle 5 — Utiliser les guillemets simples pour les chaînes de caractères
Les guillemets doubles sont interprétés différemment des guillemets simples selon les SGBD. WHERE ville = 'Paris' fonctionne de manière identique sur MySQL, PostgreSQL et SQL Server.
Cas pratique
Un service commercial veut lister les clients parisiens dont le solde dépasse 1 600 € et triés par solde décroissant pour identifier les meilleurs comptes en priorité.
SELECT nom, ville, solde
FROM clients
WHERE ville = 'Paris'
AND solde > 1600
ORDER BY solde DESC;
| nom | ville | solde |
|---|---|---|
| Leroy | Paris | 1900 |
La requête retourne uniquement les clients qui satisfont les deux conditions définies dans la condition WHERE. Vérifiez que le filtre sur solde utilise bien un entier et non une chaîne de caractères pour éviter une comparaison incorrecte.
Erreurs courantes
❌ Erreur : mot-clé FROM absent
SELECT nom ville clients;
-- Le moteur ne peut pas identifier la source des données.
✅ Correct :
SELECT nom, ville FROM clients;
❌ Erreur : alias utilisé dans WHERE
SELECT solde AS montant FROM clients WHERE montant > 1000;
-- WHERE s'exécute avant SELECT : l'alias n'existe pas encore.
✅ Correct :
SELECT solde AS montant FROM clients WHERE solde > 1000;
❌ Erreur : guillemets doubles pour une chaîne (MySQL)
SELECT * FROM clients WHERE ville = "Paris";
-- MySQL interprète les guillemets doubles comme un identifiant.
✅ Correct :
SELECT * FROM clients WHERE ville = 'Paris';