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 rappel de cours, en tête de niveau, avec un exemple résolu. Le lire avant d'écrire.
- 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.
- Les questions qui suivent le bloc : y répondre par écrit, en une ou deux phrases, avant d'ouvrir la correction repliée.
- Les cadres de calcul font prévoir un nombre de lignes avant de le voir.
- Ce qu'il faut retenir, en fin de niveau.
Les trois niveaux se suivent, chacun supposant le précédent traité.
Trois niveaux
| Niveau | Exercices | Ce qui est travaillé |
|---|---|---|
| 1 | 1 à 6 | un opérateur à la fois : σ, π, ∪, −, ∩, ρ, × |
| 2 | 7 à 11 | enchaîner plusieurs opérations, tenir compte des valeurs absentes, et poser une division |
| 3 | 12 à 17 | lire 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érateur | Symbole | Effet |
|---|---|---|
| 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 |
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.
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 :
| idProduit | nom | prix |
|---|---|---|
| 1 | Clavier | 45 |
| 2 | Souris | 30 |
| 3 | Ecran | 220 |
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.
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é »
| idProduit | nom | prix |
|---|---|---|
| 1 | Clavier | 45 |
| 2 | Souris | 30 |
| 3 | Ecran | 220 |
Les autres tables sont celles du cours.
Les tables du cas « un câble à 40 tout juste, une webcam à 41 »
| idProduit | nom | prix |
|---|---|---|
| 1 | Clavier | 45 |
| 2 | Souris | 30 |
| 3 | Ecran | 220 |
| 4 | Cable | 40 |
| 5 | Webcam | 41 |
Les autres tables sont celles du cours.
- Nommer les produits retenus, avant de cliquer sur l'arbre.
- 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.
| idProduit | nom | prix |
|---|---|---|
| 1 | Clavier | 45 |
| 2 | Souris | 30 |
Exercice 2, projection
Toujours avec Produit.
Exercice 2 : le nom et le prix
Écrire une projection de Produit qui ne garde que nom et prix.
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é »
| idProduit | nom | prix |
|---|---|---|
| 1 | Clavier | 45 |
| 2 | Souris | 30 |
| 3 | Ecran | 220 |
Les autres tables sont celles du cours.
Les tables du cas « une seconde souris, au même prix »
| idProduit | nom | prix |
|---|---|---|
| 1 | Clavier | 45 |
| 2 | Souris | 30 |
| 3 | Ecran | 220 |
| 4 | Souris | 30 |
Les autres tables sont celles du cours.
- Une projection peut-elle réduire le nombre de lignes ? Justifier, à l'aide du deuxième cas du bloc.
- É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 |
|---|---|
| Clavier | 45 |
| Souris | 30 |
| Ecran | 220 |
Sur idProduit, qui est une clé, aucune fusion n'est possible.
Cliquer sur un nœud pour voir la relation qu'il produit.
| idProduit |
|---|
| 1 |
| 2 |
| 3 |
Exercice 3, union
Deux relations de même schéma. Abonne(nom) contient Alice et Bernard ; Prospect(nom) contient Bernard et Camille.
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.
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é »
| nom |
|---|
| Alice |
| Bernard |
| nom |
|---|
| Bernard |
| Camille |
Les autres tables sont celles du cours.
Les tables du cas « une prospecte de plus, Diane »
| nom |
|---|
| Alice |
| Bernard |
| nom |
|---|
| Bernard |
| Camille |
| Diane |
Les autres tables sont celles du cours.
- Donner le résultat attendu, nom par nom, et dire combien de lignes entrent et combien sortent.
- 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.
| nom |
|---|
| Alice |
| Bernard |
| Lyon |
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 4 : les abonnés qui ne sont pas prospects
Écrire l'expression qui garde les abonnés qui ne sont pas aussi prospects.
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é »
| nom |
|---|
| Alice |
| Bernard |
| nom |
|---|
| Bernard |
| Camille |
Les autres tables sont celles du cours.
Les tables du cas « Diane s'abonne »
| nom |
|---|
| Alice |
| Bernard |
| Diane |
| nom |
|---|
| Bernard |
| Camille |
Les autres tables sont celles du cours.
- Donner le résultat.
- 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.
| nom |
|---|
| Camille |
L'union, elle, est commutative : A ∪ B et B ∪ A donnent la même relation.
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 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)).
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é »
| nom |
|---|
| Alice |
| Bernard |
| nomSalarie | service |
|---|---|
| Bernard | Ventes |
| Diane | Atelier |
Les autres tables sont celles du cours.
Les tables du cas « Alice est embauchée »
| nom |
|---|
| Alice |
| Bernard |
| nomSalarie | service |
|---|---|
| Bernard | Ventes |
| Diane | Atelier |
| Alice | Atelier |
Les autres tables sont celles du cours.
- Dire pourquoi
Abonne ∩ Salariene convient pas. - 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.
É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.
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.
- Écrire le produit cartésien des deux, et dire combien de lignes il compte.
- Dire pourquoi ce compte ne dépend que du nombre de lignes de chaque côté, et pas de leur contenu.
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.
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é »
| nom |
|---|
| Camus |
| Duras |
| titre | auteur |
|---|---|
| La Peste | Camus |
| L'Étranger | Camus |
| Le Ravissement de Lol V. Stein | Duras |
Les autres tables sont celles du cours.
Les tables du cas « une autrice sans livre dans la table, un livre de Duras de plus »
| nom |
|---|
| Camus |
| Duras |
| Sagan |
| titre | auteur |
|---|---|
| La Peste | Camus |
| L'Étranger | Camus |
| Le Ravissement de Lol V. Stein | Duras |
| L'Amant | Duras |
Les autres tables sont celles du cours.
- 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.
| nom | titre | auteur |
|---|---|---|
| Camus | La Peste | Camus |
| Camus | L'Étranger | Camus |
| Camus | Le Ravissement de Lol V. Stein | Duras |
| Duras | La Peste | Camus |
| Duras | L'Étranger | Camus |
| Duras | Le Ravissement de Lol V. Stein | Duras |
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.
| Relation | Attributs | Lignes |
|---|---|---|
Classe | idClasse, nomClasse, annee | 3 |
Etudiant | idEtudiant, nom, prenom, dateNaissance, email, ville, idClasse, actif | 10 |
Enseignant | idEnseignant, nomEns, prenomEns, specialite | 3 |
Cours | idCours, intitule, volumeHoraire, coefficient, idEnseignant | 7 |
Inscription | idEtudiant, idCours, note | 25 |
Client | idClient, nom, prenom, ville | 4 |
Projet | idProjet, libelle, idClient | 4 |
Employe | idEmploye, nom, prenom, salaire, date_embauche, service | 5 |
TravailleSur | idEmploye, idProjet, heures | 7 |
Afficher le contenu des neuf tables
Classe
| idClasse | nomClasse | annee |
|---|---|---|
| 1 | 1A | 1 |
| 2 | 1B | 1 |
| 3 | 2A | 2 |
Etudiant
| idEtudiant | nom | prenom | dateNaissance | ville | idClasse | actif | |
|---|---|---|---|---|---|---|---|
| 1 | Martin | Lea | 2004-03-12 | lea.martin@ecole.fr | Paris | 1 | 1 |
| 2 | Diallo | Amine | 2003-11-02 | amine.diallo@ecole.fr | Lyon | 1 | 1 |
| 3 | Dupond | Sophie | 2004-07-25 | sophie.dupond@ecole.fr | Paris | 1 | 1 |
| 4 | Durand | Tom | 2003-05-30 | tom.durand@ecole.fr | Nantes | 2 | 0 |
| 5 | Lefebvre | Ines | 2004-01-18 | ines.lefebvre@ecole.fr | Lyon | 2 | 1 |
| 6 | Bernard | Yanis | 2002-09-08 | NULL | Paris | 2 | 1 |
| 7 | Moreau | Chi | 2004-02-14 | chi.moreau@ecole.fr | Paris | 3 | 1 |
| 8 | Marchand | Hugo | 2003-08-21 | NULL | Bordeaux | 3 | 1 |
| 9 | Nguyen | Elsa | 2004-11-30 | elsa.nguyen@ecole.fr | Lyon | 3 | 1 |
| 10 | Petit | Sofia | 2002-12-05 | sofia.petit@ecole.fr | Nantes | 1 | 0 |
Enseignant
| idEnseignant | nomEns | prenomEns | specialite |
|---|---|---|---|
| 1 | Durand | Claire | Bases de donnees |
| 2 | Ferrand | Marc | Algorithmique |
| 3 | Aubert | Sophie | Statistiques |
Cours
| idCours | intitule | volumeHoraire | coefficient | idEnseignant |
|---|---|---|---|---|
| 1 | Bases de donnees | 30 | 2.0 | 1 |
| 2 | Algorithmique | 24 | 1.5 | 2 |
| 3 | Mathematiques | 36 | 2.5 | 3 |
| 4 | Physique | 27 | 2.0 | NULL |
| 5 | Informatique | 30 | 2.0 | 1 |
| 6 | Statistiques | 18 | 1.0 | 3 |
| 7 | Reseaux | 21 | 1.5 | NULL |
Inscription
| idEtudiant | idCours | note |
|---|---|---|
| 1 | 1 | 15.5 |
| 1 | 3 | 17.0 |
| 1 | 5 | 13.0 |
| 2 | 1 | 8.5 |
| 2 | 3 | 14.0 |
| 2 | 4 | 11.5 |
| 3 | 1 | 11.0 |
| 3 | 2 | 16.5 |
| 3 | 3 | 19.0 |
| 3 | 7 | 9.5 |
| 4 | 2 | NULL |
| 4 | 4 | 7.0 |
| 5 | 1 | 18.0 |
| 5 | 6 | 13.5 |
| 5 | 7 | 12.0 |
| 6 | 3 | 6.0 |
| 6 | 4 | 10.0 |
| 7 | 2 | 14.5 |
| 7 | 5 | 15.0 |
| 8 | 1 | 12.5 |
| 8 | 6 | NULL |
| 9 | 3 | 16.0 |
| 9 | 4 | 17.5 |
| 9 | 5 | 9.0 |
| 10 | 2 | 10.5 |
Client
| idClient | nom | prenom | ville |
|---|---|---|---|
| 1 | Durand | Paul | Paris |
| 2 | Leroy | Sarah | Lyon |
| 3 | Moreau | Karim | Paris |
| 4 | Fontaine | Eva | Bordeaux |
Projet
| idProjet | libelle | idClient |
|---|---|---|
| 1 | Portail client | 1 |
| 2 | Refonte ERP | 2 |
| 3 | Application mobile | 3 |
| 4 | Audit reseau | 4 |
Employe
| idEmploye | nom | prenom | salaire | date_embauche | service |
|---|---|---|---|---|---|
| 1 | Girard | Nadia | 2450 | 2019-04-01 | Etudes |
| 2 | Lemoine | Paul | 1980 | 2021-09-15 | Support |
| 3 | Barbier | Sofia | 3100 | 2016-01-10 | Etudes |
| 4 | Roche | Tom | 2200 | 2022-03-07 | Support |
| 5 | Vidal | Lucie | 2750 | 2018-11-23 | Commerce |
TravailleSur
| idEmploye | idProjet | heures |
|---|---|---|
| 1 | 1 | 120 |
| 1 | 3 | 40 |
| 2 | 1 | 80 |
| 3 | 2 | 200 |
| 3 | 3 | 60 |
| 4 | 4 | 35 |
| 5 | 2 | 90 |
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).
- Écrire une expression qui associe à chaque affectation le libellé du projet concerné, et prévoir son nombre de colonnes.
- Expliquer pourquoi une union ne conviendrait pas ici.
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.
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 »
| idEmploye | idProjet | heures |
|---|---|---|
| 1 | 1 | 120 |
| 1 | 3 | 40 |
| 2 | 1 | 80 |
| 3 | 2 | 200 |
| 3 | 3 | 60 |
| 4 | 4 | 35 |
| 5 | 2 | 90 |
| 2 | 3 | 100 |
| 1 | 2 | 150 |
Les autres tables sont celles du cours.
Afficher la correction
Cliquer sur un nœud pour voir la relation qu'il produit.
| idEmploye | TravailleSur.idProjet | heures | Projet.idProjet | libelle | idClient |
|---|---|---|---|---|---|
| 1 | 1 | 120 | 1 | Portail client | 1 |
| 1 | 3 | 40 | 3 | Application mobile | 3 |
| 2 | 1 | 80 | 1 | Portail client | 1 |
| 3 | 2 | 200 | 2 | Refonte ERP | 2 |
| 3 | 3 | 60 | 3 | Application mobile | 3 |
| 4 | 4 | 35 | 4 | Audit reseau | 4 |
| 5 | 2 | 90 | 2 | Refonte ERP | 2 |
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 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.
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 »
| idEmploye | idProjet | heures |
|---|---|---|
| 1 | 1 | 120 |
| 1 | 3 | 40 |
| 2 | 1 | 80 |
| 3 | 2 | 200 |
| 3 | 3 | 60 |
| 4 | 4 | 35 |
| 5 | 2 | 90 |
| 1 | 2 | 30 |
Les autres tables sont celles du cours.
- Expliquer pourquoi la sélection sur le libellé ne peut pas s'appliquer directement à
TravailleSur. - 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 |
|---|
| Barbier |
| Vidal |
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 |
|---|
| Barbier |
| Vidal |
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.
- 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 ?
- Écrire l'union des deux sélections dans le bloc.
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 ¬.
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 »
| idEtudiant | idCours | note |
|---|---|---|
| 1 | 1 | 15.5 |
| 1 | 3 | 17 |
| 1 | 5 | 13 |
| 2 | 1 | 8.5 |
| 2 | 3 | 14 |
| 2 | 4 | 11.5 |
| 3 | 1 | 11 |
| 3 | 2 | 16.5 |
| 3 | 3 | 19 |
| 3 | 7 | 9.5 |
| 4 | 2 | 12 |
| 4 | 4 | 7 |
| 5 | 1 | 18 |
| 5 | 6 | 13.5 |
| 5 | 7 | 12 |
| 6 | 3 | 6 |
| 6 | 4 | 10 |
| 7 | 2 | 14.5 |
| 7 | 5 | 15 |
| 8 | 1 | 12.5 |
| 8 | 6 | 9 |
| 9 | 3 | 16 |
| 9 | 4 | 17.5 |
| 9 | 5 | 9 |
| 10 | 2 | 10.5 |
Les autres tables sont celles du cours.
- 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 :
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 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.
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é »
| employe | competence |
|---|---|
| Alice | Java |
| Alice | SQL |
| Alice | Réseau |
| Paul | Java |
| Paul | SQL |
| Chi | Java |
| competence |
|---|
| Java |
| SQL |
Les autres tables sont celles du cours.
Les tables du cas « Chi apprend SQL »
| employe | competence |
|---|---|
| Alice | Java |
| Alice | SQL |
| Alice | Réseau |
| Paul | Java |
| Paul | SQL |
| Chi | Java |
| Chi | SQL |
| competence |
|---|
| Java |
| SQL |
Les autres tables sont celles du cours.
- Dire ce que cette opération résume, et pourquoi une jointure seule ne suffit pas.
- 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 |
|---|
| Alice |
| Paul |
| Chi |
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 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.
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 »
| idEtudiant | idCours | note |
|---|---|---|
| 1 | 1 | 15.5 |
| 1 | 3 | 17 |
| 1 | 5 | 13 |
| 2 | 1 | 8.5 |
| 2 | 3 | 14 |
| 2 | 4 | 11.5 |
| 3 | 1 | 11 |
| 3 | 2 | 16.5 |
| 3 | 3 | 19 |
| 3 | 7 | 9.5 |
| 4 | 2 | NULL |
| 4 | 4 | 7 |
| 5 | 1 | 18 |
| 5 | 6 | 13.5 |
| 5 | 7 | 12 |
| 6 | 3 | 6 |
| 6 | 4 | 10 |
| 7 | 2 | 14.5 |
| 7 | 5 | 15 |
| 8 | 1 | 12.5 |
| 8 | 6 | NULL |
| 9 | 3 | 16 |
| 9 | 4 | 17.5 |
| 9 | 5 | 9 |
| 10 | 2 | 10.5 |
| 5 | 2 | 12 |
Les autres tables sont celles du cours.
- Dire pourquoi une jointure seule ne suffit pas.
- 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 |
|---|
| 3 |
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.
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.
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.
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
NULLest 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.
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 |
|---|---|
| Durand | Paul |
| Moreau | Karim |
- Décrire étape par étape ce que fait cet arbre.
- Dire ce qui se passe si la projection et la sélection sont inversées.
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.
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 »
| idClient | nom | prenom | ville |
|---|---|---|---|
| 1 | Durand | Paul | Paris |
| 2 | Leroy | Sarah | Lyon |
| 3 | Moreau | Karim | Paris |
| 4 | Fontaine | Eva | Bordeaux |
| 5 | Perrin | Marc | Paris |
Les autres tables sont celles du cours.
- 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.
Échec attendu.attribut inconnu : ville. Disponibles : nom, prenom
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.
σ_{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 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.
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 »
| idClient | nom | prenom | ville |
|---|---|---|---|
| 1 | Durand | Paul | Paris |
| 2 | Leroy | Sarah | Lyon |
| 3 | Moreau | Karim | Paris |
| 4 | Fontaine | Eva | Bordeaux |
| 5 | Perrin | Marc | Nantes |
Les autres tables sont celles du cours.
- Décrire l'arbre correspondant.
- 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 |
|---|---|
| Durand | Paul |
| Leroy | Sarah |
| Moreau | Karim |
| Fontaine | Eva |
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 14 : les inscrits en mathématiques
Écrire l'expression qui donne le nom des étudiants inscrits au cours dont l'intitulé est Mathematiques.
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 »
| idEtudiant | idCours | note |
|---|---|---|
| 1 | 1 | 15.5 |
| 1 | 3 | 17 |
| 1 | 5 | 13 |
| 2 | 1 | 8.5 |
| 2 | 3 | 14 |
| 2 | 4 | 11.5 |
| 3 | 1 | 11 |
| 3 | 2 | 16.5 |
| 3 | 3 | 19 |
| 3 | 7 | 9.5 |
| 4 | 2 | NULL |
| 4 | 4 | 7 |
| 5 | 1 | 18 |
| 5 | 6 | 13.5 |
| 5 | 7 | 12 |
| 6 | 3 | 6 |
| 6 | 4 | 10 |
| 7 | 2 | 14.5 |
| 7 | 5 | 15 |
| 8 | 1 | 12.5 |
| 8 | 6 | NULL |
| 9 | 3 | 16 |
| 9 | 4 | 17.5 |
| 9 | 5 | 9 |
| 10 | 2 | 10.5 |
| 10 | 3 | 12 |
Les autres tables sont celles du cours.
- Décrire l'arbre non optimisé, qui joint les trois tables avant de filtrer.
- 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
Coursconstruit-elle dans la version non optimisée, avant la sélection sur l'intitulé ? - 2.
Dans la version optimisée,
Coursne 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 |
|---|
| Martin |
| Diallo |
| Dupond |
| Bernard |
| Nguyen |
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 |
|---|
| Martin |
| Diallo |
| Dupond |
| Bernard |
| Nguyen |
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 |
|---|
| Moreau |
| Marchand |
| Nguyen |
- Nommer les nœuds internes et les feuilles.
- Dire ce qu'il faudrait changer pour afficher aussi le prénom.
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.
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 »
| idEtudiant | nom | prenom | dateNaissance | ville | idClasse | actif | |
|---|---|---|---|---|---|---|---|
| 1 | Martin | Lea | 2004-03-12 | lea.martin@ecole.fr | Paris | 1 | 1 |
| 2 | Diallo | Amine | 2003-11-02 | amine.diallo@ecole.fr | Lyon | 1 | 1 |
| 3 | Dupond | Sophie | 2004-07-25 | sophie.dupond@ecole.fr | Paris | 1 | 1 |
| 4 | Durand | Tom | 2003-05-30 | tom.durand@ecole.fr | Nantes | 2 | 0 |
| 5 | Lefebvre | Ines | 2004-01-18 | ines.lefebvre@ecole.fr | Lyon | 2 | 1 |
| 6 | Bernard | Yanis | 2002-09-08 | NULL | Paris | 2 | 1 |
| 7 | Moreau | Chi | 2004-02-14 | chi.moreau@ecole.fr | Paris | 3 | 1 |
| 8 | Marchand | Hugo | 2003-08-21 | NULL | Bordeaux | 3 | 1 |
| 9 | Nguyen | Elsa | 2004-11-30 | elsa.nguyen@ecole.fr | Lyon | 3 | 1 |
| 10 | Petit | Sofia | 2002-12-05 | sofia.petit@ecole.fr | Nantes | 1 | 0 |
| 11 | Tran | Chi | 2004-09-17 | chi.tran@ecole.fr | Lyon | 2 | 1 |
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 |
|---|---|
| Moreau | Chi |
| Marchand | Hugo |
| Nguyen | Elsa |
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 |
|---|
| Martin |
| Diallo |
| Dupond |
| Petit |
| Lefebvre |
| Nguyen |
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.
- Lister les opérations nécessaires, dans l'ordre logique.
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.
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 »
| idEmploye | idProjet | heures |
|---|---|---|
| 1 | 1 | 120 |
| 1 | 3 | 40 |
| 2 | 1 | 180 |
| 3 | 2 | 90 |
| 3 | 3 | 60 |
| 3 | 1 | 100 |
| 4 | 4 | 35 |
| 5 | 2 | 90 |
Les autres tables sont celles du cours.
- 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
EmployeetTravailleSurentiers ? - 2.
Et dans la version où les deux sélections sont descendues ?
Afficher la correction
Les opérations, dans l'ordre :
- filtrer les employés du service
Etudes, sur la feuilleEmploye; - filtrer les affectations de plus de 100 heures, sur la feuille
TravailleSur; - joindre les deux résultats sur
idEmploye; - 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 |
|---|
| Girard |
| Barbier |
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 |
|---|
| Girard |
| Barbier |
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.
- Écrire d'abord l'expression directe, jointures puis sélection puis projection, et la vérifier dans le bloc.
- 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 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.
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 »
| idEmploye | idProjet | heures |
|---|---|---|
| 1 | 1 | 120 |
| 1 | 3 | 40 |
| 2 | 1 | 80 |
| 3 | 2 | 200 |
| 3 | 3 | 60 |
| 4 | 4 | 55 |
| 5 | 2 | 90 |
Les autres tables sont celles du cours.
- Dire ce qui se passe si la projection sur
TravailleSurretireheuresavant la sélection.
Afficher la correction
Cliquer sur un nœud pour voir la relation qu'il produit.
| nom | libelle |
|---|---|
| Girard | Portail client |
| Lemoine | Portail client |
| Barbier | Refonte ERP |
| Barbier | Application mobile |
| Vidal | Refonte ERP |
Cliquer sur un nœud pour voir la relation qu'il produit.
| nom | libelle |
|---|---|
| Girard | Portail client |
| Lemoine | Portail client |
| Barbier | Refonte ERP |
| Barbier | Application mobile |
| Vidal | Refonte ERP |
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.
Échec attendu.attribut inconnu : heures. Disponibles : idEmploye, idProjet
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 ?