name: inter-slide class: left, middle, inverse {{ content }} --- name: layout-general layout: true class: left, middle <style> .remark-slide-number { position: inherit; } .remark-slide-number .progress-bar-container { position: absolute; bottom: 0; height: 4px; display: block; left: 0; right: 0; } .remark-slide-number .progress-bar { height: 100%; background-color: red; } </style>
--- class: middle, left, inverse # Bases de Données : Introduction à l'algèbre relationnelle ### 2023-09-15 #### [Licence MIASHS et Mathématiques]() #### [Bases de Données](http://stephane-v-boucheron.fr/courses/bdd/) #### [Équipe BD](http://stephane-v-boucheron.fr) --- template: inter-slide ## Plan - Un peu d'histoire - Schémas et relations - Formalisation alternative - Premiers opérateurs du langage de manipulation de données - Opérations complémentaires : les jointures - Variations sur les jointures --- template: inter-slide ## Le modèle relationnel --- - Formulé par [E. Codd](https://en.wikipedia.org/wiki/Edgar_F._Codd) en 1970 - Fondé sur la théorie des relations (partie de la théorie naïve des ensembles) - Propose une solution pour + la modélisation et + l'interrogation de données - Facile à traduire/mettre en œuvre dans des langages *réels* exemple~: `Structured Query Language (SQL)` --- ### Un peu de formalisation Rappel sur la notion de relation (au sens classique) ??? --- ### Domaine -.red[Domaine] : ensemble d'éléments Exemples : entiers, flottants, chaines de caractères, date, ... Les types d'un langage de programmation comme `C`, `Java`, ... --- ### Remarque - Un _domaine_ peut se définir - en .red[extension] (en donnant la liste de toutes les valeurs possibles) ou - en .red[intention] (en donnant une propriété caractéristique). --- ### Produit cartésien - Le .red[Produit cartésien] : d'une liste de domaines `\(D_1, D_2, \dots, D_k\)`, noté `$$D_1 \times D_2 \times \dots \times D_k$$` est l'ensemble `$$\Bigl\{(t_1,t_2,\dots,t_k);\ t_i\in D_i \text{ pour } i=1,\dots,k\Bigr\}$$` Un élément `\(t=(t_1,t_2,\dots,t_k)\in D_1 \times D_2 \times \dots \times D_k\)` est appelé .red[ `\(k\)` -uplet ] --- ### Relations (classiques) Une .red[Relation] `\(R\)` est un sous-ensemble de `$$D_1\times D_2\times \cdots \times D_k$$` où `\(D_1,...,D_k\)` sont des domaines `$$R\subset D_1 \times D_2\times \cdots \times D_k$$` --- ### Exemple .fl.w-70.pa2[ Deux domaines `$$D_1=\left\{1,2,5\right\} \quad D_2=\left\{2,4\right\}$$` Un produit cartésien `$$D_1 \times D_2 = \left\{(1,2),(1,4),(2,2),(2,4),(5,2),(5,4)\right\}$$` Une relation `$$R =\left\{(1,2),(1,4),(5,2),(5,4)\right\}$$` Une relation est un (sous-) ensemble (d'un produit cartésien) ] -- .fl.w-30.pa2[ On peut représenter `\(R\)` par le tableau : | `\(X_1\)` | `\(X_2\)` | |:---:|:---:| | 1 | 2 | | 1 | 4 | | 5 | 2 | | 5 | 4 | Chaque ligne de la table correspond à un élément de la relation `\(R\)` ] --- ### Relations (classiques) Dans ce cours, toutes les relations ont un nombre fini d'éléments ! ### .red[Cardinalité] de la relation `\(R\)`: `\(|R|\)` On appelle .red[cardinalité] d'une relation `\(R\)`, notée `\(|R|\)`, le nombre d'éléments de `\(R\)`. ### .red[Arité] de la relation `\(R\)` Soit `\(R\subset D_1\times D_2\times \cdots \times D_k\)`, l'entier `\(k\)` est appelé .red[arité] de `\(R\)`. On parle parfois aussi de *degré* d'une relation. Une relation binaire est une relation d'arité `\(2\)` --- template: inter-slide ## Schémas et relations --- ### Relations et schémas - Une .red[relation] (au sens classique) peut se voir comme une table à deux dimensions : - chaque ligne correspond alors à un `\(k\)`-uplet (si la relation est d'arité `\(k\)`), - chaque élément d'une colonne est à valeur dans un domaine. - Un .red[domaine] peut apparaître plusieurs fois dans la définition d'une relation. -- En BD relationnelle, on veut pouvoir donner un nom à chaque colonne - .red[Attribut]: nom/rôle de la colonne. Précise la sémantique de celle-ci.
Pas deux attributs identiques dans une même table ??? L'idée de nommer les colonnes plutôt que de les désigner par une position/un numéro se retrouve dans les sytèmes qui manipulent des données tabulaires (`Pandas/Python`, `R`, `Spark`, ...). --- ### Schéma d'une relation Le .red[Schéma] d'une relation `\(R\)` est la donnée des attributs et domaines de la relation Le schéma peut se noter `$$R(A_1\! :\! D_1,A_2\! :\! D_2,\dots,A_k\! :\! D_k)$$` où `\(A_i\)` : attribut et `\(D_i\)` : domaine. --- ### Exemple .red[ville] : ensemble de chaînes de caractères (noms de villes). .red[heure] : ensemble de chaînes de caractères de la forme `\(XYhZT\)` où `\(X,Y,Z,T\)` sont des chiffres En notation ISO une heure s'écrit 'HH:MM:SS' (s' on oublie le fuseau horaire) 2023-09-15 10:53:35 | h-dep | dest | h-arr | prov | |:-------:|:-------|:-------:|:---------| | 13h15 | Lyon | 15h15 | Paris | | 13h22 | Nantes | 15h30 | Paris | .red[Schéma]: Train(h-dep:.red[heure], dest:.red[ville] , h-arr:.red[heure] , prov:.red[ville]) Arité : `\(4\)`, Cardinalité : `\(2\)` L'ordre (des lignes ou colonnes) n'a pas vraiment d'importance --- template: inter-slide ## Relations et schémas : formalisation alternative --- ### Formalisation alternative - En BD, l'ordre des éléments et l'ordre des colonnes n'a pas d'importance (on désigne les membres d'un `\(k\)`-uplet par leur nom plutôt que par leur position/rang) - La définition formelle diffère donc de celle d'une relation classique - Soient `\(\{A_1,...,A_k\}\)` un ensemble fini et `\(D_1,...,D_k\)` suite de domaines. Une relation `\(R\)` de schéma `\(R(A_1\! :\! D_1,A_2\! :\! D_2,\dots,A_k\! :\! D_k)\)` est la donnée d'un ensemble d'éléments, noté `\(\mathcal{R}\)` et de `\(k\)` fonctions `\(\mathcal{A}_1: \mathcal{R}\rightarrow D_1\)`, ..., `\(\mathcal{A}_k: \mathcal{R}\rightarrow D_k\)`. Pour tout `\(t\in \mathcal{R}\)` et `\(i\leq k\)`, on note `\(t.A_i=\mathcal{A}_i(t)\)` l'image par `\(\mathcal{A}_i\)` de `\(t\)`. Un élément `\(t\)` de `\(\mathcal{R}\)` est appelé .red[tuple] de la relation `\(R\)` --- L'ensemble des valeurs `\(t.A_1,...., t.A_k\)` associées à un `\(t\in \mathcal{R}\)`. on fixe un ordre arbitraire et on note `\(t=(t.A_1,...., t.A_k)\)` un tuple. - A un tuple `\(t\)` de `\(\mathcal{R}\)` correspond les `\(k\)` valeurs `\(t.A_1, \dots, t.A_k\)` - On notera aussi `\(R\)` le domaine `\(\mathcal{R}\)` d'une relation `\(R\)`. --- ### Relations et schémas : formalisation ### Exemple La relation {Train}(h-dep:.red[heure], dest:.red[ville] , harr:.red[heure] , prov:.red[ville]) | **hdep** | **dest** | **harr** | **prov** | |:------------------:|:---------------|:----------------:|:-----------| | 13h15 | Lyon | 15h15 | Paris | | 13h22 | Nantes | 15h30 | Paris | est constituée de deux tuples `\(e_1\)`, `\(e_2\)` avec : - `\(e_1.\textrm{hdep}=\textrm{'13h15'}\)`, - `\(e_1.\textrm{dest}=\textrm{'Lyon'}\)`, - `\(e_1.\textrm{harr}=\textrm{'15h15'}\)`, - `\(e_1.\textrm{prov}=\textrm{'Paris'}\)` --- ### Résumé informel - RELATION = TABLE A DEUX DIMENSIONS - (NOM DE) COLONNE = ATTRIBUT - EN-TÊTE DU TABLEAU = SCHEMA DE LA RELATION - LIGNE = TUPLE - ENSEMBLE DES LIGNES = CONTENU DE LA RELATION --- template: inter-slide ## LMD : Opérateurs, --- ### Opérateurs de base --- ### Liste des opérateurs L'algèbre relationnelle est d'abord un .red[Langage] de Manipulation de Données (LMD)}. - Union: `\(\Large{\cup}\)` - Intersection: `\(\Large{\cap}\)` - Différence: `\(\Large{\backslash}\)` - Projection: `\(\Large{\Pi}\)` - Sélection: `\(\Large{\sigma}\)` - Produit cartésien: `\(\Large{\times}\)` - Renommage: `\(\Large{\rho}\)` s'appliquent à des relations pour produire d'autres relations (le résultat). --- ### Union `\(\cup\)` et intersection `\(\cap\)` - L'.red[union] et l'.red[intersection] sont des opérations portant sur deux relations `\(R_1\)` et `\(R_2\)` de **même schéma** - `\(T=R_1\cup R_2\)` est constituée des tuples appartenant à `\(R_1\)` *ou* à `\(R_2\)`. - `\(T=R_1\cap R_2\)` est constituée des tuples appartenant à `\(R_1\)` *et* à `\(R_2\)`. - Schémas de `\(R_1\cup R_2\)`, `\(R_1\cap R_2\)` sont les mêmes que ceux de `\(R_1\)` et `\(R_2\)` --- ### Union et intersection ### Exemple .fl.w-50.pa2[ **Train 1** | **h-dep** | **dest** | **num** | |:--------:|:-----------------|:----------------| | 13h15 | Lyon | 213 | | 13h29 | Marseille | 1024 | | 14h15 | Lyon | 214 | **Train 2** | **h-dep** | **dest** | **num** | |:--------:|:-----------------|:----------------| | 13h39 | Avignon | 43 | | 14h15 | Lyon | 214 | ] .fl.w-50.pa2[ **Train 1 `\(\cup\)` Train 2** | **h-dep** | **dest** | **num** | |:-----------:|:-------------|:----------------| | 13h15 | Lyon | 213 | | 13h29 | Marseille | 1024 | | 14h15 | Lyon | 214 | | 13h39 | Avignon | 43 | **Train 1 `\(\cap\)` Train 2** | **h-dep** | **dest** | **num** | |:--------:|:-----------------|----------------:| | 14h15 | Lyon | 214 | ] --- ### Différence - La **différence** de deux relations `\(R_1\)` et `\(R_2\)` (de même schéma) est une relation `\(T\)` - de même schéma que `\(R_1\)` et `\(R_2\)` - constituée des tuples appartenant à `\(R_1\)` et n'appartenant pas à `\(R_2\)`. - On note `\(T = R_1 - R_2\)`. Opération non .red[commutative] : `\(R_1 - R_2\neq R_2 - R_1\)` (en général). --- ### Exemple .fl.w-50.pa2[ **Train 1** | **h-dep** | **dest** | **num** | |:--------:|:-----------------|:----------------| | 13h15 | Lyon | 213 | | 13h29 | Marseille | 1024 | | 14h15 | Lyon | 214 | **Train 2** | **h-dep** | **dest** | **num** | |:--------:|:-----------------|:----------------| | 13h39 | Avignon | 43 | | 14h15 | Lyon | 214 | ] .fl.w-50.pa2[ **Train 1 `\(\backslash\)` Train 2** | **h-dep** | **dest** | **num** | |:--------:|:-----------------|----------------:| | 13h15 | Lyon | 213 | | 13h29 | Marseille | 1024 | ] --- ### Produit Cartésien - Soient: - `\(R_1\)` de schéma `\(R_1(A_1,A_2,...,A_k)\)` - `\(R_2\)` de schéma `\(R_2(B_1,B_2,...,B_\ell)\)` - avec `\(A_i\neq B_j\)`, pour tout `\(i=1,...,k\)`, `\(j=1,..,\ell\)` - Dans le contexte "classique" : `\(R_1 \times R_2= \{(e_1,e_2): e_1\in R_1, e_2\in R_2\}\)` - `\(R=R_1 \times R_2\)` de schéma `\(R(A_1,A_2,...,A_k,B_1,B_2,...,B_\ell)\)`. Le schéma de `\(R\)` est .red[l'union] des schémas de `\(R_1\)` et `\(R_2\)` - En algèbre relationnelle, cette opération est commutative ( `\(R_1\times R_2 = R_2\times R_1\)` ) et associative --- ### Produit cartésien : définition formelle `\(R=R_1\times R_2\)` est la relation de schéma `\(R(A_1,A_2,...,A_k,B_1,B_2,...,B_\ell)\)` vérifiant~: - Pour tout `\(t\in R\)`, il existe `\(t_1\in R_1\)`, `\(t_2\in R_2\)` tels que : `$$t.A_1=t_1.A_1, \ldots, t.A_k=t_1.A_k,\quad t.B_1=t_2.B_1, \ldots, t.B_\ell=t_2.B_\ell$$` - Réciproquement, pour tout `\(t_1\in R_1\)`, `\(t_2\in R_2\)` , il existe `\(t\in R\)` tels que : `$$t.A_1=t_1.A_1, \ldots, t.A_k=t_1.A_k,\quad t.B_1=t_2.B_1, \ldots, t.B_\ell=t_2.B_\ell$$` --- ### Produit cartésien : exemple **Train 1 `\(\times\)` Train 2** | **h-dep(1)** | **dest(1)** | **num(1)** | **h-dep(2)** | **dest(2)** | **num(2)** | |:--------|:-----------------|:----------------|:--------|:-----------------|:----------------| | 13h15 | Lyon | 213 | 13h39 | Avignon | 43 | | 13h15 | Lyon | 213 | 14h15 | Lyon | 214 | | 13h29 | Marseille | 1024 | 13h39 | Avignon | 43 | | 13h29 | Marseille | 1024 | 14h15 | Lyon | 214 | | 14h15 | Lyon | 214 | 13h39 | Avignon | 43 | | 14h15 | Lyon | 214 | 14h15 | Lyon | 214 | --- ### Projection ( `\(\Large{\pi}\)` ) - La .red[projection] d'une relation `\(R\)` de schéma `\(R(A_1,\dots, A_k)\)` sur les attributs `\(A_{i_1}, \dots, A_{i_p}\)`, `\(i_1,..., i_p\in \{1,...,k\}\)`, est la relation `\(S\)` - de schéma `\(S(A_{i_1}, \dots,A_{i_p})\)` - dont les tuples sont obtenus par élimination des attributs non mentionnés dans `\(A_{i_1}, \dots, A_{i_p}\)` (et par élimination des doublons). - On note `\(S = \pi_{A_{i_1}, \dots, A_{i_p}} (R)\)`. - Définition formelle : `$$s\in S\quad \iff \quad \exists t\in R\ \forall n\in\left\{1,\dots,p\right\}\ s.A_{i_n}=t.A_{i_n}$$` .red[Élimination des doublons] car une projection peut produire plusieurs fois le même tuple. --- ### Projection : Exemple `\(\Large{\Pi_{\text{dest, num}}(\text{Train})}\)` | **dest** | **num** | |:----------------|----------------:| | Lyon | 213 | | Marseille | 1024 | | Lyon | 214 | --- ### Sélection ( `\(\Large{\sigma}\)` ) - La .red[sélection] d'une relation `\(R\)` par une condition `\(C\)` est une relation `\(S\)` - de même schéma que `\(R\)` - dont les tuples sont ceux de `\(R\)` qui satisfont la condition `\(C\)`. - On note `\(S = \sigma_C (R)\)`. - La condition `\(C\)` - s'exprime à l'aide des noms d'attributs de la relation ou de constantes (pour les opérandes) - on peut utiliser des opérateurs arithmétiques de comparaison ( `\(=, \neq, \leq, \geq, <, >\)` ) ainsi que des connecteurs logiques ( `\(\lnot, \land, \lor\)` ).. --- ### Sélection : Exemple `\(\Large{\sigma_{\text{dest}=\text{'Lyon'}} \text{Train 1}}\)` | **h-dep** | **dest** | **num** | |:--------:|:-----------------|---------------:| | 13h15 | Lyon | 213 | | 14h15 | Lyon | 214 | `\(\Large{\sigma_{\text{dest}=\text{'Lyon'} \wedge \text{hdep} > 14h} \text{Train 1}}\)` | **h-dep** | **dest** | **num** | |:--------:|:-----------------|----------------:| | 14h15 | Lyon | 214 | --- ### Renommage - Soit `\(R\)` de schéma `\(R(A_1,\dots, A_k)\)`, le .red[renommage] d'un attribut `\(A_i\)`, `\(i\leq k\)`, en `\(B\)` est une relation `\(S\)` : - de même contenu - de schéma `\(S(A_1,...,A_{i-1},B,A_{i+1},..., A_k)\)` - On le note `\(S=\rho_{A_i\mapsto B}(R)\)` --- ### Exemple Train : | **h-dep** | **dest** | **num** | |:---------------:|:--------------|--------------:| | 13h15 | Lyon | 213 | | 13h29 | Marseille | 1024 | | 14h15 | Lyon | 214 | `$$\rho_{\text{num}\mapsto \text{numero}}(\text{Train})$$` | **h-dep** | **dest** | **numero** | |:---------------:|:--------------|--------------:| | 13h15 | Lyon | 213 | | 13h29 | Marseille | 1024 | | 14h15 | Lyon | 214 | --- .red[Utilité] Va permettre d'étendre certains opérateurs pour des relations de schémas non-disjoints --- ### Résumé ### Algèbre relationnelle - opérations ensemblistes classiques. - Projection : élimine des colonnes - Sélection : élimine des lignes Pour interroger une BD, on compose ces opérateurs : ### Exemple `\(\pi_{num}(\sigma_{dest='Lyon'}(Train))\)` Numéro des trains dont la ville de destination est 'Lyon'. --- template: inter-slide ## Opérations complémentaires : les jointures --- ### Les jointures On va définir des opérations pratiques pour la manipulation de données~: les .red[jointures] - Jointure - Jointure naturelle - `\(\theta\)`-jointure et équi-jointure --- ### Jointure La jointure `\(T=R_1\bowtie_C R_2\)` de deux relations `\(R_1\)` et `\(R_2\)` de schémas disjoints sous la condition `\(C\)` est la relation `\(T\)`: - de schéma la *concaténation* des schémas de `\(R_1\)` et `\(R_2\)` - formée des tuples du produit cartésien `\(R_1 \times R_2\)` qui satisfont la condition `\(C\)` Règles de formation de la .red[condition de jointure] : comme pour la sélection Définition formelle~: `$$R_1 \bowtie_C R_2 = \sigma_C(R_1\times R_2)$$` --- ### Exemple `TrDep` | **hdep** | **dest** | **numdep** | |:----------------:|:--------------|--------:| | 13h15 | Lyon | 213 | | 13h29 | Marseille | 1024 | `TrArr` | **harr** | **prov** | **numarr** | |:----------------:|:--------------|--------:| | 13h39 | Avignon | 43 | | 15h15 | Paris | 213 | `\(\texttt{TrDep} \bowtie_{\text{numdep} > \text{numar}} \texttt{TrArr}\)` | **hdep** | **dest** | **numdep** | **harr** | **prov** | **numarr** | |:----------------:|:--------------|--------:|:----------------:|:--------------|--------:| | 13h15 | Lyon | 213 | 13h39 | Avignon | 43 | | | 13h29 | Marseille | 1024 | 13h39 | Avignon | 43 | | | 13h29 | Marseille | 1024 | 15h15 | Paris | 213 | | --- ### Équi-jointure, `\(\theta\)`-jointure Équi-jointure : Jointure avec égalité entre attributs de types comparables `$$\texttt{TrDep} \bowtie_{\text{numdep} = \text{numarr}} \texttt{TrArr}$$` |**hdep** | **dest** | **numdep** | **harr** | **prov** | **numarr** | |:----------------:|:--------------|--------:|:----------------:|:--------------|--------:| | 13h15 | Lyon | 213 | 15h15 | Paris | 213 | -- `\(\theta\)`-.red[jointure] : condition de jointure entre attributs de types comparables et avec un opérateur différent de l'égalité, c'est-à-dire dans `\(\left\{<,>,\leq,\geq, \neq\right\}\)`. `$$\text{TrDep} \bowtie_{\text{numdep} > \text{numarr}} \text{TrArr}$$` --- ### Jointure naturelle C'est une équi-jointure concernant les attributs communs de deux relations On ne garde dans le résultat qu'une copie des attributs communs
On considère - `\(R_1\)` d'attributs `\(A_1,..,A_k,B_1,...,B_h\)` - `\(R_2\)` d'attributs `\(A_1,..,A_k,B_{h+1},...,B_\ell\)` - `\(A_1,..., A_k\)` : attributs communs et `\(\{B_1,...,B_h\}\cap \{ B_{h+1},...,B_\ell \}=\emptyset\)` - Soit `\(A'_1, ...., A'_k\)` tels que `\(\{A_1,..., A_k\}\cap \{ A'_1, ...., A'_k \}=\emptyset\)` --- ### Jointure naturelle Considérons `\(S\)` d'attributs `\(A_1',..,A_k',B_{h+1},...,B_l\)` définie par : `$$S=\rho_{A_1\mapsto A_1'}(\rho_{A_2\mapsto A_2'}(\cdots (\rho_{A_k\mapsto A_k'}(R_2)\cdots ))$$` La .red[jointure naturelle] sur deux relations `\(R_1\)` et `\(R_2\)` est la relation - d'attributs `\(A_1,..,A_k,B_1,...,B_h, B_{h+1},...,B_\ell\)` - définie par : `$$\pi_{A_1,..,A_k,B_1,...,B_h, B_{h+1},...,B_\ell}(R_1\bowtie_{C} S)$$` où `\(C\)` est `\((A_1=A_1') \wedge (A_2=A'_2) \wedge \ldots \wedge (A_k=A_k')\)`
on réalise une équi-jointure sur tous les attributs communs et on ne garde qu'un seul "exemplaire" de ces attributs communs par projection. On note cette opération : `\(R_1 \bowtie R_2\)`. -- .f6[ Pour éviter le renommage, on peut décider de préfixer les noms des attributs par ceux de la relation. La condition `\(C\)` devient : `$$(R_1.A_1=R_2.A_1) \wedge \ldots \wedge (R_1.A_k=R_2.A_k)$$` ] Inline footnotes text. --- ### Exemple de Jointure naturelle .fl.w-40.pa2[ `TrDep` | **hdep** | **dest** | **num** | |:----------------:|:--------------|--------:| | 13h15 | Lyon | 213 | | 13h29 | Marseille | 1024 | `TrArr` | **harr** | **prov** | **num** | |:----------------:|:--------------|--------:| | 13h39 | Avignon | 43 | | 15h15 | Paris | 213 | ] .fl.w-60.pa2[ `$$\text{TrDep} \bowtie \text{TrArr}$$` | **hdep** | **dest** | **num** | **harr** | **prov** | |:-----------------:|:----------------|--------:|:--------------:|--------------:| | 13h15 | Lyon | 213 | 15h15 | Paris | ] --- ### Exemples de requêtes Base constituée des trois tables suivantes: `fournisseurs(fno, nom, adresse, ville)` `produits(pno, design, prix, poids, couleur)` `commandes(cno, fno, pno, qte)` --- ### Exemples de requêtes (suite) - déterminer les numéros des fournisseurs ayant comme nom "Durand" `$$\pi_{\text{fno}} \bigl( \sigma_{\text{nom}=\text{'Durand'}} (\text{fournisseurs})\bigr)$$` - déterminer les références, prix et quantités des produits commandés à plus de 10 exemplaires. `$$\pi_{\text{pno,prix,qte}} \bigl( \sigma_{\text{qte}>10} (\text{commandes} \bowtie \text{produits})\bigr)$$` --- exclude: true ### Représentation graphique - arbre de requête --- template: inter-slide ## Encore des opérations... --- ### Jointure externe - Perte d'information dans jointure naturelle : les tuples ne satisfaisant pas la condition (non appariés) disparaissent - On ajoute "symboliquement" une ligne dont les valeurs sont vides (ou avec valeur spéciale `NULL`) pour garder les tuples initiaux "non satisfaisants" après la jointure - On note cette opération entre deux relations `\(R\)` et `\(S\)` : `$$R\bowtie^+ S$$` --- ### Jointure externe (exemple) .fl.w-30.pa2[ `TrDep` | **hdep** | **dest** | **num** | |:----------------:|:--------------|--------:| | 13h15 | Lyon | 213 | | 13h29 | Marseille | 1024 | `TrArr` | **harr** | **prov** | **num** | |:----------------:|:--------------|--------:| | 13h39 | Avignon | 43 | | 15h15 | Paris | 213 | ] .fl.w-70.pa2[ `$$\text{TrDep} \bowtie^+ \text{TrArr}$$` | **hdep** | **dest** | **num** | **harr** | **prov** | |:-----------------:|:------------------|------:|:----------------:|:----------------| | 13h15 | Lyon | 213 | 15h15 | Paris | | 13h29 | Marseille | 1024 | - | - | | - | - | 43 | 13h39 | Avignon | ] --- ### Division La .red[division] ou .red[quotient] - d'une relation `\(R\)` de schéma `\(R(A_1,A_2,\dots,A_k)\)` - par une relation `\(S\)` de schéma `\(S(A_{p+1},\dots ,A_k)\)` est la relation `\(T\)` de schéma `\(T(A_1, \dots, A_p)\)` formée des tuples qui complétés par chaque tuple de `\(S\)` donnent un tuple de `\(R\)`. Autrement dit `$$\begin{array}{l} t\in T(A_1,\dots,A_p) \quad \Longleftrightarrow \\ \forall s\in S(A_{p+1},\dots ,A_k) \quad \exists r\in R \quad \begin{cases} t.A_1=r.A_1, \dots, t.A_p=r.A_p\\ s.A_{p+1}=r.A_{p+1},\dots, s.A_{k}=r.A_{k} \end{cases} \end{array}$$` On note `$$T = R \div S$$` --- ### Division (exmple) .fl.w-60.pa2[ `Voyage` : contient pour chaque numéro de client la ville de départ et d'arrivée des voyages qu'il a effectué | **numclient** | **vdep** | **varr**| |---------------:|:-----------------|:----------------| | 1 | Paris | Marseille | | 3 | Marseille | Lyon | | 1 | Paris | Nantes | | 5 | Marseille | Avignon | | 4 | Paris | Nantes | | 3 | Paris | Marseille | | 2 | Caen | Le Mans | | 3 | Paris | Nantes | ] .fl.w-40.pa2[ `Villes` contient des couples villes de départ/villes d'arrivée | **vdep** | **varr** | |:-------------|:---------------| | Paris | Marseille | | Paris | Nantes | ] --- ### Division (exemple, suite) `$$\texttt{Voyage} \div \texttt{Villes}$$` | **numclient** | |-------------:| | 1 | | 3 | .red[Résultat] : numéros des clients ayant effectué tous les voyages entre les villes de la table `Villes` (i.e. à la fois un Paris-Marseille et un Paris-Nantes.) --- ### Interdéfinissabilité des opérateurs - L'union, la différence, le produit cartésien, la sélection et la projection et le renommage sont .red[suffisants] pour définir tous les opérateurs que l'on a vu. - Mais avoir un panel plus large d'opérateurs simplifie l'écriture des requêtes. Quelques définitions - Pour la .red[Jointure] : `\(R \bowtie_C S \equiv \sigma_C (R \times S)\)` - Pour l'.red[intersection] : `\(A \cap B = A \cup B - ((B - A) \cup (A - B))\)` --- exclude: true ### Définition de la division - `\(R\)` de schéma `\(R(A_1,A_2,\dots,A_k)\)`, `\(S\)` de schéma `\(S(A_{p+1},\dots ,A_k)\)` est la relation `\(T= R \div S\)` de schéma `\(T(A_1, \dots, A_p)\)`. `\begin{center} `\begin{tikzpicture} %\Tree [.$\pi_{pno,prix,qte}$ [.$\sigma_{qte>10}$ [.$\bowtie_{pno}$ [.commandes ] [.produit ] ] ] ] \Tree [.$-$ [.$\pi_{A_1,...,A_p}$ `\(R\)` ] [.$\pi_{A_1,...,A_p}$ [.$-$ [.$\times$ [.$\pi_{A_1,...,A_p}$ `\(R\)` ] [.S ] ] [.R ] ] ] ] %[.$\pi_{A_1,...,A_p}$ [.- [.\times [.$\pi_{A_1,...,A_p}$ `\(R\)` ] [.S ] ] [.R ] ] \end{tikzpicture}` \end{center}` --- exclude: true > In the 1960s and 1970s he worked out his theories of data arrangement, issuing his paper "A Relational Model of Data for Large Shared Data Banks"[14] in 1970, after an internal IBM paper one year earlier.[15] To his disappointment, IBM proved slow to exploit his suggestions until commercial rivals started implementing them.[16] > Initially, IBM refused to implement the relational model to preserve revenue from IMS/DB.[citation needed] Codd then showed IBM customers the potential of the implementation of its model, and they in turn pressured IBM. Then IBM included in its Future Systems project a System R subproject – but put in charge of it developers who were not thoroughly familiar with Codd's ideas, and isolated the team from Codd.[citation needed] As a result, they did not use Codd's own Alpha language but created a non-relational one, SEQUEL. Even so, SEQUEL was so superior to pre-relational systems that it was copied, in 1979, based on pre-launch papers presented at conferences, by Larry Ellison, of Relational Software Inc, in his Oracle Database, which actually reached market before SQL/DS – because of the then-already proprietary status of the original name, SEQUEL had been renamed SQL. > Codd continued to develop and extend his relational model, sometimes in collaboration with Christopher J. Date. One of the normalised forms, the Boyce–Codd normal form, is named after him. > Codd's theorem, a result proven in his seminal work on the relational model, equates the expressive power of relational algebra and relational calculus.[14] .fr[From Wikipedia] --- class: middle, center, inverse background-image: url('./img/pexels-cottonbro-3171837.jpg') background-size: cover # The End