===== 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]]