Jointures latérales (LATERAL JOIN)
Référencez l’élément précédent de FROM depuis une sous-requête avec LATERAL : l’équivalent SQL d’un appel de fonction pour chaque ligne.
Jointures latérales (LATERAL JOIN) est une leçon SQL Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Academy comprend 4 leçons au total.
Qu’est-ce que LATERAL ?
LATERAL permet à une sous-requête de la clause FROM de faire référence aux colonnes des éléments placés plus tôt dans la liste FROM. Sans LATERAL, les éléments de FROM ne peuvent pas se voir entre eux.
Modèle mental
LATERAL signifie : « pour chaque ligne du côté gauche, évaluez cette requête ». Cela ressemble à une sous-requête corrélée, mais dans la clause FROM, et elle peut renvoyer plusieurs lignes et colonnes.
Les trois premières commandes par utilisateur
L’utilisation classique de LATERAL :
SELECT u.id, u.email, o.id AS order_id, o.total
FROM users u
JOIN LATERAL (
SELECT id, total FROM orders
WHERE user_id = u.id
ORDER BY total DESC
LIMIT 3
) AS o ON true;Pourquoi ne pas utiliser une sous-requête dans SELECT ?
Une sous-requête scalaire dans SELECT renvoie une seule valeur. LATERAL renvoie plusieurs lignes et plusieurs colonnes pour chaque ligne externe.
LATERAL avec des fonctions
Les fonctions renvoyant un ensemble se comportent par défaut comme LATERAL :
SELECT t.id, unnest_tag
FROM posts t
CROSS JOIN LATERAL unnest(t.tags) AS unnest_tag;
-- Equivalent (set-returning functions are implicit LATERAL):
SELECT t.id, unnest_tag
FROM posts t, unnest(t.tags) AS unnest_tag;LATERAL ou fonctions de fenêtrage
Pour obtenir les N premiers éléments par groupe, LATERAL et ROW_NUMBER conviennent tous deux. ROW_NUMBER est souvent plus efficace, car il parcourt la table une seule fois ; LATERAL réexécute la requête pour chaque ligne externe.
-- ROW_NUMBER alternative:
WITH ranked AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY total DESC) AS rn
FROM orders
)
SELECT u.email, r.id, r.total
FROM users u
JOIN ranked r ON r.user_id = u.id
WHERE r.rn <= 3;LATERAL avec des agrégats
Valeurs précalculées pour chaque ligne :
SELECT u.email, stats.last_order_at, stats.total_orders
FROM users u
LEFT JOIN LATERAL (
SELECT MAX(created_at) AS last_order_at,
COUNT(*) AS total_orders
FROM orders WHERE user_id = u.id
) AS stats ON true;ON true
LATERAL nécessite une clause ON avec JOIN, mais la condition de jointure se trouve dans la sous-requête ; le ON externe est donc true.
CROSS JOIN LATERAL ou LEFT JOIN LATERAL
- CROSS JOIN LATERAL — la ligne externe est supprimée si la requête interne ne renvoie aucune ligne
- LEFT JOIN LATERAL ... ON true — la ligne externe est conservée avec des colonnes NULL
LATERAL pour les requêtes de distance
Pour chaque utilisateur, trouver le magasin le plus proche :
SELECT u.id, s.name, s.distance
FROM users u
CROSS JOIN LATERAL (
SELECT name, location <-> u.location AS distance
FROM stores
ORDER BY location <-> u.location
LIMIT 1
) AS s;LATERAL est normalisé par SQL
Normalisé dans SQL:1999. PostgreSQL l’implémente avec LATERAL ; SQL Server utilise CROSS APPLY et OUTER APPLY.
Performances
LATERAL exécute la requête pour chaque ligne externe. Avec un index adapté sur la table interne, chaque itération est rapide. Sans index, les performances peuvent être mauvaises à grande échelle.
Récapitulatif
LATERAL = « une sous-requête de FROM qui voit la ligne externe ».
- Les N premiers éléments par groupe
- Précalcul par ligne
- Fonctions renvoyant un ensemble
- Associez-le à LEFT JOIN ... ON true pour les jointures externes
Vérification rapide
Qu’est-ce que LATERAL permet contrairement à une sous-requête normale de FROM ?
Questions Fréquemment Posées
La leçon « Jointures latérales (LATERAL JOIN) » est-elle gratuite ?
Oui — le texte complet de « Jointures latérales (LATERAL JOIN) » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Academy, passe à CoddyKit PRO. Le cours SQL Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Jointures latérales (LATERAL JOIN) » ?
Référencez l’élément précédent de FROM depuis une sous-requête avec LATERAL : l’équivalent SQL d’un appel de fonction pour chaque ligne. Tu pratiques SQL Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer SQL Academy ?
Aucune expérience préalable n'est requise. SQL Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Jointures latérales (LATERAL JOIN) » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon SQL Academy ?
Oui. Chaque leçon SQL Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Jointures croisées et produits cartésiens
- Jointures latérales (LATERAL JOIN)
- Anti-jointures et semi-jointures (NOT EXISTS)
- Optimisation des performances des jointures multi-tables