===== 3.2.2 Opérateurs multi-tables ===== Principe : recoupement d'informations présentes dans plusieurs tables : * Croisement des critères de sélection : **Jointure** * Recherche ciblée : **Division** ==== Jointure : ⋈ ==== **Union de deux éléments :** * Soient les relations r et s de schémas R et S. * On note R ⋂ S la liste des attributs communs aux deux schémas et R ⋃ S la liste des attributs appartenant à R ou à S. * soit t ∈ r et q ∈ s tels que t(R ⋂ S) = q(R ⋂ S) On note t ⋃ q le tuple formé des valeurs de t et de q étendues au schéma R ⋃ S **Produit cartésien ** * Soient r et s (de schémas R et S), avec R ⋂ S = Ø Le produit cartésien r × s est une nouvelle table de schéma R ⋃ S combinant les tuples de r et de s de toutes les façons possibles : $$r × s = \{t \cup q : t \in r, q \in s\}$$ * La **jointure** est une opération qui consiste à effectuer un produit cartésien des tuples de deux relations pour lesquelles certaines valeurs correspondent. * Le résultat de l'opération est une nouvelle relation. **Jointure** * Soient r et s (de schémas R et S), avec R ⋂ S ≠ Ø * La **jointure** r ⋈ s est une nouvelle table de schéma R ⋃ S combinant les tuples de r et de s ayant des valeurs communes pour les attributs communs. $$r ⋈ s = \{t \cup q : t∈ r, q∈ s, t(R \cap S) = q(R \cap S)\}$$ **Exemple** **Matière_première :** ^nom_matière^unité^prix^ |pétrole|baril|45$| |gaz|GJ|3$| |uranium|lb|12$| **Exportations :** ^nom_pays^nom_matière^quantité^ |Algérie|pétrole|180.000| |Algérie|gaz|20.000| |Niger|uranium|30.000| |Arabie Saoudite|pétrole|2.000.000| |Arabie Saoudite|gaz|750.000| **Matière_première ⋈ Exportations **: ^nom_pays^nom_matière^quantité^unité^prix^ |Algérie|pétrole|180.000|baril|45$| |Algérie|gaz|20.000|GJ|3$| |Niger|uranium|30.000|lb|12$| |Arabie Saoudite|pétrole|2.000.000|baril|45$| |Arabie Saoudite|gaz|750.000|GJ|3$| **Exemples de requêtes ** * “//Donner la liste des PIB/hab des pays exportateurs de pétrole//” : $$Π_\text{PIB/hab}( σ_\text{nom_matière = pétrole} ( \text{Pays} ⋈ \text{Exportations} ))$$ **Schéma de base relationnelle** : * **Clients** ( __nom_client__, adresse_client, solde) * **Commandes** ( __num_Commande__, __n__o__m__ __c__l__i__e__n__t, __n__o__m__ __f__o__u__r__n__i__s__s__e__u__r__, __c__o__m__p__o__s__a__n__t__, quantité, montant) * **Fournisseurs** ( __nom_fournisseur__, adresse_fournisseur) * **Catalogue** ( __nom_fournisseur, composant__, prix ) * “//Donner le nom et l'adresse des clients qui ont commandé des micro controleurs//” : $$Π_\text{nom_client,adresse_client}( σ_\text{composant = 'micro-controller'} ( \text{Client} ⋈ \text{Commandes} ))$$ ====Requêtes multi-tables en SQL==== SELECT A1,A2, …, An // liste d’attributs FROM R1, …, Rm // liste de tables WHERE F1 AND … AND Fl // liste de conditions sur les attributs // (en particulier conditions sur les attributs // sur lesquel s’effectue la jointure) Pour exprimer la jointure sur l’attribut 'Aj' commun aux tables 'R1' et 'R2', on écrira : 'R1.Aj = R2.Aj' **Exemples :** SELECT PIB_par_hab FROM Pays NATURAL JOIN Exportations WHERE nom_matiere = 'petrole' SELECT PIB_par_hab FROM Pays, Exportations WHERE nom_matiere = 'petrole' AND Pays.nom_pays = Exportations.nom_pays SELECT PIB_par_hab FROM Pays WHERE nom_pays IN ( select nom_pays FROM Exportations WHERE nom_matiere = 'petrole' ) ==== Division==== **Division** * Soient r (de schémas R) et s (de schémas S), avec S ⊆ R : La division r ÷ s est la relation (table) u de schéma R-S maximale contenant des tuples tels que u × s ⊆ r (avec × représentant le produit cartésien) $$r ÷ s = \{ t | ∀ q ∈ s, t \cup q ∈ r\}$$ → on cherche les éléments de t qui “correspondent” à s {{public:std-3:cm2:conception_de_bases_de_donnees:3.1.1_modele_ensembliste:s7-cm-17.png}} __Previous__ : [[public:STD-3:CM2:Interrogation des bases de données:3.2.1 Opérateurs mono-table]] __Up__ : [[public:STD-3:CM2:Interrogation des bases de données]] __Next__ : [[public:STD-3:CM2:Interrogation des bases de données:3.2.3 Recherches composées]]