Aller au contenu principal

Atelier : algèbre relationnelle

Ce que ce chapitre apporte 4 points
  • Employer chaque opérateur fondamental isolément, puis en combinaison.
  • Choisir l'ordre d'application des opérations, et savoir lequel est imposé.
  • Lire un arbre algébrique, et le construire à partir d'un énoncé en français.
  • Réécrire un arbre en un arbre équivalent qui travaille moins, et chiffrer ce qu'il épargne.

Dix-sept exercices, du plus simple opérateur à l'arbre qu'on réécrit. Les six premiers travaillent sur de petites tables écrites dans l'énoncé, les suivants sur la base de démonstration du parcours : une école, ses cours et les notes de ses étudiants ; une agence, ses clients et les heures de ses employés. Chaque exercice fait écrire une expression d'algèbre relationnelle, au clavier ou avec une barre de symboles. « Vérifier » la calcule sur plusieurs cas, chacun une version des tables, la compare à la correction calculée sur les mêmes, et dit pour chaque cas s'il passe et sinon pourquoi. Un cas caché ne dit que s'il passe : il démasque une expression écrite pour les seules données affichées. L'atelier met en pratique le chapitre L'algèbre relationnelle et ses arbres, qui enseigne chaque opération demandée ici.

Travailler seul

Le chemin de chaque niveau
  1. Le rappel de cours, en tête de niveau, avec un exemple résolu. Le lire avant d'écrire.
  2. L'expression, écrite dans le bloc d'exercice. C'est le résultat qui se compare : une écriture juste autre que la correction, jointure naturelle, sélection placée ailleurs, colonnes dans un autre ordre, est acceptée. Un cas qui change une table la montre sous son libellé. Sous le verdict, l'arbre de l'expression se lit nœud par nœud : c'est là qu'on voit à quel étage elle dérape. Des indices s'ouvrent un par un, une correction après deux vérifications ou une réussite.
  3. Les questions qui suivent le bloc : y répondre par écrit, en une ou deux phrases, avant d'ouvrir la correction repliée.
  4. Les cadres de calcul font prévoir un nombre de lignes avant de le voir.
  5. Ce qu'il faut retenir, en fin de niveau.

Les trois niveaux se suivent, chacun supposant le précédent traité.

Trois niveaux

NiveauExercicesCe qui est travaillé
11 à 6un opérateur à la fois : σ, π, ∪, −, ∩, ρ, ×
27 à 11enchaîner plusieurs opérations, tenir compte des valeurs absentes, et poser une division
312 à 17lire un arbre, en construire un, le réécrire moins coûteux en descendant sélections et projections

Chaque opération est posée dans le chapitre L'algèbre relationnelle et ses arbres ; l'atelier les fait écrire.

Rappel des notations

OpérateurSymboleEffet
Sélectionσfiltre les lignes selon une condition
Projectionπne garde que certaines colonnes, et dédoublonne
Renommageρchange le nom d'un attribut, ou celui de la relation
Union∪réunit deux relations de même schéma, sans doublon
Intersection∩ne garde que ce qui figure des deux côtés
Différence−retire de la gauche ce que porte la droite
Produit cartésien×toutes les combinaisons de lignes
Jointure⨝produit filtré par une condition d'appariement
Division÷ce qui est lié à tous les éléments d'une autre relation
Dans quel sens lire une expression emboîtée

Une expression s'évalue de l'intérieur vers l'extérieur, comme en mathématiques.

Dans π_{nom}(σ_{ville = 'Paris'}(Client)), lire d'abord Client, puis la sélection, puis la projection. Sur l'arbre, cela revient à partir des feuilles et à remonter jusqu'à la racine.

Niveau 1, un opérateur à la fois

Ces exercices portent sur les opérateurs de base, isolément. L'objectif est la syntaxe et l'effet exact de chaque opération sur les lignes et sur les colonnes.

Rappel de cours : ce que chaque opération fait aux lignes et aux colonnes

Une sélection σ garde des lignes et toutes les colonnes. Une projection π garde des colonnes, et dédoublonne : une relation ne contient jamais deux fois la même ligne. Une union, une intersection ou une différence exige le même nombre d'attributs, appariés dans l'ordre, de domaines compatibles et de même sens. Un renommage ρ change un nom sans toucher aux lignes. Un produit × associe chaque ligne de gauche à chaque ligne de droite.

Exemple résolu. Livraison(idLivraison, ville, poids) contient (1, Lyon, 12), (2, Lyon, 12) et (3, Nantes, 5). σ_{poids > 10}(Livraison) rend 2 lignes et 3 colonnes. π_{ville, poids}(Livraison) rend 2 lignes, (Lyon, 12) et (Nantes, 5) : les deux livraisons lyonnaises se confondent une fois l'identifiant retiré. Le produit de Livraison par une table de 4 camions compte 3 × 4 = 12 lignes.

Exercice 1, sélection

Relation Produit :

idProduitnomprix
1Clavier45
2Souris30
3Ecran220
Exercice : écrire puis vérifier

Exercice 1 : les produits de plus de 40

Écrire l'expression qui garde les produits dont le prix dépasse strictement 40, avec leurs trois attributs.

Expression à écrire

Une condition ou une liste d'attributs s'écrit en indice, entre accolades, une chaîne entre apostrophes, un nombre décimal avec un point. Au clavier, et, ou, non, <>, <=, >= et le tiret de la différence conviennent aussi.

Écrire l'expression, puis « Vérifier » : elle est calculée sur 3 cas, dont 1 caché, et comparée à la correction calculée sur les mêmes tables.

Les tables du cas « sur les trois produits de l'énoncé »
Produit
idProduitnomprix
1Clavier45
2Souris30
3Ecran220

Les autres tables sont celles du cours.

Les tables du cas « un câble à 40 tout juste, une webcam à 41 »
Produit
idProduitnomprix
1Clavier45
2Souris30
3Ecran220
4Cable40
5Webcam41

Les autres tables sont celles du cours.

  1. Nommer les produits retenus, avant de cliquer sur l'arbre.
  2. Modifier l'expression pour garder ceux dont le prix ne dépasse pas 100, et dire quels produits changent de camp.
Afficher la correction

Clavier et Ecran passent ; Souris est écartée, puisque 30 n'est pas supérieur à 40. La sélection filtre les lignes et laisse le schéma intact : les trois colonnes restent.

Pour la seconde condition, seul le comparateur change.

Cliquer sur un nœud pour voir la relation qu'il produit.

σ prix ≤ 100σ prix ≤ 100ProduitProduit
σ prix ≤ 1002 lignes · 3 attributs
idProduitnomprix
1Clavier45
2Souris30
Ecran sort à son tour : 220 dépasse 100. Souris entre, et Clavier reste.

Exercice 2, projection

Toujours avec Produit.

Exercice : écrire puis vérifier

Exercice 2 : le nom et le prix

Écrire une projection de Produit qui ne garde que nom et prix.

Expression à écrire

Une condition ou une liste d'attributs s'écrit en indice, entre accolades, une chaîne entre apostrophes, un nombre décimal avec un point. Au clavier, et, ou, non, <>, <=, >= et le tiret de la différence conviennent aussi.

Écrire l'expression, puis « Vérifier » : elle est calculée sur 3 cas, dont 1 caché, et comparée à la correction calculée sur les mêmes tables.

Les tables du cas « sur les trois produits de l'énoncé »
Produit
idProduitnomprix
1Clavier45
2Souris30
3Ecran220

Les autres tables sont celles du cours.

Les tables du cas « une seconde souris, au même prix »
Produit
idProduitnomprix
1Clavier45
2Souris30
3Ecran220
4Souris30

Les autres tables sont celles du cours.

  1. Une projection peut-elle réduire le nombre de lignes ? Justifier, à l'aide du deuxième cas du bloc.
  2. Écrire une projection qui ne garde que idProduit, et dire pourquoi elle ne peut jamais fusionner deux lignes.
Afficher la correction

