1. La sémantique relationnelle des jointures en SQL

Le langage SQL exprime la logique de l’algèbre relationnelle. La jointure permet de recombiner les tables normalisées en fonction de prédicats de correspondance :

  • INNER JOIN : Retourne exclusivement les tuples ayant une correspondance exacte dans les deux tables.
  • LEFT (OUTER) JOIN : Conserve l’intégralité des lignes de la table de gauche, en complétant par NULL lorsque la table de droite ne contient aucun enregistrement concordant. Indispensable pour détecter les éléments non associés (ex. clients n’ayant jamais passé de commande : WHERE commande_id IS NULL).
  • FULL OUTER JOIN : Conserve toutes les lignes des deux tables en fusionnant les correspondances.
  • CROSS JOIN : Produit le produit cartésien complet (utile pour générer des grilles dimensionnelles complètes).

2. Sous-requêtes indépendantes vs sous-requêtes corrélées

Une sous-requête corrélée fait référence à une colonne de la requête parente externe. Elle est réévaluée pour chaque tuple de la relation principale :

-- Sélectionner les comptes bancaires dont le solde dépasse la moyenne de leur propre canton
SELECT c.nom, b.iban, b.solde_chf, c.canton
FROM comptes_bancaires b
JOIN clients c ON b.client_id = c.client_id
WHERE b.solde_chf > (
    SELECT AVG(b2.solde_chf)
    FROM comptes_bancaires b2
    JOIN clients c2 ON b2.client_id = c2.client_id
    WHERE c2.canton = c.canton
);

Bien que très expressive, la sous-requête corrélée peut présenter une complexité quadratique O(N²) si elle n’est pas optimisée par le planificateur de requêtes de PostgreSQL.