Aller au contenu principal
bddLes arbres algébriques

Les arbres algébriques

Objectifs du Chapitre

Comprendre le rôle de l'algèbre relationnelle dans la manipulation des données.

Savoir utiliser les opérations de base de l'algèbre relationnelle.

Savoir traduire une requête SQL en algèbre relationnelle.

Savoir lire et interpréter un arbre algébrique.

Savoir écrire un arbre algébrique à partir d'une requête SQL.

Où on va

Quand tu écris une requête SQL, tu dis ce que tu veux ; le moteur, lui, décide comment l'obtenir. L'algèbre relationnelle est le langage dans lequel il raisonne, et l'arbre algébrique en est le dessin. Savoir le lire, c'est comprendre pourquoi deux requêtes qui donnent le même résultat ne coûtent pas le même prix.

Algèbre relationnelle

L'algèbre relationnelle est un langage formel qui permet de manipuler les données dans une base relationnelle à l'aide d'opérations mathématiques. Ces opérations sont indépendantes du langage SQL mais constituent sa base théorique.

Opérations de base

Les opérations principales sont les suivantes :

OpérationNotationDescription
Sélectionσ{condition}(R)Filtrer des lignes selon une condition
Projectionπ{colonnes}(R)Extraire des colonnes spécifiques
UnionR ∪ SCombiner deux relations (sans doublons)
DifférenceR − SSupprimer de R les lignes présentes dans S
Produit cartésienR × SCombinaison de toutes les lignes de deux relations
JointureR ⨝{condition} SCombiner deux relations selon une condition
DivisionR ÷ STrouver les lignes liées à toutes celles d'une autre relation

Opérations fondamentales de l'algèbre relationnelle

Sélection (σ)

Filtre les lignes d'une relation selon une condition. Elle permet de ne garder que les tuples (lignes) qui respectent un critère donné (égalité, inégalité, appartenance…).

σ_{salaire > 2000}(Employe)
Exemple

Relation Employe :

idnomsalaire
1Alice1800
2Bernard2200

Résultat de σ_{salaire > 2000}(Employe) :

idnomsalaire
2Bernard2200

Exercice : Voici la table Produit :

idnomprix
1Clavier45
2Souris30
3Écran220

Écris une expression algébrique qui sélectionne les produits dont le prix est supérieur à 40.

Afficher la solution

σ_{prix > 40}(Produit)

Résultat :

idnomprix
1Clavier45
3Écran220

Projection (π)

Sélectionne certaines colonnes d'une relation. Elle permet de réduire la relation à certains attributs (en supprimant les doublons si nécessaire).

π_{nom, salaire}(Employe)
Exemple

Résultat de π_{nom, salaire}(Employe) :

nomsalaire
Alice1800
Bernard2200

Exercice : En reprenant la table Produit :

idnomprix
1Clavier45
2Souris30
3Écran220

Écris une expression d'algèbre relationnelle qui ne garde que les colonnes nom et prix.

Afficher la solution

π_{nom, prix}(Produit)

Résultat :

nomprix
Clavier45
Souris30
Écran220

Union (∪)

Combine deux relations ayant le même schéma (mêmes colonnes). Elle retourne toutes les lignes présentes dans l'une ou l'autre, en supprimant les doublons.

Client ∪ Prospect
Exemple

Client :

nom
Alice
Bernard

Prospect :

nom
Claire
Bernard

Résultat :

nom
Alice
Bernard
Claire

Exercice : Voici deux relations :

Client :

nom
Alice
Bernard

Prospect :

nom
Bernard
Camille

Écris une opération d'union pour obtenir la liste complète des noms sans doublons.

Afficher la solution

Client ∪ Prospect

Résultat :

nom
Alice
Bernard
Camille

Différence (−)

Renvoie les lignes présentes uniquement dans la première relation. Elle permet de soustraire une relation d'une autre.

Client − Prospect
Exemple

Résultat :

nom
Alice

Exercice : Toujours avec les relations Client et Prospect, écris une opération pour obtenir les clients qui ne sont pas aussi prospects.

Afficher la solution

Client − Prospect

Résultat :

nom
Alice

Produit cartésien (×)

Associe chaque ligne d'une relation avec chaque ligne de l'autre. C'est une opération de base sur laquelle repose la jointure.

Employe × Projet
Exemple

Employe :

nom
Alice
Bernard

Projet :

code
P1
P2

Résultat :

nomcode
AliceP1
AliceP2
BernardP1
BernardP2

Exercice : Soit :

Auteurs(nom) Livres(titre)

Écris une opération algébrique qui produit toutes les combinaisons possibles entre auteurs et livres.

Afficher la solution

Auteurs × Livres

→ Produit cartésien : chaque auteur associé à chaque livre.

Si Auteurs = 2 lignes et Livres = 3 lignes, le résultat = 2 × 3 = 6 lignes.

Jointure (⨝)