Oui, une projection peut réduire le nombre de lignes. Une relation est un ensemble : si la projection efface ce qui distinguait deux lignes, elles se confondent. Le deuxième cas du bloc ajoute une seconde souris au même prix.

Cliquer sur un nœud pour voir la relation qu'il produit.

π nom, prixπ nom, prixProduitProduit
π nom, prix3 lignes · 2 attributs
nomprix
Clavier45
Souris30
Ecran220
Quatre produits, trois lignes. Les deux souris à 30 sont devenues indiscernables une fois idProduit retiré.

Sur idProduit, qui est une clé, aucune fusion n'est possible.

Cliquer sur un nœud pour voir la relation qu'il produit.

π idProduitπ idProduitProduitProduit
π idProduit3 lignes · 1 attribut
idProduit
1
2
3
Une clé ne contient jamais deux fois la même valeur : les trois lignes restent trois.

Exercice 3, union

Deux relations de même schéma. Abonne(nom) contient Alice et Bernard ; Prospect(nom) contient Bernard et Camille.

Exercice : écrire puis vérifier

Exercice 3 : les abonnés et les prospects réunis

Écrire l'expression qui rassemble tous les noms présents dans Abonne ou dans Prospect.

Expression à écrire

Une condition ou une liste d'attributs s'écrit en indice, entre accolades, une chaîne entre apostrophes, un nombre décimal avec un point. Au clavier, et, ou, non, <>, <=, >= et le tiret de la différence conviennent aussi.

Écrire l'expression, puis « Vérifier » : elle est calculée sur 3 cas, dont 1 caché, et comparée à la correction calculée sur les mêmes tables.

Les tables du cas « sur les relations de l'énoncé »
Abonne
nom
Alice
Bernard
Prospect
nom
Bernard
Camille

Les autres tables sont celles du cours.

Les tables du cas « une prospecte de plus, Diane »
Abonne
nom
Alice
Bernard
Prospect
nom
Bernard
Camille
Diane

Les autres tables sont celles du cours.

  1. Donner le résultat attendu, nom par nom, et dire combien de lignes entrent et combien sortent.
  2. Dire ce qui se passe si les deux relations n'ont pas les mêmes colonnes.
Afficher la correction

Alice, Bernard et Camille : trois noms pour quatre lignes en entrée. Bernard figurait des deux côtés et n'apparaît qu'une fois.

L'union est une opération ensembliste : elle exige le même schéma, c'est-à-dire le même nombre d'attributs, appariés dans l'ordre, de domaines compatibles, et qui désignent la même chose. Sans cela, une même colonne du résultat mélangerait des valeurs de sens différents. Le moteur de ces figures refuse une union dont le nombre de colonnes diffère, ou qui apparie des nombres à du texte ; le sens lui échappe.

Cliquer sur un nœud pour voir la relation qu'il produit.

∪∪AbonneAbonneVilleVille
∪3 lignes · 1 attribut
nom
Alice
Bernard
Lyon
Le moteur accepte : une colonne de texte de chaque côté lui suffit. Le résultat range Lyon parmi les noms d'abonnés, sous l'en-tête nom.

SQL est encore moins regardant. MySQL et SQLite ne vérifient que le nombre de colonnes : ils les apparient par position, gardent les noms de la première requête, et uniraient sans un mot des identifiants à des libellés. PostgreSQL refuse au moins d'apparier un nombre et un texte. Vérifier que deux colonnes parlent de la même chose reste le travail de celui qui écrit l'union.

Exercice 4, différence

Mêmes relations.

Exercice : écrire puis vérifier

Exercice 4 : les abonnés qui ne sont pas prospects

Écrire l'expression qui garde les abonnés qui ne sont pas aussi prospects.

Expression à écrire

Une condition ou une liste d'attributs s'écrit en indice, entre accolades, une chaîne entre apostrophes, un nombre décimal avec un point. Au clavier, et, ou, non, <>, <=, >= et le tiret de la différence conviennent aussi.

Écrire l'expression, puis « Vérifier » : elle est calculée sur 3 cas, dont 1 caché, et comparée à la correction calculée sur les mêmes tables.

Les tables du cas « sur les relations de l'énoncé »
Abonne
nom
Alice
Bernard
Prospect
nom
Bernard
Camille

Les autres tables sont celles du cours.

Les tables du cas « Diane s'abonne »
Abonne
nom
Alice
Bernard
Diane
Prospect
nom
Bernard
Camille

Les autres tables sont celles du cours.

  1. Donner le résultat.
  2. La différence est-elle commutative, c'est-à-dire donne-t-elle le même résultat quand on échange les deux relations ? Justifier par un exemple.
Afficher la correction

Alice seule. Bernard est à la fois abonné et prospect, il est donc retiré.

Non, la différence n'est pas commutative. L'inverse donne un résultat entièrement différent.

Cliquer sur un nœud pour voir la relation qu'il produit.

−−ProspectProspectAbonneAbonne
−1 ligne · 1 attribut
nom
Camille
Camille seule. Mêmes données, ordre inversé, résultat sans aucune ligne commune avec le précédent.

L'union, elle, est commutative : A ∪ B et B ∪ A donnent la même relation.

Vérification rapideon peut se reprendre

1.π_{nom, prix}(Produit) peut-il rendre moins de lignes que Produit ?

2.Pourquoi une union entre Employe et Projet est-elle impossible ?

Exercice 5, intersection et renommage

Abonne(nom) contient toujours Alice et Bernard. Salarie(nomSalarie, service) contient Bernard, au service Ventes, et Diane, au service Atelier.

Exercice : écrire puis vérifier

Exercice 5 : abonnés et salariés à la fois

Écrire l'expression qui rend les noms présents à la fois parmi les abonnés (Abonne(nom)) et parmi les salariés (Salarie(nomSalarie, service)).

Expression à écrire

Une condition ou une liste d'attributs s'écrit en indice, entre accolades, une chaîne entre apostrophes, un nombre décimal avec un point. Au clavier, et, ou, non, <>, <=, >= et le tiret de la différence conviennent aussi.

Écrire l'expression, puis « Vérifier » : elle est calculée sur 3 cas, dont 1 caché, et comparée à la correction calculée sur les mêmes tables.

Les tables du cas « sur les relations de l'énoncé »
Abonne
nom
Alice
Bernard
Salarie
nomSalarieservice
BernardVentes
DianeAtelier

Les autres tables sont celles du cours.

Les tables du cas « Alice est embauchée »
Abonne
nom
Alice
Bernard
Salarie
nomSalarieservice
BernardVentes
DianeAtelier
AliceAtelier

Les autres tables sont celles du cours.

  1. Dire pourquoi Abonne ∩ Salarie ne convient pas.
  2. Dire ce que le renommage change au résultat, et ce qu'il ne change pas.
Afficher la correction

Abonne ∩ Salarie échoue : Salarie porte deux attributs, Abonne un seul, et une intersection exige autant d'attributs des deux côtés.

Cliquer sur un nœud pour voir la relation qu'il produit.

∩∩AbonneAbonneSalarieSalarie
∩

Échec attendu.opérandes non compatibles : 1 attribut(s) à gauche, 2 à droite. Une union, une intersection ou une différence exige le même nombre d'attributs, dans le même ordre.

Une colonne à gauche, deux à droite : l'intersection est refusée. Le nœud ∩ affiche le message du moteur.

Il faut d'abord ne garder que les noms des salariés, par une projection. L'intersection garde alors ce qui figure des deux côtés : Bernard seul, abonné et salarié.

Le renommage ne change aucune ligne. Il dit que les deux colonnes désignent la même chose, le nom d'une personne, et il fixe le nom de la colonne du résultat. Sans lui, Abonne ∩ π_{nomSalarie}(Salarie) rend la même ligne : le moteur de ces figures, comme SQL, apparie les colonnes par leur position et garde les noms de la relation de gauche. Écrite dans l'autre sens, π_{nomSalarie}(Salarie) ∩ Abonne appellerait la colonne nomSalarie. Certaines présentations de l'algèbre apparient au contraire les attributs par leur nom, et exigent alors ce renommage.

Exercice 6, produit cartésien

