Tous niveaux

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