Permet de lier deux relations selon une condition, souvent sur une clé étrangère. Elle combine des lignes ayant une correspondance logique.

Employe ⨝_{Employe.idProjet = Projet.idProjet} Projet
Exemple

Employe :

nomidProjet
Alice1
Bernard2

Projet :

idProjetnomProjet
1SI
2IoT

Résultat :

nomnomProjet
AliceSI
BernardIoT

Exercice : Voici deux relations :

Etudiant(idEtudiant, nom, idClasse) Classe(idClasse, nomClasse)

Écris une expression d'algèbre relationnelle qui affiche le nom de chaque étudiant avec le nomClasse associé.

Afficher la solution

π_{nom, nomClasse}(Etudiant ⨝_{Etudiant.idClasse = Classe.idClasse} Classe)

→ Jointure sur idClasse, puis projection des colonnes souhaitées.

Division (÷)

Opération avancée : elle permet de trouver les éléments associés à tous les éléments d'une autre relation. Souvent utilisée pour vérifier une couverture complète.

Employe ÷ Competence

Interprétation

On recherche les employés qui possèdent toutes les compétences répertoriées dans la table Competence.

Exemple

EmployeCompetence :

employecompetence
AliceJava
AliceSQL
BernardJava

Competence :

competence
Java
SQL

Résultat de EmployeCompetence ÷ Competence :

employe
Alice

Bernard ne possède que Java, pas SQL - il est donc exclu du résultat.

Exercice : Deux relations :

EmployeCompetence(employe, competence) Competence(competence)

Écris une expression pour trouver les employés qui possèdent toutes les compétences listées dans la table Competence.

Afficher la solution

EmployeCompetence ÷ Competence

→ La division permet de récupérer les employés associés à toutes les lignes de la relation Competence.

Arbres algébriques

Un arbre algébrique est une représentation graphique d'une requête SQL traduite en algèbre relationnelle. Il permet de visualiser la logique d'exécution de la requête : quelles opérations sont appliquées, sur quelles relations, et dans quel ordre.

Définition : Un arbre algébrique est une structure arborescente utilisée pour modéliser les opérations d'une requête relationnelle. Chaque nœud représente une opération (projection, jointure, sélection…). Les feuilles correspondent aux tables de la base.

Structure d'un arbre

Élément de l'arbreRôle
Nœuds internesOpérations algébriques (σ, π, ⨝, ×…)
FeuillesTables sources utilisées dans la requête
ArêtesRelations entre opérations, représentant l'ordre d'évaluation
Ordre de lectureL'arbre se lit de bas en haut : les opérations internes sont évaluées d'abord
À retenir
  • Les arbres aident à comprendre l'ordre d'exécution d'une requête SQL.
  • Ils permettent de traduire une requête textuelle en structure logique.
  • Ils sont particulièrement utiles pour l'optimisation ou la modélisation automatique des requêtes.

Exercice : Analyse l'arbre algébrique suivant :

Arbre algébrique
     π_{nom, prenom}
            |
   σ_{ville = 'Paris'}
            |
          Client

Se lit de bas en haut : les feuilles sont les tables, chaque nœud une opération appliquée au résultat du niveau inférieur.

  1. Décris les étapes effectuées dans cet arbre.
  2. Donne la requête SQL équivalente.
Afficher la solution

Étapes (lecture de bas en haut) :

  1. On part de la table Client.
  2. On sélectionne les clients dont la ville est 'Paris'.
  3. On projette les colonnes nom et prenom.

Requête SQL équivalente :

requete.sql
Résultat
>_ Prêt à exécuter…

Exemple simple : sélection + projection

Considérons une table Employe avec les colonnes nom, prenom et salaire.

Requête SQL

requete.sql
Résultat
>_ Prêt à exécuter…

Cette requête peut être décomposée en deux étapes algébriques :

  1. Sélection des employés avec un salaire supérieur à 2000.
  2. Projection des colonnes nom et prenom.

Expression algébrique

π_{nom, prenom}(σ_{salaire > 2000}(Employe))

Arbre algébrique

Arbre algébrique
     π_{nom, prenom}
            |
    σ_{salaire > 2000}
            |
         Employe

Se lit de bas en haut : les feuilles sont les tables, chaque nœud une opération appliquée au résultat du niveau inférieur.

L'arbre montre que la sélection est effectuée avant la projection : on filtre d'abord les employés avec un salaire supérieur à 2000, puis on extrait leurs noms et prénoms.

Exemple avec jointure et sélection

Considérons deux tables :

  • Etudiant(idEtudiant, nom, prenom, idClasse)
  • Classe(idClasse, nomClasse, annee)

Objectif : afficher le nom et prénom des étudiants inscrits en classe de "1A".

Requête SQL

requete.sql
Résultat
>_ Prêt à exécuter…

Cette requête se décompose en trois étapes algébriques :

  1. Jointure entre Etudiant et Classe sur l'attribut idClasse.
  2. Sélection des lignes où nomClasse = '1A'.
  3. Projection des colonnes nom et prenom.