Auteur(nom) contient Camus et Duras. Livre(titre, auteur) contient La Peste et L'Étranger, de Camus, et Le Ravissement de Lol V. Stein, de Duras.

  1. Écrire le produit cartésien des deux, et dire combien de lignes il compte.
  2. Dire pourquoi ce compte ne dépend que du nombre de lignes de chaque côté, et pas de leur contenu.
Exercice : écrire puis vérifier

Exercice 6 : les paires qui ont un sens

Écrire l'expression qui part du produit Auteur × Livre et ne garde que les paires où le livre est bien de l'auteur de la ligne.

Expression à écrire

Une condition ou une liste d'attributs s'écrit en indice, entre accolades, une chaîne entre apostrophes, un nombre décimal avec un point. Au clavier, et, ou, non, <>, <=, >= et le tiret de la différence conviennent aussi.

Écrire l'expression, puis « Vérifier » : elle est calculée sur 3 cas, dont 1 caché, et comparée à la correction calculée sur les mêmes tables.

Les tables du cas « sur les relations de l'énoncé »
Auteur
nom
Camus
Duras
Livre
titreauteur
La PesteCamus
L'ÉtrangerCamus
Le Ravissement de Lol V. SteinDuras

Les autres tables sont celles du cours.

Les tables du cas « une autrice sans livre dans la table, un livre de Duras de plus »
Auteur
nom
Camus
Duras
Sagan
Livre
titreauteur
La PesteCamus
L'ÉtrangerCamus
Le Ravissement de Lol V. SteinDuras
L'AmantDuras

Les autres tables sont celles du cours.

  1. Dire quelle opération le bloc vient de faire écrire.
Afficher la correction

Cliquer sur un nœud pour voir la relation qu'il produit.

××AuteurAuteurLivreLivre
×6 lignes · 3 attributs
nomtitreauteur
CamusLa PesteCamus
CamusL'ÉtrangerCamus
CamusLe Ravissement de Lol V. SteinDuras
DurasLa PesteCamus
DurasL'ÉtrangerCamus
DurasLe Ravissement de Lol V. SteinDuras
2 × 3 = 6 lignes. Toutes les combinaisons, y compris Duras associée à La Peste.

Le produit associe tout à tout, sans se soucier de ce qui va ensemble : chaque ligne de gauche rencontre chaque ligne de droite, quel que soit son contenu. Il n'a donc aucune signification métier tel quel. En lui appliquant une sélection qui ne retient que les paires réellement liées, on obtient exactement une jointure.

R ⨝_{condition} S  =  σ_{condition}(R × S)

C'est la définition de la jointure, et la raison pour laquelle le produit cartésien mérite d'être compris malgré son inutilité apparente. Le bloc accepte d'ailleurs Auteur ⨝_{Auteur.nom = Livre.auteur} Livre, qui rend les trois mêmes lignes.

Ce qu'il faut retenir.

  • σ agit sur les lignes et laisse le schéma intact. π agit sur les colonnes, et peut réduire le nombre de lignes par dédoublonnage, puisqu'une relation est un ensemble.
  • ∪, ∩ et − exigent deux relations de même schéma : autant d'attributs, dans le même ordre, de domaines compatibles et de même sens. Seule la différence dépend de l'ordre de ses opérandes.
  • ρ change un nom sans toucher aux lignes. × associe tout à tout, et une sélection posée dessus en fait une jointure.

Niveau 2, combiner les opérateurs

Les exercices suivants enchaînent plusieurs opérations. La question devient : dans quel ordre ? Certains ordres sont imposés par la disponibilité des colonnes ; parmi ceux qui restent, tous ne coûtent pas la même chose. Un exercice s'arrête aussi sur les valeurs absentes, que des données réelles contiennent toujours.

Les données de la base

À partir d'ici, les exercices portent sur la base de démonstration du module, celle des chapitres SQL. Les résultats affichés sont donc ceux que rendraient les requêtes correspondantes, écrites avec DISTINCT. Le schéma et le contenu des tables sont rappelés ici, pour pouvoir compter avant d'ouvrir une correction.

RelationAttributsLignes
ClasseidClasse, nomClasse, annee3
EtudiantidEtudiant, nom, prenom, dateNaissance, email, ville, idClasse, actif10
EnseignantidEnseignant, nomEns, prenomEns, specialite3
CoursidCours, intitule, volumeHoraire, coefficient, idEnseignant7
InscriptionidEtudiant, idCours, note25
ClientidClient, nom, prenom, ville4
ProjetidProjet, libelle, idClient4
EmployeidEmploye, nom, prenom, salaire, date_embauche, service5
TravailleSuridEmploye, idProjet, heures7
Afficher le contenu des neuf tables

Classe

idClassenomClasseannee
11A1
21B1
32A2

Etudiant

idEtudiantnomprenomdateNaissanceemailvilleidClasseactif
1MartinLea2004-03-12lea.martin@ecole.frParis11
2DialloAmine2003-11-02amine.diallo@ecole.frLyon11
3DupondSophie2004-07-25sophie.dupond@ecole.frParis11
4DurandTom2003-05-30tom.durand@ecole.frNantes20
5LefebvreInes2004-01-18ines.lefebvre@ecole.frLyon21
6BernardYanis2002-09-08NULLParis21
7MoreauChi2004-02-14chi.moreau@ecole.frParis31
8MarchandHugo2003-08-21NULLBordeaux31
9NguyenElsa2004-11-30elsa.nguyen@ecole.frLyon31
10PetitSofia2002-12-05sofia.petit@ecole.frNantes10

Enseignant

idEnseignantnomEnsprenomEnsspecialite
1DurandClaireBases de donnees
2FerrandMarcAlgorithmique
3AubertSophieStatistiques

Cours

idCoursintitulevolumeHorairecoefficientidEnseignant
1Bases de donnees302.01
2Algorithmique241.52
3Mathematiques362.53
4Physique272.0NULL
5Informatique302.01
6Statistiques181.03
7Reseaux211.5NULL

Inscription

idEtudiantidCoursnote
1115.5
1317.0
1513.0
218.5
2314.0
2411.5
3111.0
3216.5
3319.0
379.5
42NULL
447.0
5118.0
5613.5
5712.0
636.0
6410.0
7214.5
7515.0
8112.5
86NULL
9316.0
9417.5
959.0
10210.5

Client

idClientnomprenomville
1DurandPaulParis
2LeroySarahLyon
3MoreauKarimParis
4FontaineEvaBordeaux

Projet

idProjetlibelleidClient
1Portail client1
2Refonte ERP2
3Application mobile3
4Audit reseau4

Employe

idEmployenomprenomsalairedate_embaucheservice
1GirardNadia24502019-04-01Etudes
2LemoinePaul19802021-09-15Support
3BarbierSofia31002016-01-10Etudes
4RocheTom22002022-03-07Support
5VidalLucie27502018-11-23Commerce

TravailleSur

idEmployeidProjetheures
11120
1340
2180
32200
3360
4435
5290
Rappel de cours : jointure, valeur absente, division

Une jointure est un produit suivi d'une sélection : elle apparie chaque ligne de gauche aux lignes de droite qui vérifient la condition, et écarte ce qui ne s'apparie à rien. Une comparaison avec NULL est inconnue, sa négation aussi, et une sélection ne garde que ce qui est vrai. Une division garde les candidats associés à toutes les lignes du diviseur, et retire du résultat les attributs du diviseur.

Exemple résolu. Dans un centre de formation, Inscrit(apprenti, module) contient (Ana, Soudure), (Ana, Usinage) et (Leo, Soudure) ; Exige(module) contient Soudure et Usinage. Inscrit ÷ Exige rend Ana seule : il manque Usinage à Leo. La jointure Inscrit ⨝ Exige rend les trois couples, et sa projection sur apprenti rend Ana et Leo : c'est « au moins un », pas « tous ».

Exercice 7, jointure simple

