La commande SQL FROM indique au moteur SQL la table exacte qui contient les données à extraire, filtrer ou supprimer dans une requête.
Table des matières
Syntaxe de base
La clause FROM occupe toujours la deuxième position dans une requête SELECT, juste après la liste des colonnes demandées. Elle précède obligatoirement WHERE et toutes les autres clauses de filtrage ou de tri. Cette position fixe respecte l’ordre logique de lecture d’une requête SQL standard.
SELECT produit, prix FROM catalogue;
Le mot-clé FROM relie les colonnes listées dans la requête à la table physique qui les contient. Sans FROM, le moteur SQL ne sait pas où chercher les données demandées. Le moteur SQL n’exécute pas les clauses dans l’ordre d’écriture mais dans un ordre interne précis.
Utiliser FROM avec une table unique
La forme la plus simple référence une seule table sans jointure, ce qui convient aux extractions directes ne nécessitant pas de croiser plusieurs sources de données. Le moteur accède directement à la table indiquée et retourne les colonnes demandées dans la requête de sélection.
La requête suivante extrait les colonnes nom et prix depuis la table produits sans aucun filtre appliqué.
SELECT nom, prix
FROM produits;
Le résultat contient toutes les lignes de la table avec uniquement les deux colonnes demandées. Vérifiez que le nom de la table correspond exactement à celui défini en base de données, en respectant la casse selon le SGBD.
Utiliser un alias de table
Un alias attribue un nom court à une table pour éviter de répéter son nom complet dans toute la requête. Cette technique améliore la lisibilité du code, notamment quand plusieurs tables sont impliquées. L’alias se définit directement après le nom de la table dans FROM, sans le mot-clé AS.
La requête suivante utilise p comme alias de la table produits pour préfixer les colonnes sélectionnées.
SELECT p.nom, p.prix
FROM produits p;
L’alias p remplace le nom complet produits dans toutes les clauses de la requête. Choisissez des alias courts mais explicites, par exemple cli pour clients plutôt que t1.
Joindre deux tables avec JOIN
FROM contient la première table d’une jointure, suivie du mot-clé JOIN et de la table à associer. La condition ON définit la colonne commune qui relie les deux tables entre elles. Cette structure associe chaque ligne de la première table à ses lignes correspondantes dans la seconde.
La requête suivante associe chaque client à ses commandes via la colonne client_id.
SELECT c.nom, com.montant
FROM clients c
JOIN commandes com ON c.id = com.client_id;
Chaque ligne du résultat représente une association valide entre un client et une de ses commandes. Vérifiez que les colonnes de liaison ont le même type de données dans les deux tables pour éviter des erreurs de jointure.
Joindre plusieurs tables
Les jointures multiples enchaînent plusieurs JOIN successifs après FROM pour croiser trois tables ou plus. Chaque nouvelle table s’ajoute séquentiellement avec sa propre condition ON. Cette structure permet d’assembler toutes les informations nécessaires en une seule requête.
La requête suivante relie les clients, leurs commandes, les produits commandés et leurs catégories en une seule instruction.
SELECT c.nom, p.reference, ca.libelle
FROM clients c
JOIN commandes com ON c.id = com.client_id
JOIN produits p ON com.produit_id = p.id
JOIN categories ca ON p.categorie_id = ca.id;
Le résultat regroupe les informations des quatre tables dans un tableau unique. Testez chaque jointure individuellement avec LIMIT 10 avant d’assembler la requête complète.
Utiliser une sous-requête dans FROM
Une sous-requête placée dans FROM génère une table temporaire qui n’existe que le temps d’exécution de la requête principale. Cette table virtuelle reçoit obligatoirement un alias pour être référencée par les autres clauses. Elle isole les calculs intermédiaires et simplifie les requêtes complexes.
La requête suivante compte les clients actifs par ville en utilisant une sous-requête pour filtrer d’abord les actifs.
SELECT ville, COUNT(*)
FROM (
SELECT ville FROM clients WHERE actif = 1
) AS clients_actifs
GROUP BY ville;
La sous-requête filtre les clients actifs avant que GROUP BY regroupe les résultats par ville. Vérifiez que l’alias de la sous-requête est bien défini avec AS pour éviter une erreur de syntaxe.
Compatibilité SGBD
| Commande | FROM standard | FROM étendu |
|---|---|---|
| SELECT | ✅ Obligatoire | ✅ Tous SGBD |
| DELETE | ✅ Après DELETE | ✅ SQL Server uniquement |
| UPDATE | ❌ Non standard | ✅ PostgreSQL, SQL Server |
| INSERT | ❌ Jamais | ❌ Jamais |
SQL Server et PostgreSQL acceptent FROM dans les requêtes de mise à jour pour des jointures complexes, alors que MySQL et SQLite rejettent cette syntaxe étendue et utilisent à la place JOIN directement dans UPDATE.
-- UPDATE avec FROM (SQL Server et PostgreSQL uniquement)
UPDATE produits p
SET prix = p.prix * 1.1
FROM categories c
WHERE p.categorie_id = c.id AND c.nom = 'luxe';
-- DELETE avec FROM étendu (SQL Server uniquement)
DELETE p
FROM produits p
JOIN categories c ON p.categorie_id = c.id
WHERE c.nom = 'obsolete';
Bonnes pratiques
Règle 1 — Utiliser des alias explicites dès plusieurs tablesFROM clients cli est plus lisible que FROM clients c1 et évite les confusions dans les jointures complexes.
Règle 2 — Éviter SELECT * en productionSELECT nom, prix FROM produits transfère uniquement les colonnes utiles, contrairement à SELECT * FROM produits qui charge toutes les colonnes.
Règle 3 — Tester chaque jointure individuellement
Ajoutez LIMIT 10 après chaque JOIN pour vérifier la relation avant d’assembler la requête finale complète.
Règle 4 — Respecter l’ordre des clauses
L’ordre SELECT → FROM → WHERE → GROUP BY → ORDER BY prévient les erreurs de syntaxe et facilite la lecture du code par l’équipe.
Règle 5 — Nommer les tables de manière descriptive
Un nom comme commandes_2026 évite toute ambiguïté dans FROM et simplifie la maintenance à long terme de la base.
Cas pratique
Un service comptable extrait le nom de chaque client, le montant de ses commandes et la catégorie des produits achetés pour générer un rapport trimestriel.
SELECT cli.nom, com.montant, cat.libelle
FROM clients cli
JOIN commandes com ON cli.id = com.client_id
JOIN produits pro ON com.produit_id = pro.id
JOIN categories cat ON pro.categorie_id = cat.id
WHERE com.date_commande >= '2026-01-01'
ORDER BY com.montant DESC;
Erreurs courantes
❌ Erreur : FROM absent
SELECT nom, prix;
-- Le moteur ne peut pas identifier la source des données.
✅ Correct :
SELECT nom, prix FROM produits;
❌ Erreur : alias ambigu sur plusieurs tables
SELECT nom FROM clients c JOIN commandes com ON id = client_id;
-- Le moteur ne sait pas à quelle table appartient la colonne id.
✅ Correct :
SELECT c.nom FROM clients c JOIN commandes com ON c.id = com.client_id;
❌ Erreur : FROM étendu dans UPDATE sur MySQL
UPDATE produits SET prix = c.tarif FROM categories c WHERE produits.cat_id = c.id;
-- MySQL ne supporte pas FROM dans UPDATE.
✅ Correct (MySQL) :
UPDATE produits p JOIN categories c ON p.cat_id = c.id SET p.prix = c.tarif;