Expression algébrique

π_{nom, prenom}(
  σ_{nomClasse = '1A'}(
    Etudiant ⨝_{Etudiant.idClasse = Classe.idClasse} Classe
  )
)

Arbre algébrique

Arbre algébrique
        π_{nom, prenom}
               |
      σ_{nomClasse = '1A'}
               |
⨝_{Etudiant.idClasse = Classe.idClasse}
          /          \
     Etudiant       Classe

Se lit de bas en haut : les feuilles sont les tables, chaque nœud une opération appliquée au résultat du niveau inférieur.

Cet arbre montre que la jointure est réalisée en premier, suivie d'une sélection sur le champ nomClasse, avant d'effectuer la projection des colonnes demandées.

Exercice : Représente graphiquement l'arbre algébrique correspondant à la requête suivante :

requete.sql
Résultat
>_ Prêt à exécuter…
Afficher la solution
Arbre algébrique
        π_{nom, prenom}
               |
      σ_{nomClasse = '1A'}
               |
⨝_{Etudiant.idClasse = Classe.idClasse}
          /          \
     Etudiant       Classe

Se lit de bas en haut : les feuilles sont les tables, chaque nœud une opération appliquée au résultat du niveau inférieur.

Exemple complexe : jointures multiples et condition

Considérons les tables suivantes :

  • Etudiant(idEtudiant, nom, prenom)
  • Inscription(idEtudiant, idCours)
  • Cours(idCours, intitule, idEnseignant)
  • Enseignant(idEnseignant, nomEns)

Objectif : afficher le nom et prénom des étudiants inscrits à un cours dispensé par un enseignant nommé "Durand".

Requête SQL

requete.sql
Résultat
>_ Prêt à exécuter…

Cette requête SQL peut être transformée en algèbre relationnelle en suivant les étapes suivantes :

  1. Jointure entre Cours et Enseignant
  2. Sélection des enseignants nommés "Durand"
  3. Jointure du résultat avec Inscription
  4. Jointure avec Etudiant
  5. Projection des colonnes nom et prenom

Expression algébrique

π_{nom, prenom}(
  Etudiant ⨝_{Etudiant.idEtudiant = Inscription.idEtudiant} (
    Inscription ⨝_{Inscription.idCours = Cours.idCours} (
      σ_{nomEns = 'Durand'}(
        Cours ⨝_{Cours.idEnseignant = Enseignant.idEnseignant} Enseignant
      )
    )
  )
)

Arbre algébrique

Arbre algébrique
             π_{nom, prenom}
                     |
          ⨝_{Etudiant.idEtudiant = Inscription.idEtudiant}
                 /                      \
          Etudiant           ⨝_{Inscription.idCours = Cours.idCours}
                                 /                      \
                       Inscription       σ_{nomEns = 'Durand'}
                                                 |
                                  ⨝_{Cours.idEnseignant = Enseignant.idEnseignant}
                                         /                     \
                                   Cours                 Enseignant

Se lit de bas en haut : les feuilles sont les tables, chaque nœud une opération appliquée au résultat du niveau inférieur.

Cet arbre montre un enchaînement de jointures, d'abord entre Cours et Enseignant, puis la sélection de ceux dont le nom est "Durand". On remonte ensuite en reliant les inscriptions concernées, puis les étudiants. Enfin, on projette les colonnes nom et prenom des étudiants filtrés.

Exercice : À partir des relations suivantes :

Etudiant(idEtudiant, nom, prenom)
Inscription(idEtudiant, idCours)
Cours(idCours, intitule, idEnseignant)
Enseignant(idEnseignant, nomEns)

Écris l'arbre algébrique pour afficher le nom et prénom des étudiants inscrits à un cours donné par l'enseignant Durand.

Afficher la solution
Arbre algébrique
             π_{nom, prenom}
                     |
          ⨝_{Etudiant.idEtudiant = Inscription.idEtudiant}
                 /                      \
          Etudiant           ⨝_{Inscription.idCours = Cours.idCours}
                                 /                      \
                       Inscription       σ_{nomEns = 'Durand'}
                                                 |
                                  ⨝_{Cours.idEnseignant = Enseignant.idEnseignant}
                                         /                     \
                                   Cours                 Enseignant

Se lit de bas en haut : les feuilles sont les tables, chaque nœud une opération appliquée au résultat du niveau inférieur.

Ressources complémentaires

Cours en ligne

Outils interactifs

  • DB Fiddle - Environnement pour tester des requêtes SQL et observer les résultats en temps réel. db-fiddle.com

  • SQL Easy, Query Builder - Constructeur visuel de requêtes SQL, utile pour les débutants. sql-easy.com

  • QueryViz (Université de Leipzig) - Générateur d'arbres algébriques à partir de requêtes SQL, outil académique de visualisation. QueryViz, dbs.uni-leipzig.de