Relations Employe(idEmploye, nom, prenom, salaire, date_embauche, service) et, côté projets, TravailleSur(idEmploye, idProjet, heures) et Projet(idProjet, libelle, idClient).

  1. Écrire une expression qui associe à chaque affectation le libellé du projet concerné, et prévoir son nombre de colonnes.
  2. Expliquer pourquoi une union ne conviendrait pas ici.
Exercice : écrire puis vérifier

Exercice 7 : le nom de l'employé et le libellé du projet

Écrire l'expression qui donne, pour les affectations de TravailleSur, les couples formés du nom de l'employé (nom) et du libellé du projet (libelle), ces deux attributs seulement.

Expression à écrire

Une condition ou une liste d'attributs s'écrit en indice, entre accolades, une chaîne entre apostrophes, un nombre décimal avec un point. Au clavier, et, ou, non, <>, <=, >= et le tiret de la différence conviennent aussi.

Écrire l'expression, puis « Vérifier » : elle est calculée sur 3 cas, dont 1 caché, et comparée à la correction calculée sur les mêmes tables.

Les tables du cas « deux affectations de plus »
TravailleSur
idEmployeidProjetheures
11120
1340
2180
32200
3360
4435
5290
23100
12150

Les autres tables sont celles du cours.

Afficher la correction

Cliquer sur un nœud pour voir la relation qu'il produit.

⨝ TravailleSur.idProjet = Pro…⨝ TravailleSur.idProjet = Projet.idProjetTravailleSurTravailleSurProjetProjet
⨝ TravailleSur.idProjet = Projet.idProjet7 lignes · 6 attributs
idEmployeTravailleSur.idProjetheuresProjet.idProjetlibelleidClient
111201Portail client1
13403Application mobile3
21801Portail client1
322002Refonte ERP2
33603Application mobile3
44354Audit reseau4
52902Refonte ERP2
Chaque affectation est enrichie du libellé de son projet. Les sept lignes de TravailleSur sont conservées, chacune trouvant son projet. En SQL : SELECT * FROM TravailleSur JOIN Projet ON TravailleSur.idProjet = Projet.idProjet

Six colonnes si la condition est écrite, idProjet y figurant deux fois ; cinq avec la jointure naturelle, TravailleSur ⨝ Projet, qui ne le garde qu'une fois.

Une union n'aurait aucun sens. TravailleSur et Projet ont bien trois attributs chacun, mais ils ne désignent pas les mêmes choses, et la deuxième colonne contient un identifiant d'un côté (idProjet), un libellé de l'autre (libelle). L'algèbre refuse cette union, et le moteur de ces figures aussi. MySQL et SQLite l'exécutent pourtant sans erreur : ils ne vérifient que le nombre de colonnes, et rangeraient les libellés de projet sous l'en-tête idProjet. La jointure, elle, est faite pour rapprocher des relations de schémas différents partageant une valeur.

Pour obtenir le nom de l'employé, celui du bloc, une seconde jointure est nécessaire, puisque TravailleSur ne porte qu'un identifiant. Sept affectations donnent sept lignes ; Girard et Barbier y apparaissent deux fois, parce qu'elles travaillent sur deux projets.

Exercice 8, sélection et jointure

Objectif : le nom des employés affectés au projet Refonte ERP.

Exercice : écrire puis vérifier

Exercice 8 : les employés de la refonte de l'ERP

Écrire l'expression qui donne le nom des employés affectés au projet dont le libellé est Refonte ERP.

Expression à écrire

Une condition ou une liste d'attributs s'écrit en indice, entre accolades, une chaîne entre apostrophes, un nombre décimal avec un point. Au clavier, et, ou, non, <>, <=, >= et le tiret de la différence conviennent aussi.

Écrire l'expression, puis « Vérifier » : elle est calculée sur 3 cas, dont 1 caché, et comparée à la correction calculée sur les mêmes tables.

Les tables du cas « Girard rejoint la refonte »
TravailleSur
idEmployeidProjetheures
11120
1340
2180
32200
3360
4435
5290
1230

Les autres tables sont celles du cours.

  1. Expliquer pourquoi la sélection sur le libellé ne peut pas s'appliquer directement à TravailleSur.
  2. Comparer deux versions, l'une qui joint les trois tables puis filtre, l'autre qui filtre avant de joindre, et dire ce que la seconde gagne.
Afficher la correction

Première écriture, la plus directe : joindre les trois tables, puis filtrer.

Cliquer sur un nœud pour voir la relation qu'il produit.

π nomπ nomσ libelle = 'Refonte ERP'σ libelle = 'Refonte ERP'⨝ TravailleSur.idProjet = Pro…⨝ TravailleSur.idProjet = Projet.idProjet⨝ Employe.idEmploye = Travail…⨝ Employe.idEmploye = TravailleSur.idEmployeEmployeEmployeTravailleSurTravailleSurProjetProjet
π nom2 lignes · 1 attribut
nom
Barbier
Vidal
Version directe. La jointure du haut construit 7 lignes avant que la sélection n'en garde 2.

L'attribut libelle n'existe que dans Projet. Aucune ligne de TravailleSur ne le porte, et une sélection sur libelle n'a rien sur quoi s'appliquer tant qu'elle ne voit que cette table. L'ordre est donc imposé, mais seulement vis-à-vis de TravailleSur : la sélection doit porter sur une relation qui contient libelle, Projet lui-même ou une jointure qui l'inclut.

Rien n'oblige en revanche à joindre Projet en dernier. Filtrer Projet d'abord, puis joindre, donne le même résultat pour beaucoup moins de travail : le plus gros résultat intermédiaire passe de sept lignes à deux.

Cliquer sur un nœud pour voir la relation qu'il produit.

π nomπ nom⨝ Employe.idEmploye = Travail…⨝ Employe.idEmploye = TravailleSur.idEmployeEmployeEmploye⨝ TravailleSur.idProjet = Pro…⨝ TravailleSur.idProjet = Projet.idProjetTravailleSurTravailleSurσ libelle = 'Refonte ERP'σ libelle = 'Refonte ERP'ProjetProjet
π nom2 lignes · 1 attribut
nom
Barbier
Vidal
Version optimisée. La sélection descend sur la feuille Projet : une seule ligne à droite, et plus aucune ligne intermédiaire inutile.

C'est le principe de la poussée de sélection : la condition descend le long de l'arbre jusqu'à la feuille dont elle dépend. Le bloc accepte les deux versions, qui rendent le même résultat.

Exercice 9, les notes absentes

Objectif : séparer les inscriptions en deux groupes, celles dont la note dépasse 10 et les autres, puis vérifier que les deux groupes réunis redonnent toutes les inscriptions.

  1. Prévoir, avant d'écrire, ce que rend chaque sélection, dans le cadre suivant.

Prévoir avant d'écrire

  • 1.

    Combien de lignes rend σ_{note > 10}(Inscription) ?

  • 2.

    Combien en rend σ_{¬(note > 10)}(Inscription) ?

  • 3.

    Combien de lignes rend leur union ?

  • 4.

    Combien d'inscriptions ne sont dans aucune des deux ?

  1. Écrire l'union des deux sélections dans le bloc.
Exercice : écrire puis vérifier

Exercice 9 : les deux groupes réunis

Écrire l'union de deux sélections de Inscription : celle des inscriptions dont la note dépasse 10, et celle des inscriptions dont la note ne dépasse pas 10, écrite avec la négation ¬.

Expression à écrire

Une condition ou une liste d'attributs s'écrit en indice, entre accolades, une chaîne entre apostrophes, un nombre décimal avec un point. Au clavier, et, ou, non, <>, <=, >= et le tiret de la différence conviennent aussi.

Écrire l'expression, puis « Vérifier » : elle est calculée sur 3 cas, dont 1 caché, et comparée à la correction calculée sur les mêmes tables.

Les tables du cas « les deux notes manquantes enfin saisies »
Inscription
idEtudiantidCoursnote
1115.5
1317
1513
218.5
2314
2411.5
3111
3216.5
3319
379.5
4212
447
5118
5613.5
5712
636
6410
7214.5
7515
8112.5
869
9316
9417.5
959
10210.5

