Page 1 sur 1

LEFT, RIGHT différence ?

Posté : 20 juin 2006, 15:35
par Marin
Bonjour

J'ai une question qui peut vous paraitre stupid, après avoir lu pas mal d'exemples sur les requêtes SQL, je n'arrive toujurs pas a saisir la nuance subtile entre un LEFT OUTER JOIN et un RIGHT OUTER JOIN, ce qui me pose problème, puisque je ne sais jamais lequel je dois utilisé dans mes requêtes.

Pourriez vous me l'expliquer simplement ?

J'ai beau lire et relire, j'arrive toujours pas à savoir lequel il faut utiliser des 2 :(

Merci d'avance.

Posté : 20 juin 2006, 15:40
par ouckileou

Code : Tout sélectionner

SELECT col1 FROM tableA LEFT OUTER JOIN tableB ON col1 = col2
renvoie toutes lignes de la tableA, même si elle n'ont pas de correspondance dans la tableB

Code : Tout sélectionner

SELECT col1 FROM tableA RIGHT OUTER JOIN tableB ON col1 = col2
renvoie toutes lignes de la tableB, même si elle n'ont pas de correspondance dans la tableA

En conséquence, si tu remplaces LEFT par RIGHT, en inversant l'ordre des tables, ça revient au même.
Après laquelle utiliser, ça dépend de ce que tu veux faire.
Sachant qu'il vaut mieux utiliser LEFT je crois, souvent mieux implémenté et plus naturel.

Ici c'est bien expliqué : http://laltruiste.com/document.php?url= ... nture.html
Et dans le manuel MySQL il y a des infos sur ce qu'il vaut mieux utiliser :
http://dev.mysql.com/doc/refman/5.0/fr/join.html

Posté : 20 juin 2006, 15:44
par zeus
Sachant qu'il vaut mieux utiliser LEFT je crois, souvent mieux implémenté et plus naturel.
On peut dire que LEFT OUTER JOIN revient à faire OUTER JOIN donc plus simple à lire et il vaut toujours mieux mettre en 1er les tables qui contiennent les données qui nous intéresses le plus ;)

Posté : 20 juin 2006, 15:49
par albat
Imaginons un exemple absurde, mais simple :
tu as une table HOMME qui contient des noms d'homme et une table FEMME qui...
(c'est bien ! Apparemment, jusque là, tout le monde suit...) :lol:
Certains de ces hommes et femmes sont mariés (ils ont le même id, les autres sont célibataires)
SELECT H.h_id, F.f_id FROM homme H INNER JOIN femme F ON H.h_id=F.f_id
j'obtiens tous les couples composés d'un homme et d'une femme
ayant le même identifiant dans leurs tables respectives.
:arrow: hommes mariés, femmes mariées.

SELECT H.h_id, F.f_id FROM homme H LEFT JOIN femme F ON H.h_id=F.f_id
j'obtiens tous les hommes et seulement les femmes qui ont le même identifiant que leur mâle.
:arrow: hommes mariés et célibataires, femmes mariées.
SELECT H.h_id, F.f_id FROM homme H RIGHT JOIN femme F ON H.h_id=F.f_id
// ou
SELECT H.h_id, F.f_id FROM femme F LEFT JOIN homme H ON F.f_id=H.h_id
j'obtiens toutes les femmes et seulement les hommes qui ont le même identifiant que leur dame.
:arrow: hommes mariés, femmes mariées et célibataires.

Et si je lance la requête :
SELECT H.h_id, F.f_id FROM homme H, femme F
sans jointure, je crée un joli produit cartésien.
En d'autres termes, une partouze. :langue:

Bon, ben, j'vas rentrer, moi... ;)

Posté : 20 juin 2006, 16:14
par Marin
Merci beaucoup à vous 3 :P, c'est un peu plus clair, au début, je pensais que ça avait un rapport avec les noms des tables par ordre alphabétique et numérique....
La honte :oops:

Très bien ton explication albat, avec une pointe d'humour :D

Je viens d'essayer en mettant un simple OUTER JOIN, zeus, mais ça renvoi une erreur de syntaxe (mysql).

Bon, pour l'instant ma requête est faite à l'envers, donc, je vais utiliser les RIGHT.

En tout cas, encore merci, j'ai compris, reste à bien réfléchir dans la création de mes requêtes.