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.
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 x 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 |
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 |
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 |
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 |
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 |
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.
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 <code>nom</code> de chaque étudiant avec le <code>nomClasse</code> associé.
π_{nom, nomClasse}(Etudiant ⨝_{Etudiant.idClasse = Classe.idClasse} Classe)
→ Jointure sur idClasse, puis projection des colonnes souhaitées.
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 |
EmployeCompetence(employe, competence) Competence(competence)
Écris une expression pour trouver les employés qui possèdent <strong>toutes les compétences</strong> listées dans la table <code>Competence</code>.
EmployeCompetence ÷ Competence
→ La division permet de récupérer les employés associés à toutes les lignes de la relation Competence
.
Exemple :
employe | competence |
---|---|
Alice | Java |
Alice | SQL |
Bob | Java |
competence |
---|
Java |
SQL |
→ Résultat : Alice
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.
π_{nom, prenom}
|
σ_{ville = 'Paris'}
|
Client
1. Décris les étapes effectuées dans cet arbre.
2. Donne la requête SQL équivalente.
// Étapes :
// Requête SQL : SELECT nom, prenom FROM Client WHERE ville = 'Paris';
É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 |
Tout d'abord, considerons une table Employe
avec les colonnes nom
, prenom
, et salaire
.
SELECT nom, prenom
FROM Employe
WHERE salaire > 2000;
Il faut d'abord que l'on crée les requêtes algébriques correspondantes à la requête SQL. La requête SQL ci-dessus peut être décomposée en deux étapes :
nom
et prenom
de la table Employe
.π_{nom, prenom}(σ_{salaire > 2000}(Employe))
Enfin, on peut représenter cette requête algébrique sous forme d'un arbre algébrique.
π_{nom, prenom}
|
σ_{salaire > 2000}
|
Employe
L'arbre algébrique ci-dessus montre que la sélection est effectuée avant la projection. En d'autres termes, on filtre d'abord les employés avec un salaire supérieur à 2000, puis on extrait leurs noms et prénoms.
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 peut être décomposée en trois étapes algébriques :
Etudiant
et Classe
sur l’attribut idClasse
.nomClasse = '1A'
.nom
et prenom
.π_{nom, prenom}(
σ_{nomClasse = '1A'}(
Etudiant ⨝_{Etudiant.idClasse = Classe.idClasse} Classe
)
)
On peut alors représenter cette requête sous forme d’arbre :
π_{nom, prenom}
|
σ_{nomClasse = '1A'}
|
⨝_{Etudiant.idClasse = Classe.idClasse}
/ \
Etudiant Classe
Cet arbre montre clairement 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. Cela illustre bien le principe d’exécution de bas en haut d’un arbre algébrique.
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
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 :
Cours
et Enseignant
Inscription
Etudiant
nom
et prenom
π_{nom, prenom}(
Etudiant ⨝_{Etudiant.idEtudiant = Inscription.idEtudiant} (
Inscription ⨝_{Inscription.idCours = Cours.idCours} (
σ_{nomEns = 'Durand'}(
Cours ⨝_{Cours.idEnseignant = Enseignant.idEnseignant} Enseignant
)
)
)
)
Et voici sa représentation en arbre algébrique :
π_{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 prenom des étudiants inscrits à un cours donné par l’enseignant Durand
INSA Rouen – Cours SGBD
Un support complet abordant les systèmes de gestion de bases de données et l’algèbre relationnelle.
🔗 https://moodle.insa-rouen.fr/pluginfile.php/41555/mod_resource/content/1/3-Algebre.pdf
Université de Cergy-Pontoise – Algèbre relationnelle
Présentation des concepts d’algèbre relationnelle avec exemples et exercices.
🔗 https://thema.u-cergy.fr/IMG/pdf/INSIA-SIGL_3-01-Optimisation_-_arbres_algebriques.pdf
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.
🔗 dbs.uni-leipzig.de – QueryViz