Les autres tables sont celles du cours.

  1. Expliquer pourquoi l'union ne redonne pas toutes les inscriptions, et dire comment SQL retrouverait celles qui manquent.
Afficher la correction

Quand la note vaut NULL, la comparaison note > 10 est inconnue, et sa négation l'est aussi. Une sélection ne garde que ce qui est vrai : aucune des deux ne garde ces lignes, et l'union en rend vingt-trois pour vingt-cinq inscriptions. Dès qu'un attribut peut être absent, le reste d'une sélection n'est donc pas sa négation.

L'algèbre n'a pas d'écriture pour tester l'absence. SQL en a une, IS NULL, qu'il faut ajouter à la négation pour retrouver les huit inscriptions qui ne dépassent pas 10 ou n'ont pas de note :

requete.sql
Résultat
>_ Prêt à exécuter…
À manipuler
Exécuter : 8 lignes. Retirer OR note IS NULL et relancer : 6 lignes, celles de σ_{¬(note > 10)}(Inscription) ; les deux inscriptions sans note, de l'étudiant 4 au cours 2 et de l'étudiant 8 au cours 6, ont disparu.

Exercice 10, division

EmployeCompetence(employe, competence) contient les couples Alice-Java, Alice-SQL, Alice-Réseau, Paul-Java, Paul-SQL et Chi-Java. Competence(competence) contient Java et SQL.

Exercice : écrire puis vérifier

Exercice 10 : les employés qui ont toutes les compétences

Écrire l'expression qui donne les employés (employe) possédant toutes les compétences listées dans Competence.

Expression à écrire

Une condition ou une liste d'attributs s'écrit en indice, entre accolades, une chaîne entre apostrophes, un nombre décimal avec un point. Au clavier, et, ou, non, <>, <=, >= et le tiret de la différence conviennent aussi.

Écrire l'expression, puis « Vérifier » : elle est calculée sur 3 cas, dont 1 caché, et comparée à la correction calculée sur les mêmes tables.

Les tables du cas « sur les relations de l'énoncé »
EmployeCompetence
employecompetence
AliceJava
AliceSQL
AliceRéseau
PaulJava
PaulSQL
ChiJava
Competence
competence
Java
SQL

Les autres tables sont celles du cours.

Les tables du cas « Chi apprend SQL »
EmployeCompetence
employecompetence
AliceJava
AliceSQL
AliceRéseau
PaulJava
PaulSQL
ChiJava
ChiSQL
Competence
competence
Java
SQL

Les autres tables sont celles du cours.

  1. Dire ce que cette opération résume, et pourquoi une jointure seule ne suffit pas.
  2. Expliquer pourquoi Chi est exclue, et pourquoi Alice ne l'est pas malgré sa compétence supplémentaire.
Afficher la correction

Alice et Paul possèdent Java et SQL. Chi n'a que Java, elle est exclue. Qu'Alice ait aussi Réseau ne change rien.

La division exprime une quantification universelle : « pour tout élément du diviseur, il existe une association dans le dividende ». Une jointure seule répondrait à « au moins un », ce qui est une question différente : elle garderait Chi.

Cliquer sur un nœud pour voir la relation qu'il produit.

π employeπ employe⨝ naturelle⨝ naturelleEmployeCompetenceEmployeCompetenceCompetenceCompetence
π employe3 lignes · 1 attribut
employe
Alice
Paul
Chi
La jointure seule : Alice, Paul et Chi, les employés qui ont au moins une compétence de la liste.

Sans le symbole ÷, il faudrait deux différences, comme le montre le chapitre L'algèbre relationnelle et ses arbres : fabriquer tous les couples employé-compétence attendus, retirer ceux qui existent, et écarter les employés à qui il en manque un. La division résume ce détour en un symbole.

SQL n'a pas de mot-clé pour la division. On la traduit par une double négation : les employés pour lesquels il n'existe pas de compétence de la liste qu'ils ne possèdent pas.

Chi est exclue parce qu'il existe une compétence de la liste, SQL, qu'elle ne possède pas. Une seule manquante suffit.

Exercice 11, jointure et division

Objectif : le nom et le prénom des étudiants inscrits à tous les cours de coefficient 1,5.

Exercice : écrire puis vérifier

Exercice 11 : inscrits à tous les cours de coefficient 1,5

Écrire l'expression qui donne le nom et le prénom (nom, prenom) des étudiants inscrits à tous les cours de coefficient 1,5. Un nombre décimal s'écrit avec un point : 1.5.

Expression à écrire

Une condition ou une liste d'attributs s'écrit en indice, entre accolades, une chaîne entre apostrophes, un nombre décimal avec un point. Au clavier, et, ou, non, <>, <=, >= et le tiret de la différence conviennent aussi.

Écrire l'expression, puis « Vérifier » : elle est calculée sur 3 cas, dont 1 caché, et comparée à la correction calculée sur les mêmes tables.

Les tables du cas « Ines Lefebvre s'inscrit en algorithmique »
Inscription
idEtudiantidCoursnote
1115.5
1317
1513
218.5
2314
2411.5
3111
3216.5
3319
379.5
42NULL
447
5118
5613.5
5712
636
6410
7214.5
7515
8112.5
86NULL
9316
9417.5
959
10210.5
5212

Les autres tables sont celles du cours.

  1. Dire pourquoi une jointure seule ne suffit pas.
  2. Expliquer pourquoi une projection doit précéder la division.
Afficher la correction

Première étape, identifier les cours concernés, puis diviser.

Cliquer sur un nœud pour voir la relation qu'il produit.

÷÷π idEtudiant, idCoursπ idEtudiant, idCoursInscriptionInscriptionπ idCoursπ idCoursσ coefficient = 1.5σ coefficient = 1.5CoursCours
÷1 ligne · 1 attribut
idEtudiant
3
Deux cours ont le coefficient 1,5. Un seul étudiant est inscrit aux deux.

Seconde étape, récupérer le nom et le prénom par une jointure sur l'identifiant obtenu : le résultat de la division est une relation comme les autres, et Dupond Sophie en sort.

Une jointure seule ne suffit pas, parce que la question porte sur tous les cours. Elle rendrait les étudiants inscrits à au moins un de ces cours, ce qui est une réponse différente et plus large.

La projection avant la division n'est pas décorative

Inscription porte trois attributs : idEtudiant, idCours et note. Écrire directement Inscription ÷ π_{idCours}(σ_{coefficient = 1.5}(Cours)) ferait entrer note dans le calcul : le résultat serait fait de couples (idEtudiant, note) associés aux deux cours, autrement dit d'étudiants ayant obtenu exactement la même note dans les deux. Dupond, inscrite aux deux, a 16,5 dans l'un et 9,5 dans l'autre : elle disparaît, et le résultat est vide.

La projection sur les deux seuls attributs utiles évite cette confusion. C'est la règle générale : avant une division, réduire le dividende aux attributs concernés.

Cliquer sur un nœud pour voir la relation qu'il produit.

÷÷InscriptionInscriptionπ idCoursπ idCoursσ coefficient = 1.5σ coefficient = 1.5CoursCours
÷0 ligne · 2 attributs

Relation vide : aucune ligne ne satisfait cette opération. Les attributs sont pourtant définis (idEtudiant, note), ce qui n'est pas la même chose qu'une erreur.

Sans la projection, le résultat est vide. Ses attributs sont idEtudiant et note, et aucun couple (étudiant, note) n'est associé aux deux cours.
Vérification rapideon peut se reprendre

1.Dans π_{idEmploye}(σ_{libelle = 'Refonte ERP'}(TravailleSur ⨝ Projet)), la sélection peut-elle descendre sous la jointure ?

2.Avant une division, pourquoi projeter le dividende ?

Ce qu'il faut retenir.

  • ⨝ rapproche deux schémas différents sur une valeur partagée, et écarte au passage ce qui ne s'apparie pas : c'est un filtre autant qu'un assemblage.
  • Une sélection ne garde que les lignes où la condition est vraie. Une comparaison avec NULL est inconnue, sa négation aussi : le reste d'une sélection n'est pas sa négation.
  • ÷ traduit un « pour tous ». Réduire d'abord le dividende aux seuls attributs concernés, sans quoi la question posée change en silence.

