Problème : manipulations quasi-exclusives sur une année donnée => tables .
  • Comment requêter plusieurs années en même temps ?
  • Opérations d'ensembles sur ensemble d'entrées (idéalement même colonnes) :
    • : concaténer les lignes [avec doublons].
    • : les lignes communes aux deux requêtes.
    • : les lignes de la première requête absentes de la seconde.
  • sous requête : utiliser une requête dans une autre requête.
  • 💡 Un ensemble d'entrées (placées entre parenthèses) peuvent remplacer :
    • une table dans une clause ;
    • une liste (si une seule colonne) ;
    • un scalaire (si une seule ligne et colonne).
Retourne vrai si comparaison vraie pour au moins un élément de la liste.
Certains SGBD requièrent d'ajouter entre l'opérateur de comparaison et la liste.
  • Sous requête corrélée : la sous-requête dépend de la requête principale.
    • 💡 requête non-corrélée : sous-requête exécutée une unique fois.
    • ⚠ requête correlée : réexécutée à chaque ligne de la requête principale.
      • ⚠ Il faut les éviter autant que possible...
      • ⚠ Ne pas calculer toutes les lignes, s'arrêter le plus tôt possible.
        • à la place de .
        • / ou à la place de certaines fonctions d'agrégations.
Problème : Table référence table .
  • comment obtenir :
    • la liste des vendeurs ayant au moins 10 ventes.
    • la liste des ventes des vendeurs embauchés il y a moins de 5 ans.
  • requêtes corrélées :
    • syntaxe lourde ;
    • peu performant.
Solution : les jointures ≈ fusionne des entrées de différentes tables.
  • Produit cartésien : table intermédiaire, combine toutes les entrées de et .
    • (e.g. )
    • sur table intermédiaire ⇒ majorité des entrées intermédiaires inutiles !
x = -- WHERE -->
T1.ID == T2.ID
  • ⚠ Même sur de petites tables, la table intermédiaire explose très vite :
# Entrées # Tables # Table intermédiaire # Résultats
E T E^T E
1 000 2 1 000 000 1 000
1 000 3 1 000 000 000 1 000
32 000 2 1 024 000 000 32 000
1 000 6 10^18 1 000
1 000 000 3 10^18 1 000 000
  • ⚠ 1 milliard de lignes ≈ plusieurs Go, et 10^18 ≈ plusieurs Po !!!
  • ⚠ On n'utilise JAMAIS les produits cartésien en SQL ! JA-MAIS !
  • Jointure : construit la table intermédiaire plus intelligemment :
    • Pour chaque entrée de (FK), recherche l'entrée de (PK) correspondant.
      • bien plus rapide et moins coûteux en mémoire.
      • ⚠ basé sur les colonnes de noms identiques entre et
JOIN =
  • 💡 Recherche des entrées de : si index ( ou PK) ⇒ quasi instantané.
    • ⚠ Fortement recommandé d'effectuer des jointures sur des index.
  • ⚠ exécuté après jointure.
    • 💡 SGBD peuvent optimiser en préfiltrant, lorsque possible, avant jointures.
Il existe 3 types de jointures fréquemment utilisées :
  • : , par défaut.
  • : + entrées de dont aucune entrée de ne correspond.
  • : + entrées de dont aucune entrée de ne correspond.
⚠ Il existe 2 autres types de jointures, à éviter :
  • : ⇔ (pour des raisons de lisibilité, préférez )
  • : produit cartésien (à éviter).
Problème : et ont des colonnes identiques, autres que celles de jointures.
Solution :
  • Éviter les jointures , et expliciter les colonnes de jointure :
    • ;
  • Renommer les colonnes homonymes :
    • ;
Problème : les colonnes de jointure ont des noms différents dans et .
Solution : Préciser la condition de jointure :
  • ;