Les arbres algébriques
- 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.
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ération | Notation | Description |
|---|---|---|
| Sélection | σ{condition}(R) | Filtrer des lignes selon une condition |
| Projection | π{colonnes}(R) | Extraire des colonnes spécifiques |
| Union | R ∪ S | Combiner deux relations (sans doublons) |
| Différence | R − S | Supprimer de R les lignes présentes dans S |
| Produit cartésien | R × S | Combinaison de toutes les lignes de deux relations |
| Jointure | R ⨝{condition} S | Combiner deux relations selon une condition |
| Division | R ÷ S | Trouver 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)
Relation Employe :
| id | nom | salaire |
|---|---|---|
| 1 | Alice | 1800 |
| 2 | Bernard | 2200 |
Résultat de σ_{salaire > 2000}(Employe) :
| id | nom | salaire |
|---|---|---|
| 2 | Bernard | 2200 |
Produit :| id | nom | prix |
|---|---|---|
| 1 | Clavier | 45 |
| 2 | Souris | 30 |
| 3 | Écran | 220 |
Écris une expression algébrique qui sélectionne les produits dont le prix est supérieur à 40.
σ_{prix > 40}(Produit)
Résultat :
| id | nom | prix |
|---|---|---|
| 1 | Clavier | 45 |
| 3 | Écran | 220 |
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)
Résultat de π_{nom, salaire}(Employe) :
| nom | salaire |
|---|---|
| Alice | 1800 |
| Bernard | 2200 |
Produit :| id | nom | prix |
|---|---|---|
| 1 | Clavier | 45 |
| 2 | Souris | 30 |
| 3 | Écran | 220 |
Écris une expression d'algèbre relationnelle qui ne garde que les colonnes nom et prix.
π_{nom, prix}(Produit)
Résultat :
| nom | prix |
|---|---|
| Clavier | 45 |
| Souris | 30 |
| Écran | 220 |
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
Client :
| nom |
|---|
| Alice |
| Bernard |
Prospect :
| nom |
|---|
| Claire |
| Bernard |
Résultat :
| nom |
|---|
| Alice |
| Bernard |
| Claire |
Client :
| nom |
|---|
| Alice |
| Bernard |
Prospect :
| nom |
|---|
| Bernard |
| Camille |
Écris une opération d'union pour obtenir la liste complète des noms sans doublons.
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
Résultat :
| nom |
|---|
| Alice |
Client et Prospect, écris une opération pour obtenir les clients qui ne sont pas aussi prospects.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
Employe :
| nom |
|---|
| Alice |
| Bernard |
Projet :
| code |
|---|
| P1 |
| P2 |
Résultat :
| nom | code |
|---|---|
| Alice | P1 |
| Alice | P2 |
| Bernard | P1 |
| Bernard | P2 |
Auteurs(nom) Livres(titre)
Écris une opération algébrique qui produit toutes les combinaisons possibles entre auteurs et livres.
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
Employe :
| nom | idProjet |
|---|---|
| Alice | 1 |
| Bernard | 2 |
Projet :
| idProjet | nomProjet |
|---|---|
| 1 | SI |
| 2 | IoT |
Résultat :
| nom | nomProjet |
|---|---|
| Alice | SI |
| Bernard | IoT |
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é.
π_{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
Competence.EmployeCompetence :
| employe | competence |
|---|---|
| Alice | Java |
| Alice | SQL |
| Bernard | Java |
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.
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.
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.
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'arbre | Rôle |
|---|---|
| Nœuds internes | Opérations algébriques (σ, π, ⨝, ×…) |
| Feuilles | Tables sources utilisées dans la requête |
| Arêtes | Relations entre opérations, représentant l'ordre d'évaluation |
| Ordre de lecture | L'arbre se lit de bas en haut : les opérations internes sont évaluées d'abord |
- 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.
π_{nom, prenom}
|
σ_{ville = 'Paris'}
|
Client
- Décris les étapes effectuées dans cet arbre.
- Donne la requête SQL équivalente.
Étapes (lecture de bas en haut) :
- On part de la table
Client. - On sélectionne les clients dont la ville est
'Paris'. - On projette les colonnes
nometprenom.
Requête SQL équivalente :
SELECT nom, prenom
FROM Client
WHERE ville = 'Paris';
Exemple simple : sélection + projection
Considérons une table Employe avec les colonnes nom, prenom et salaire.
SELECT nom, prenom
FROM Employe
WHERE salaire > 2000;
Cette requête peut être décomposée en deux étapes algébriques :
- Sélection des employés avec un salaire supérieur à 2000.
- Projection des colonnes
nometprenom.
π_{nom, prenom}(σ_{salaire > 2000}(Employe))
π_{nom, prenom}
|
σ_{salaire > 2000}
|
Employe
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".
SELECT nom, prenom
FROM Etudiant e
JOIN Classe c ON e.idClasse = c.idClasse
WHERE nomClasse = '1A';
Cette requête se décompose en trois étapes algébriques :
- Jointure entre
EtudiantetClassesur l'attributidClasse. - Sélection des lignes où
nomClasse = '1A'. - Projection des colonnes
nometprenom.
π_{nom, prenom}(
σ_{nomClasse = '1A'}(
Etudiant ⨝_{Etudiant.idClasse = Classe.idClasse} Classe
)
)
π_{nom, prenom}
|
σ_{nomClasse = '1A'}
|
⨝_{Etudiant.idClasse = Classe.idClasse}
/ \
Etudiant Classe
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.
SELECT nom, prenom
FROM Etudiant e
JOIN Classe c ON e.idClasse = c.idClasse
WHERE nomClasse = '1A';
π_{nom, prenom}
|
σ_{nomClasse = '1A'}
|
⨝_{Etudiant.idClasse = Classe.idClasse}
/ \
Etudiant Classe
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".
SELECT e.nom, e.prenom
FROM Etudiant e
JOIN Inscription i ON e.idEtudiant = i.idEtudiant
JOIN Cours c ON i.idCours = c.idCours
JOIN Enseignant en ON c.idEnseignant = en.idEnseignant
WHERE en.nomEns = 'Durand';
Cette requête SQL peut être transformée en algèbre relationnelle en suivant les étapes suivantes :
- Jointure entre
CoursetEnseignant - Sélection des enseignants nommés "Durand"
- Jointure du résultat avec
Inscription - Jointure avec
Etudiant - Projection des colonnes
nometprenom
π_{nom, prenom}(
Etudiant ⨝_{Etudiant.idEtudiant = Inscription.idEtudiant} (
Inscription ⨝_{Inscription.idCours = Cours.idCours} (
σ_{nomEns = 'Durand'}(
Cours ⨝_{Cours.idEnseignant = Enseignant.idEnseignant} Enseignant
)
)
)
)
π_{nom, prenom}
|
⨝_{Etudiant.idEtudiant = Inscription.idEtudiant}
/ \
Etudiant ⨝_{Inscription.idCours = Cours.idCours}
/ \
Inscription σ_{nomEns = 'Durand'}
|
⨝_{Cours.idEnseignant = Enseignant.idEnseignant}
/ \
Cours Enseignant
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.
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.
π_{nom, prenom}
|
⨝_{Etudiant.idEtudiant = Inscription.idEtudiant}
/ \
Etudiant ⨝_{Inscription.idCours = Cours.idCours}
/ \
Inscription σ_{nomEns = 'Durand'}
|
⨝_{Cours.idEnseignant = Enseignant.idEnseignant}
/ \
Cours Enseignant
Ressources complémentaires
Cours en ligne
INSA Rouen – Cours SGBD Un support complet abordant les systèmes de gestion de bases de données et l'algèbre relationnelle. Algèbre relationnelle – INSA Rouen
Université de Cergy-Pontoise – Algèbre relationnelle Présentation des concepts d'algèbre relationnelle avec exemples et exercices. Optimisation et arbres algébriques – Cergy-Pontoise
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