Niveau 3, les arbres

Un arbre algébrique est le dessin d'une expression. La racine porte l'opération finale, les feuilles sont les tables, les nœuds internes les opérations intermédiaires. Il se lit de bas en haut.

Rappel de cours : réécrire un arbre

Deux arbres équivalents rendent le même résultat, et leur coût se lit au plus gros résultat intermédiaire, les feuilles mises à part. Les réécritures qui le réduisent : découper une conjonction, σ_{a ∧ b}(R) = σ_{a}(σ_{b}(R)), et descendre chaque morceau vers la feuille qui porte ses attributs ; laisser entière, au-dessus de la jointure, une disjonction qui mélange deux tables ; descendre les projections, en gardant les attributs dont les opérations du dessus ont besoin.

Exemple résolu. Dans π_{nom}(σ_{ville = 'Lyon' ∧ nomClasse = '1A'}(Etudiant ⨝_{Etudiant.idClasse = Classe.idClasse} Classe)), la condition se découpe : ville = 'Lyon' descend sur Etudiant, nomClasse = '1A' sur Classe. La jointure ne voit plus que 3 lignes à gauche et 1 à droite, au lieu de 10 et 3, et rend la même ligne, Diallo.

Exercice 12, lecture d'un arbre

Cliquer sur un nœud pour voir la relation qu'il produit.

π nom, prenomπ nom, prenomσ ville = 'Paris'σ ville = 'Paris'ClientClient
π nom, prenom2 lignes · 2 attributs
nomprenom
DurandPaul
MoreauKarim
Que fait cet arbre ? Cliquer sur les nœuds de bas en haut.
  1. Décrire étape par étape ce que fait cet arbre.
  2. Dire ce qui se passe si la projection et la sélection sont inversées.
Exercice : écrire puis vérifier

Exercice 12 : projeter d'abord, sans rien perdre

Écrire une expression qui rend, comme l'arbre donné, le nom et le prénom des clients parisiens, mais dont la première opération appliquée à Client est une projection.

La vérification juge le résultat, pas l'ordre des opérations : l'ordre demandé se contrôle sur l'arbre, qui se dessine sous le verdict.

Expression à écrire

Une condition ou une liste d'attributs s'écrit en indice, entre accolades, une chaîne entre apostrophes, un nombre décimal avec un point. Au clavier, et, ou, non, <>, <=, >= et le tiret de la différence conviennent aussi.

Écrire l'expression, puis « Vérifier » : elle est calculée sur 3 cas, dont 1 caché, et comparée à la correction calculée sur les mêmes tables.

Les tables du cas « un client parisien de plus »
Client
idClientnomprenomville
1DurandPaulParis
2LeroySarahLyon
3MoreauKarimParis
4FontaineEvaBordeaux
5PerrinMarcParis

Les autres tables sont celles du cours.

  1. Conclure sur l'interchangeabilité des deux opérations.
Afficher la correction

De bas en haut : partir de Client (quatre lignes), ne garder que les clients parisiens (deux lignes), puis n'afficher que le nom et le prénom.

Inversées, l'expression devient σ_{ville = 'Paris'}(π_{nom, prenom}(Client)). Après la projection, la colonne ville a disparu : la sélection n'a plus rien sur quoi porter.

Cliquer sur un nœud pour voir la relation qu'il produit.

σ ville = 'Paris'σ ville = 'Paris'π nom, prenomπ nom, prenomClientClient
σ ville = 'Paris'

Échec attendu.attribut inconnu : ville. Disponibles : nom, prenom

L'arbre s'analyse, mais le nœud de sélection échoue : ville n'existe plus à ce niveau. Cliquer dessus pour lire le message.

Les deux opérations ne sont donc pas librement interchangeables. Une projection ne peut descendre sous une sélection que si elle conserve les attributs dont cette sélection a besoin : c'est ce que fait l'expression du bloc, qui garde ville dans la première projection. En pratique, on descend les projections en gardant les colonnes utilisées plus haut, quitte à les projeter une seconde fois à la racine.

Vérification rapideon peut se reprendre

σ_{ville = 'Paris'}(π_{nom, prenom}(Client)) échoue. Pourquoi ?

Exercice 13, construire un arbre simple

Objectif : le nom et le prénom des clients ayant au moins un projet.

Exercice : écrire puis vérifier

Exercice 13 : les clients qui ont au moins un projet

Écrire l'expression qui donne le nom et le prénom des clients ayant au moins un projet.

Expression à écrire

Une condition ou une liste d'attributs s'écrit en indice, entre accolades, une chaîne entre apostrophes, un nombre décimal avec un point. Au clavier, et, ou, non, <>, <=, >= et le tiret de la différence conviennent aussi.

Écrire l'expression, puis « Vérifier » : elle est calculée sur 3 cas, dont 1 caché, et comparée à la correction calculée sur les mêmes tables.

Les tables du cas « avec un cinquième client, qui n'a pas encore de projet »
Client
idClientnomprenomville
1DurandPaulParis
2LeroySarahLyon
3MoreauKarimParis
4FontaineEvaBordeaux
5PerrinMarcNantes

Les autres tables sont celles du cours.

  1. Décrire l'arbre correspondant.
  2. Nommer l'opération centrale et dire pourquoi elle est nécessaire.
Afficher la correction

Deux feuilles, Client et Projet, reliées par une jointure sur idClient, surmontée d'une projection sur nom, prenom.

L'opération centrale est la jointure. Sans elle, l'information reste séparée : Projet ne contient pas le nom du client, Client ne contient pas la liste de ses projets. Seul l'identifiant partagé permet de les rapprocher.

Noter que la jointure fait ici un travail de filtre en plus de son travail d'appariement. Sur les tables du cours, les quatre clients ont un projet, et le filtre ne se voit pas. Avec un cinquième client sans projet, il se voit :

Cliquer sur un nœud pour voir la relation qu'il produit.

π nom, prenomπ nom, prenom⨝ Client.idClient = Projet.id…⨝ Client.idClient = Projet.idClientClientClientProjetProjet
π nom, prenom4 lignes · 2 attributs
nomprenom
DurandPaul
LeroySarah
MoreauKarim
FontaineEva
Avec un cinquième client, Perrin, qui n'a pas encore de projet. La feuille Client compte cinq lignes, le résultat quatre : la jointure a filtré.

Un client sans aucun projet ne figure pas dans le résultat, aucune ligne de Projet ne lui correspondant. Ce filtrage par existence, suivi d'une projection sur les seuls attributs de Client, porte un nom : la semi-jointure.

Exercice 14, sélection et jointures multiples

Objectif : le nom des étudiants inscrits au cours Mathematiques.

Exercice : écrire puis vérifier

Exercice 14 : les inscrits en mathématiques

Écrire l'expression qui donne le nom des étudiants inscrits au cours dont l'intitulé est Mathematiques.

Expression à écrire

Une condition ou une liste d'attributs s'écrit en indice, entre accolades, une chaîne entre apostrophes, un nombre décimal avec un point. Au clavier, et, ou, non, <>, <=, >= et le tiret de la différence conviennent aussi.

Écrire l'expression, puis « Vérifier » : elle est calculée sur 3 cas, dont 1 caché, et comparée à la correction calculée sur les mêmes tables.

Les tables du cas « Sofia Petit s'inscrit en mathématiques »
Inscription
idEtudiantidCoursnote
1115.5
1317
1513
218.5
2314
2411.5
3111
3216.5
3319
379.5
42NULL
447
5118
5613.5
5712
636
6410
7214.5
7515
8112.5
86NULL
9316
9417.5
959
10210.5
10312

Les autres tables sont celles du cours.

  1. Décrire l'arbre non optimisé, qui joint les trois tables avant de filtrer.
  2. Proposer une version optimisée, et chiffrer le gain dans le cadre suivant.

