Vous êtes ici Tutoriel > Jointure et In

 
 

MySQL - Jointure et In

Tutoriel écrit par KOogar et Phreakman
Ecrit le 20 Sep 2005 - modifié le 12 Nov 2006

Dans ce tuto vous aller voir les différentes solutions pour sélectionner des enregistrements qui ont un point commun sur plusieurs table en même temps. Le produit cartesien est le plus simple à mettre en place mais il demande beaucoup en ressource serveur, je vous recommande les jointures ou les rêquetes imbriquées qui vont beaucoup plus vite en traitement.

Pour sélectionner des enregistrements dans des tables différentes, il existe 3 solutions :


  • Le produits cartésiens

  • Les jointures

  • Les requêtes imbriquées



Sommaire :


MySQL - Jointure et In

 
Mysql - Le produit cartésien.

Soit: table1(attribut1,attribut2) et table2(attribut2,attribut3)

Le produit cartésien produira :

table1*table2(table1.attribut1,table1.attribut2,table2.attribut2,table2.attribut3)

on aura donc
table1 a 1 b 2
table2 1 300 2 400

table1*table2
a 1 1 300
a 1 2 400
b 2 1 300
b 2 2 400

SELECT nomattribut1,...,nomattributN FROM nomdetable1,nomdetable2,....,nomdetableN WHERE condition;

Cependant cette méthode est à eviter car elle est lente et elle fournit des doublons .


Mysql - Les jointures

table1
a 1
b 2

table2
1 300
2 400

table
a 1 300
b 2 400

L'exemple ci-dessus est le cas d'une jointure dite NATURELLE, elle est associative et commutative.

Cas théorique d'une jointure naturelle, c'est à dire table1.attribut2=table2.attribut2

SELECT nomattribut1,...,nomattributN FROM nomdetable1 INNER JOIN nomdetable2 ON nomdetable1.nomattribut=nomdetable2.nomattribut WHERE conditions;


Mysql - Les requêtes imbriquées

A savoir

Les requêtes imbriquées se lisent de bas en haut (on lit d'abord la dernière requête) et elles peuvent être remplacées par des jointures mais la réciproque est fausse.

SELECT nomattribut FROM nomdetable WHERE nomattribut IN(SELECT nomattribut FROM nomdetable WHERE condition);

Exemple


Article_librairie(idl,nom,#codec)
Categorie(codec,prix)


Le produit cartésien


SELECT nom FROM article_librairie,catégorie;

Les jointures


SELECT nom FROM article_librairie INNER JOIN catégorie ON article_librairie.codec=catégorie.codec;

Les requêtes imbriquées


SELECT prix FROM catégorie WHERE codec IN (SELECT codec FROM article_librairie WHERE nom='mybook');

Remarque

De la même facon on peut utiliser l'opérateur NOT IN



© Copyright: Les tutoriels sont exclusifs et sont la propriétés des auteurs.
    Reproduction interdite.