Jointure et In

Dans ce tutoriel vous aller voir les différentes solutions pour sélectionner des enregistrements qui ont un point commun sur plusieurs tables en même temps. Le produit cartésien est le plus simple à mettre en place mais il demande beaucoup en ressource serveur, je vous recommande les jointures ou les requêtes 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 :
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)

Nous aurons 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 à éviter car elle est lente et elle fournit des doublons .
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;
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,categorie;

Les jointures :

SELECT nom FROM article_librairie INNER JOIN catégorie ON article_librairie.codec=categorie.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 façon on peut utiliser l'opérateur NOT IN