Le gain sur une vraie base

  • 1.

    Une école a 1 000 cours et 100 000 inscriptions, réparties également. Combien de lignes la jointure avec Cours construit-elle dans la version non optimisée, avant la sélection sur l'intitulé ?

  • 2.

    Dans la version optimisée, Cours ne garde qu'une ligne avant la jointure. Combien de lignes cette jointure construit-elle ?

  • 3.

    Combien de fois le plus gros résultat intermédiaire est-il plus petit ?

Afficher la correction

Version non optimisée : joindre les trois tables, puis filtrer sur l'intitulé.

Cliquer sur un nœud pour voir la relation qu'il produit.

π nomπ nomσ intitule = 'Mathematiques'σ intitule = 'Mathematiques'⨝ Inscription.idCours = Cours…⨝ Inscription.idCours = Cours.idCours⨝ Etudiant.idEtudiant = Inscr…⨝ Etudiant.idEtudiant = Inscription.idEtudiantEtudiantEtudiantInscriptionInscriptionCoursCours
π nom5 lignes · 1 attribut
nom
Martin
Diallo
Dupond
Bernard
Nguyen
Version non optimisée. La jointure du haut construit 25 lignes, dont la sélection n'en garde que 5.

Version optimisée : filtrer Cours avant de joindre. La sélection descend jusqu'à la feuille dont elle dépend.

Cliquer sur un nœud pour voir la relation qu'il produit.

π nomπ nom⨝ Etudiant.idEtudiant = Inscr…⨝ Etudiant.idEtudiant = Inscription.idEtudiantEtudiantEtudiant⨝ Inscription.idCours = Cours…⨝ Inscription.idCours = Cours.idCoursInscriptionInscriptionσ intitule = 'Mathematiques'σ intitule = 'Mathematiques'CoursCours
π nom5 lignes · 1 attribut
nom
Martin
Diallo
Dupond
Bernard
Nguyen
Version optimisée. Cours est réduit à une ligne avant la jointure, qui n'en produit plus que 5 au lieu de 25.
À manipuler
Cliquer, dans chaque version, sur la jointure entre Inscription et Cours : 25 lignes et 16 attributs dans la première, où Etudiant est déjà joint ; 5 lignes et 8 attributs dans la seconde. Cliquer enfin sur le nœud σ de la seconde : une ligne, Mathematiques.

Le résultat est identique. Le plus gros résultat intermédiaire passe de 25 à 5 lignes, et l'écart croît avec la taille de la base, comme le cadre de calcul le chiffre.

Exercice 15, lire et transformer

Cliquer sur un nœud pour voir la relation qu'il produit.

π nomπ nomσ nomClasse = '2A'σ nomClasse = '2A'⨝ Etudiant.idClasse = Classe…⨝ Etudiant.idClasse = Classe.idClasseEtudiantEtudiantClasseClasse
π nom3 lignes · 1 attribut
nom
Moreau
Marchand
Nguyen
L'arbre de départ.
  1. Nommer les nœuds internes et les feuilles.
  2. Dire ce qu'il faudrait changer pour afficher aussi le prénom.
Exercice : écrire puis vérifier

Exercice 15 : filtrer sur le prénom

Transformer l'arbre de départ pour qu'il donne le nom et la classe (nom, nomClasse) des étudiants prénommés Chi, la sélection posée sur la feuille dont elle dépend.

Expression à écrire

Une condition ou une liste d'attributs s'écrit en indice, entre accolades, une chaîne entre apostrophes, un nombre décimal avec un point. Au clavier, et, ou, non, <>, <=, >= et le tiret de la différence conviennent aussi.

Écrire l'expression, puis « Vérifier » : elle est calculée sur 3 cas, dont 1 caché, et comparée à la correction calculée sur les mêmes tables.

Les tables du cas « une seconde Chi, en 1B »
Etudiant
idEtudiantnomprenomdateNaissanceemailvilleidClasseactif
1MartinLea2004-03-12lea.martin@ecole.frParis11
2DialloAmine2003-11-02amine.diallo@ecole.frLyon11
3DupondSophie2004-07-25sophie.dupond@ecole.frParis11
4DurandTom2003-05-30tom.durand@ecole.frNantes20
5LefebvreInes2004-01-18ines.lefebvre@ecole.frLyon21
6BernardYanis2002-09-08NULLParis21
7MoreauChi2004-02-14chi.moreau@ecole.frParis31
8MarchandHugo2003-08-21NULLBordeaux31
9NguyenElsa2004-11-30elsa.nguyen@ecole.frLyon31
10PetitSofia2002-12-05sofia.petit@ecole.frNantes10
11TranChi2004-09-17chi.tran@ecole.frLyon21

Les autres tables sont celles du cours.

Afficher la correction

Les feuilles sont Etudiant et Classe. Les nœuds internes sont la jointure et la sélection. La racine est la projection π_{nom}.

Pour afficher aussi le prénom, seule la projection change. prenom appartient déjà à Etudiant, qui figure dans l'arbre : rien d'autre à toucher.

Cliquer sur un nœud pour voir la relation qu'il produit.

π nom, prenomπ nom, prenomσ nomClasse = '2A'σ nomClasse = '2A'⨝ Etudiant.idClasse = Classe…⨝ Etudiant.idClasse = Classe.idClasseEtudiantEtudiantClasseClasse
π nom, prenom3 lignes · 2 attributs
nomprenom
MoreauChi
MarchandHugo
NguyenElsa
Un seul nœud modifié, la racine : trois lignes, deux colonnes.

Pour filtrer sur le prénom, la situation est meilleure qu'il n'y paraît. prenom appartient à Etudiant, donc la sélection n'a pas besoin d'attendre la jointure : elle peut descendre directement sur la feuille, et la jointure ne voit plus qu'une ligne à gauche au lieu de dix.

La projection garde nomClasse, pour voir la classe de Chi. Sans lui, Classe n'apporterait plus aucun attribut au résultat ni à une condition, et la jointure pourrait disparaître : π_{nom}(σ_{prenom = 'Chi'}(Etudiant)) rendrait le seul nom.

C'est la différence entre les deux cas. nomClasse vient de Classe, donc une sélection dessus doit se placer au-dessus de la jointure ou sur la feuille Classe. prenom vient de Etudiant : sa sélection descend de l'autre côté.

Descendre une sélection n'est pas toujours permis, et le raisonnement suivant le fait à tort. Une de ses étapes ne tient pas.

Une sélection descendue à tort

Une seule étape est fausse. Désigner laquelle.

Le bureau des stages veut le nom des étudiants de la classe 1A, et aussi celui de tous les étudiants lyonnais, quelle que soit leur classe. La première écriture est π_{nom}(σ_{nomClasse = '1A' ∨ ville = 'Lyon'}(Etudiant ⨝_{Etudiant.idClasse = Classe.idClasse} Classe)), et il s'agit de la rendre moins coûteuse.

La réécriture qui tient, quand une disjonction mélange deux tables, sépare la question en deux, une par comparaison, et réunit les réponses.

Cliquer sur un nœud pour voir la relation qu'il produit.

∪∪π nomπ nomσ nomClasse = '1A'σ nomClasse = '1A'⨝ Etudiant.idClasse = Classe…⨝ Etudiant.idClasse = Classe.idClasseEtudiantEtudiantClasseClasseπ nomπ nom⨝ Etudiant.idClasse = Classe…⨝ Etudiant.idClasse = Classe.idClasseσ ville = 'Lyon'σ ville = 'Lyon'EtudiantEtudiantClasseClasse
∪6 lignes · 1 attribut
nom
Martin
Diallo
Dupond
Petit
Lefebvre
Nguyen
L'union de deux arbres : les quatre noms de la 1A d'un côté, les trois Lyonnais de l'autre, la sélection descendue sur Etudiant. Diallo figure des deux côtés et n'apparaît qu'une fois : six noms.

Exercice 16, d'un besoin à un arbre

Objectif : le nom des employés du service Etudes ayant travaillé plus de 100 heures sur un projet.

  1. Lister les opérations nécessaires, dans l'ordre logique.
Exercice : écrire puis vérifier

Exercice 16 : les employés des études, plus de 100 heures

