Fermer2
squalylLe 24/10/2006 à 17:05
Bon, hem hem, je viens d'avoir en cours l'explication d'un problème que j'avais demandé à plusieurs, je poste là pour google et d'autres si ça les intéresse.

Quand on fait une jointure du genre:

select clients.nom, clients.adresse from clients, commande where clients.id = commandes.clientid and commandes.statut="expédié"

ce qui donne les coordonnées des clients dont les commandes ont été expédiées, sachant que l'on a une table client (id, nom, adresse) et une table commandes(id,clientid,statut)

Pensez aux lignes d'une table comme un ENSEMBLE DE N-uplets.

Dans ce cas qu'est ce qui se passe? Plusieurs étapes.

On calcule le PRODUIT CARTESIEN des deux ensembles de N-uplets
on sélectionne ceux pour lesquels clients.id = commandes.clientid
on sélectionne ceux pour lesquels commandes.statut="expédié"
on découpe dans le résultat les colonnes qui nous intéressent (ici clients.nom, clients.adresse)

et voilà!

Exemple:

table client (id,nom,adresse):
1, toto, paris
2, pwic, lyon

table commandes (id, clientid, statut)
1, 1, expédié
2, 1, en_cours
3, 2, expédié
4,2, en_cours

on imagine que c'est des ensembles de n-uplets

clients = { <1, toto, paris> ; <2, pwic, lyon> }
commandes = { <1, 1, expédié > ; <2, 1, en_cours> ; <3, 2, expédié> ; <4, 2, en_cours> }

Si on fait le produit cartésien on aura:

client X commandes = {<1, toto, paris, 1, 1, expédié> ; <1, toto, paris, 2, 1, en_cours> ; <1, toto, paris, 3, 2, expédié> ; <1, toto, paris, 4, 2, en_cours> ; <2, pwic, lyon 1, 1, expédié> ; <2, pwic, lyon, 2, 1, en_cours> ; <2, pwic, lyon, 3, 2, expédié> ; <2, pwic, lyon, 4, 2, en_cours> }

Ca fait beaucoup de N-uplets plus gros

on sélectionne ceux pour qui clients.id = commandes.clientid

il reste:

client X commandes : clients.id = commandes.clientid = {<1, toto, paris, 1, 1, expédié> ; <1, toto, paris, 2, 1, en_cours> ; <2, pwic, lyon, 3, 2, expédié> ; <2, pwic, lyon, 4, 2, en_cours>}

Détail: quand on fait une jointure naturelle, la condition de jointure est une égalité donc on supprime une des deux colonnes jointes, qui contiennent en effet la même information. Mais une jointure basique est pas obligatoirement basée sur une égalité de colonnes.

ensuite on prend les commandes en cours:

client X commandes : clients.id = commandes.clientid et commandes.etat="expédié" = {<1, toto, paris, 1, 1, expédié> ; <2, pwic, lyon, 3, 2, expédié> }

puis on "projette" sur les attributs (colonnes) voulues:

(client X commandes : clients.id = commandes.clientid et commandes.etat="expédié" ) [nom, adresse]= {<toto, paris> ; <pwic, lyon> }

voila le mystère des jointures est élucidé. La clé c'est le produit cartésien qui permet de créer toutes les combinaisons.

Evidemment, les algos sont optimisés, on va pas multiplier 10000 clients par 1 million de commandes, et choisir après! ça se fait en même temps, et c'est optimisé.

Personne était capable de l'expliquer, même pas Ethaniel qui a préféré me dire "t'apprendras plus tard" ?

si un truc est pas clair dites moi, autant que ce topic serve d'explication à plusieurs grin