2010-12-14 52 views
5

Possible en double:
(self,left outer,right outer,full outer) join - real world examplesQuelle est la différence entre les JOINTS GAUCHE, DROIT, INTÉRIEUR et EXTÉRIEUR?

Bonjour, chère communauté SO!

Je travaille avec des bases de données SQL depuis un certain temps mais un aspect est encore très confus pour moi: les jointures de tables. Je comprends très bien ce qui se passe quand j'écris une requête multi-table, mais quand un JOIN entre en jeu, j'ai l'impression de ne rien comprendre.

S'il vous plaît aidez-moi à comprendre ce qui est joint à la table, et quelle est la différence entre les jointures gauche, droite, intérieure et extérieure? Qu'est-ce qu'une auto-participation?

Je vous serais reconnaissant si vous pouviez donner un exemple de leur utilisation dans cette simple structure de la table:

Tableau auteurs

id |name 
--------------- 
1 |John 
2 |Bob 
3 |Richard 

Tableau livres

id |author_id |title  |rating 
----------------------------------------- 
1 |1   |book A  |5 
2 |1   |book B  |4.8 
3 |3   |book C  |3 

Remerciez toi!

+0

J'ai recherché sur Google cette question exacte et trouvé plusieurs résultats sur la première page illustrant les différences. Peut-être aurait-il été plus rapide que de demander ici. Pour être honnête, je dois d'ordinaire me rafraîchir la mémoire quand je vais me joindre à moi-même! – DarinH

+1

"Je comprends très bien, ce qui se passe, quand j'écris une requête multitable, mais quand un JOIN entre en jeu, j'ai l'impression de ne rien comprendre." Hein? une jointure est toujours en jeu lors de l'écriture de requêtes multitables, vous n'utilisez pas la syntaxe de jointure implicite êtes-vous (celui avec les virgules entre les tables)? Si c'est le cas, n'écrivez jamais un autre morceau de code en utilisant cette syntaxe inexacte et très pauvre. Si vous utilisez cette mauvaise syntaxe, il n'est pas étonnant que vous ne compreniez pas les jointures. – HLGEM

+0

HLGEM, pourquoi est-il dépassé et pauvre? –

Répondre

3

D'UN {type de jointure} BMARCHE {condition join}

intérieur: montre seulement les résultats où la condition de jointure est vrai. S'il n'y a pas de condition vraie pour une ligne sur A, elle sera supprimée des résultats.

gauche: ne filtrent pas les lignes de A qui n'ont pas correspondant rejoindre sur B

droit: filtrera les lignes de A qui n'ont pas correspondant rejoindre sur B

extérieur: gauche et les jointures à droite sont considérées comme des jointures externes où inner est une jointure interne.

3

INNER JOIN:

SELECT 
    a.*, 
    b.* 
FROM 
    authors a 
    INNER JOIN books b ON 
     a.id = b.author_id 

Amènerons à ceci:

id |name  |id |author_id |title  |rating 
--------------------------------------------------------- 
1 |John  |1 |1   |book A  |5 
1 |John  |1 |1   |book B  |4.8 
3 |Richard |3 |3   |book C  |3 

Notez que Bob n'a pas été montré - un inner join supprime toujours les articles qui ne sont pas présents dans les deux sources (compte tenu de la jointure des critères Dans notre cas, a.id = b.author_id.

Rejoindre gauche:

SELECT 
    a.*, 
    b.* 
FROM 
    authors a 
    LEFT JOIN books b ON 
     a.id = b.author_id 

Amènerons à ceci:

id |name  |id |author_id |title  |rating 
--------------------------------------------------------- 
1 |John  |1 |1   |book A  |5 
1 |John  |1 |1   |book B  |4.8 
2 |Bob  |null |null  |null  |null 
3 |Richard |3 |3   |book C  |3 

Maintenant, tous les auteurs sont représentés - un LEFT JOIN (ou LEFT OUTER JOIN, il est le même) gardera tous les "gauche" dossiers (auteurs) et remplacera les «bons» enregistrements qui ne sont pas trouvés avec null. A propos de "jointures à droite" - c'est la même chose que "jointures à gauche", mais avec une relation inverse. La requête suivante entraînera les mêmes dossiers que le dernier (notez que les tables sont dans un ordre inverse, pour compenser l'utilisation de jointure droite):

SELECT 
    a.*, 
    b.* 
FROM 
    books b 
    RIGHT JOIN authors a ON 
     a.id = b.author_id 

L'espoir est plus clair maintenant. PS: il y a également FULL OUTER JOIN. Pensez à une jointure à gauche et une jointure à droite combinées - s'il y avait des livres sans auteur, ils seraient également affichés lors de l'utilisation d'une jointure externe complète.

+0

J'adore ça. Il ne fait que peindre l'image si clairement. –