Écrire l'expression qui donne le nom des employés du service Etudes ayant travaillé plus de 100 heures sur un même projet, chaque sélection posée sur sa feuille.

Expression à écrire

Une condition ou une liste d'attributs s'écrit en indice, entre accolades, une chaîne entre apostrophes, un nombre décimal avec un point. Au clavier, et, ou, non, <>, <=, >= et le tiret de la différence conviennent aussi.

Écrire l'expression, puis « Vérifier » : elle est calculée sur 3 cas, dont 1 caché, et comparée à la correction calculée sur les mêmes tables.

Les tables du cas « Barbier passe à 90 heures sur l'ERP, Lemoine à 180 sur le portail »
TravailleSur
idEmployeidProjetheures
11120
1340
21180
3290
3360
31100
4435
5290

Les autres tables sont celles du cours.

  1. Décrire l'arbre obtenu, puis compter le travail de la jointure dans le cadre suivant.

Les paires que la jointure examine

  • 1.

    Une jointure qui compare chaque ligne de gauche à chaque ligne de droite examine combien de paires dans la version naïve, sur Employe et TravailleSur entiers ?

  • 2.

    Et dans la version où les deux sélections sont descendues ?

Afficher la correction

Les opérations, dans l'ordre :

  1. filtrer les employés du service Etudes, sur la feuille Employe ;
  2. filtrer les affectations de plus de 100 heures, sur la feuille TravailleSur ;
  3. joindre les deux résultats sur idEmploye ;
  4. projeter le nom.

La condition de départ, service = 'Etudes' ∧ heures > 100, mélange deux tables, mais c'est une conjonction : elle se découpe en deux sélections successives, et chacune ne porte plus que sur une feuille. Les deux descendent. Une disjonction, service = 'Etudes' ∨ heures > 100, ne se découperait pas, et resterait au-dessus de la jointure.

Cliquer sur un nœud pour voir la relation qu'il produit.

π nomπ nom⨝ Employe.idEmploye = Travail…⨝ Employe.idEmploye = TravailleSur.idEmployeσ service = 'Etudes'σ service = 'Etudes'EmployeEmployeσ heures > 100σ heures > 100TravailleSurTravailleSur
π nom2 lignes · 1 attribut
nom
Girard
Barbier
Deux sélections sur les deux feuilles, une jointure qui ne voit plus que 2 lignes à gauche et 2 à droite, une projection à la racine.

Pour mesurer le gain, la même question écrite sans réfléchir à l'ordre :

Cliquer sur un nœud pour voir la relation qu'il produit.

π nomπ nomσ service = 'Etudes' ∧ heures…σ service = 'Etudes' ∧ heures > 100⨝ Employe.idEmploye = Travail…⨝ Employe.idEmploye = TravailleSur.idEmployeEmployeEmployeTravailleSurTravailleSur
π nom2 lignes · 1 attribut
nom
Girard
Barbier
Même résultat, mais la jointure construit d'abord les 7 affectations avant qu'on en jette 5.

Les deux arbres rendent les deux mêmes lignes, Girard et Barbier. Le premier fait travailler la jointure sur deux lignes de chaque côté, le second sur cinq et sept. Sur une base réelle, ce rapport est celui de la sélectivité des deux filtres, et il se compte souvent en ordres de grandeur.

Exercice 17, descendre les projections

Objectif : le nom des employés et le libellé des projets sur lesquels ils ont passé plus de 50 heures.

  1. Écrire d'abord l'expression directe, jointures puis sélection puis projection, et la vérifier dans le bloc.
  2. Descendre la sélection, puis des projections sous les jointures, en gardant à chaque étage les attributs dont les opérations supérieures ont besoin.
Exercice : écrire puis vérifier

Exercice 17 : les projections descendues

Écrire l'expression qui donne le nom des employés et le libellé des projets sur lesquels ils ont passé plus de 50 heures, la sélection descendue, et une projection posée sur chaque feuille pour n'y garder que les attributs utiles plus haut.

La vérification juge le résultat : la place des projections se contrôle sur l'arbre dessiné sous le verdict, nœud par nœud, au nombre d'attributs.

Expression à écrire

Une condition ou une liste d'attributs s'écrit en indice, entre accolades, une chaîne entre apostrophes, un nombre décimal avec un point. Au clavier, et, ou, non, <>, <=, >= et le tiret de la différence conviennent aussi.

Écrire l'expression, puis « Vérifier » : elle est calculée sur 3 cas, dont 1 caché, et comparée à la correction calculée sur les mêmes tables.

Les tables du cas « Roche passe à 55 heures sur l'audit »
TravailleSur
idEmployeidProjetheures
11120
1340
2180
32200
3360
4455
5290

Les autres tables sont celles du cours.

  1. Dire ce qui se passe si la projection sur TravailleSur retire heures avant la sélection.
Afficher la correction

Cliquer sur un nœud pour voir la relation qu'il produit.

π nom, libelleπ nom, libelleσ heures > 50σ heures > 50⨝ TravailleSur.idProjet = Pro…⨝ TravailleSur.idProjet = Projet.idProjet⨝ Employe.idEmploye = Travail…⨝ Employe.idEmploye = TravailleSur.idEmployeEmployeEmployeTravailleSurTravailleSurProjetProjet
π nom, libelle5 lignes · 2 attributs
nomlibelle
GirardPortail client
LemoinePortail client
BarbierRefonte ERP
BarbierApplication mobile
VidalRefonte ERP
Version directe. La jointure du haut transporte 7 lignes de 12 attributs, dont il ne restera que 2 colonnes.

Cliquer sur un nœud pour voir la relation qu'il produit.

π nom, libelleπ nom, libelle⨝ Employe.idEmploye = Travail…⨝ Employe.idEmploye = TravailleSur.idEmployeπ idEmploye, nomπ idEmploye, nomEmployeEmploye⨝ TravailleSur.idProjet = Pro…⨝ TravailleSur.idProjet = Projet.idProjetπ idEmploye, idProjetπ idEmploye, idProjetσ heures > 50σ heures > 50TravailleSurTravailleSurπ idProjet, libelleπ idProjet, libelleProjetProjet
π nom, libelle5 lignes · 2 attributs
nomlibelle
GirardPortail client
LemoinePortail client
BarbierRefonte ERP
BarbierApplication mobile
VidalRefonte ERP
Projections descendues. Chaque feuille ne garde que ce qui sert plus haut : la jointure du haut ne porte plus que 6 attributs, sur 5 lignes.

La sélection doit passer avant la projection de TravailleSur, qui retire heures : dans l'autre ordre, elle ne trouve plus l'attribut.

Cliquer sur un nœud pour voir la relation qu'il produit.

σ heures > 50σ heures > 50π idEmploye, idProjetπ idEmploye, idProjetTravailleSurTravailleSur
σ heures > 50

Échec attendu.attribut inconnu : heures. Disponibles : idEmploye, idProjet

La projection a retiré heures : la sélection échoue. Cliquer sur le nœud σ pour lire le message.
Vérification rapideon peut se reprendre

1.Dans l'arbre aux projections descendues, la jointure du haut porte 6 attributs au lieu de 12. Qu'a-t-on gagné ?

2.Une jointure entre Client et Projet écarte-t-elle un client sans projet ?

3.Deux arbres donnent le même résultat. Le plus gros résultat intermédiaire du premier compte 25 lignes, celui du second 5. Que conclure ?

Ce qu'il faut retenir.

  • Un arbre se lit de bas en haut : les feuilles sont les tables, les nœuds internes les opérations, la racine le résultat rendu.
  • Deux arbres équivalents se comparent au nombre de lignes de leur plus gros résultat intermédiaire, jamais à leur résultat, qui est le même par construction.
  • Une conjonction se découpe, et chaque morceau descend vers sa feuille ; une disjonction qui mélange deux tables reste entière au-dessus de leur jointure.
  • Une projection descend tant qu'elle garde les attributs dont les opérations du dessus ont besoin. Elle allège les lignes sans en retirer.

Chapitre révisé en octobre 2026 · Une erreur dans ce chapitre ?