2010-12-14 11 views
5

Eventuali duplicati:
(self,left outer,right outer,full outer) join - real world examplesQual è la differenza tra SINISTRA, DESTRA, INNER e OUTER JOINs?

Ciao, caro SO comunità!

Ho lavorato con database SQL da qualche tempo, ma un aspetto mi confonde ancora molto: i join di tabelle. Capisco molto chiaramente cosa succede quando scrivo una query su più tavoli, ma quando entra in gioco un JOIN, mi sento come se non capissi niente.

Ti prego, aiutami a capire cos'è un join da tavolo e qual è la differenza tra SINISTRA, DESTRA, INTERIORE e OUTER JOINs? Cos'è un auto join?

Le sarei grato se potesse fornire un esempio del loro utilizzo in questa semplice struttura della tabella:

Tabella autori

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

Tabella libri

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

Grazie tu!

+0

Ho cercato su Google quella domanda esatta e ho trovato diversi colpi in prima pagina che illustrano le differenze. Potrebbe essere stato più veloce di chiedere qui. Ad essere onesti, però, di solito devo rinfrescarmi la memoria quando vado a fare il mio ingresso! – DarinH

+1

"Capisco molto chiaramente, cosa succede quando scrivo una query multitable, ma quando entra in gioco un JOIN, mi sento come se non capissi niente." Eh? un join è sempre in gioco durante la scrittura di query multitable, non stai usando la sintassi di join implicita sei tu (quello con le virgole tra le tabelle)? Se è così, non scrivere mai un altro pezzo di codice usando quella sintassi molto scadente e molto scadente. Se si utilizza quella sintassi scadente, non c'è da meravigliarsi se non si comprendono i join. – HLGEM

+0

HLGEM, perché è obsoleto e povero? –

risposta

3

DA UN {tipo di join} B {ON Condizione di join}

interno: mostra solo i risultati in cui la condizione di join è vero. Se non esiste una condizione vera per una riga su A, verrà rimossa dai risultati.

Sinistra: Non ha filtrare le righe da A che non hanno un corrispondente join su B

destra: Will filtrare le righe da A che non hanno un corrispondente join su B

esterno: sinistra e giuste giunzioni sono considerate giunzioni esterne dove inner è un inner join.

3

INNER JOIN:

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

si tradurrà in questo:

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 

noti che Bob non è stato mostrato - un inner join rimuove sempre elementi che non sono presenti in entrambe le fonti (considerando il join criteri nel nostro caso a.id = b.author_id.

LEFT JOIN:

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

si tradurrà in questo:

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 

Ora vengono visualizzati tutti gli autori - un LEFT JOIN (o LEFT OUTER JOIN, è lo stesso) non mancherà di tenere tutti i "sinistra" record (autori) e sostituirà i record "giusti" che non sono stati trovati con null.

Informazioni su "right joins" - è uguale a "left joins", ma con una relazione inversa. La seguente query comporterà gli stessi record come l'ultimo (si noti che i tavoli sono in un ordine inverso, per compensare l'uso del diritto join):

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

Speranza è più chiaro ora.

PS: c'è anche FULL OUTER JOIN. Pensa a un membro di sinistra e a un altro a destra combinati: se c'erano libri senza autore, verrebbero visualizzati anche quando si utilizza un join esterno completo.

+0

Love it. Dipinge semplicemente l'immagine in modo chiaro. –

Problemi correlati