Domanda

Anche come fare LEFT JOIN, RIGHT JOIN E FULL JOIN adattarsi?

È stato utile?

Soluzione

Supponendo che ti stai unendo a colonne senza duplicati, che è un caso molto comune:

  • Un inner join di A e B dà il risultato di A interseca B, cioèla parte interna di a diagramma di Venn intersezione.

  • Un'unione esterna di A e B fornisce i risultati di A unione B, ovverole parti esterne di un'unione del diagramma di Venn.

Esempi

Supponiamo di avere due tabelle, con una singola colonna ciascuna, e i dati come segue:

A    B
-    -
1    3
2    4
3    5
4    6

Si noti che (1,2) sono esclusivi di A, (3,4) sono comuni e (5,6) sono esclusivi di B.

Unione interna

Un inner join che utilizza una delle query equivalenti fornisce l'intersezione delle due tabelle, ovverole due file che hanno in comune.

select * from a INNER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b;

a | b
--+--
3 | 3
4 | 4

Unione esterna sinistra

Un'unione esterna sinistra fornirà tutte le righe in A, più eventuali righe comuni in B.

select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b(+);

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4

Unione esterna destra

Un'unione esterna destra fornirà tutte le righe in B, più eventuali righe comuni in A.

select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a(+) = b.b;

a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6

Unione esterna completa

Un full external join ti darà l'unione di A e B, cioètutte le righe in A e tutte le righe in B.Se qualcosa in A non ha un dato corrispondente in B, allora la porzione B è nulla e viceversa.

select * from a FULL OUTER JOIN b on a.a = b.b;

 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5

Altri suggerimenti

I diagrammi di Venn non fanno proprio al caso mio.

Non mostrano alcuna distinzione tra un cross join e un inner join, ad esempio, o più in generale mostrano alcuna distinzione tra diversi tipi di predicato di join né forniscono un quadro per ragionare su come funzioneranno.

Non esiste alcun sostituto per comprendere l'elaborazione logica ed è comunque relativamente semplice da comprendere.

  1. Immagina un cross join.
  2. Valutare il on clausola contro tutte le righe del passaggio 1 mantenendo quelle in cui viene valutato il predicato true
  3. (Solo per i join esterni) aggiungi nuovamente tutte le righe esterne perse nel passaggio 2.

(NB:In pratica l'ottimizzatore della query può trovare modi più efficienti per eseguire la query rispetto alla descrizione puramente logica di cui sopra, ma il risultato finale deve essere lo stesso)

Inizierò con una versione animata di a unione esterna completa.Segue ulteriore spiegazione.

enter image description here


Spiegazione

Tabelle di origine

enter link description here

Per prima cosa inizia con a CROSS JOIN (AKA prodotto cartesiano).Questo non ha un ON clausola e restituisce semplicemente ogni combinazione di righe delle due tabelle.

SELEZIONA A.Colore, B.Colore DA UN UNIONE INCROCIATO B

enter link description here

I join interni ed esterni hanno un predicato della clausola "ON".

  • Unione interna. Valuta la condizione nella clausola "ON" per tutte le righe nel risultato del cross join.Se vero restituisce la riga unita.Altrimenti scartatelo.
  • Unione esterna sinistra. Come l'inner join, quindi per qualsiasi riga nella tabella di sinistra che non corrispondeva a nulla, restituiscili con valori NULL per le colonne della tabella di destra.
  • Giunzione esterna destra. Come l'inner join, quindi per qualsiasi riga nella tabella di destra che non corrispondeva a nulla, restituiscili con valori NULL per le colonne della tabella di sinistra.
  • Join esterno completo. Come per l'unione interna, quindi preserva le righe sinistre non corrispondenti come nell'unione esterna sinistra e le righe non corrispondenti a destra come per l'unione esterna destra.

Qualche esempio

SELEZIONA A.Colore, B.Colore DA A INTERNO UNISCI B SU A.Colore = B.Colore

Quanto sopra è il classico equi join.

Inner Join

Versione animata

enter image description here

SELEZIONA A.Colore, B.Colore DA A INTERNO UNISCI B SU A.Colore NON IN ('Verde','Blu')

La condizione di inner join non deve necessariamente essere una condizione di uguaglianza e non deve fare riferimento a colonne di entrambe (o addirittura di nessuna delle due) tabelle.Valutare A.Colour NOT IN ('Green','Blue') su ogni riga del cross join ritorna.

inner 2

SELEZIONA A.Colore, B.Colore DA A INTERNO UNISCI B SU 1 =1

La condizione di unione risulta vera per tutte le righe nel risultato del cross join, quindi è esattamente uguale a un cross join.Non ripeterò nuovamente l'immagine delle 16 righe.

SELEZIONA A.Colore, B.Colore DA A SINISTRA ESTERNA UNISCI B SU A.Colore = B.Colore

Gli Outer Join vengono valutati logicamente allo stesso modo degli inner join, tranne per il fatto che se una riga della tabella di sinistra (per un left join) non si unisce ad alcuna riga della tabella di destra viene preservata nel risultato con NULL valori per le colonne di destra.

LOJ

SELEZIONA A.Colore, B.Colore DA A SINISTRA ESTERNO UNISCI B SU A.Colore = B.Colore DOVE B.Colore È NULL

Ciò limita semplicemente il risultato precedente a restituire solo le righe dove B.Colour IS NULL.In questo caso particolare queste saranno le righe che sono state preservate poiché non avevano corrispondenze nella tabella a destra e la query restituisce la singola riga rossa non corrispondente nella tabella B.Questo è noto come anti semi join.

È importante selezionare una colonna per IS NULL test che non è nullable o per il quale la condizione di join garantisce che any NULL verranno esclusi affinché questo modello funzioni correttamente ed eviti di riportare semplicemente le righe che hanno un file NULL valore per quella colonna oltre alle righe non corrispondenti.

loj is null

SELEZIONA A.Colore, B.Colore DA UN ESTERNO DESTRA UNISCI B SU A.Colore = B.Colore

I join esterni destri agiscono in modo simile ai join esterni sinistri, tranne per il fatto che preservano le righe non corrispondenti dalla tabella di destra e estendono nulle le colonne di sinistra.

ROJ

SELEZIONA A.Colore, B.Colore DA UN ESTERNO COMPLETO UNISCI B SU A.Colore = B.Colore

I join esterni completi combinano il comportamento dei join sinistro e destro e preservano le righe non corrispondenti delle tabelle di sinistra e di destra.

FOJ

SELEZIONA A.Colore, B.Colore DA UN ESTERNO COMPLETO UNISCI B SU 1 = 0

Nessuna riga nel cross join corrisponde a 1=0 predicato.Tutte le righe di entrambi i lati vengono conservate utilizzando le normali regole di unione esterna con NULL nelle colonne della tabella sull'altro lato.

FOJ 2

SELECT COALESCE(A.Colore, B.Colore) AS Colore DA A COMPLETO ESTERNO JOIN B ON 1 = 0

Con una piccola modifica alla query precedente si potrebbe simulare a UNION ALL delle due tabelle.

UNION ALL

SELEZIONA A.Colore, B.Colore DA A SINISTRA ESTERNO UNISCI B SU A.Colore = B.Colore DOVE B.Colore = 'Verde'

Si noti che il WHERE La clausola (se presente) viene eseguita logicamente dopo il join.Un errore comune consiste nell'eseguire un left external join e quindi includere una clausola WHERE con una condizione sulla tabella di destra che finisce per escludere le righe non corrispondenti.Quanto sopra finisce per eseguire l'outer join...

LOJ

...E poi corre la clausola "Where". NULL= 'Green' non restituisce true, quindi la riga preservata dal join esterno finisce per essere scartata (insieme a quella blu) riconvertendo di fatto il join in uno interno.

LOJtoInner

Se l'intenzione fosse quella di includere solo le righe da B dove Colore è Verde e tutte le righe da A indipendentemente dalla sintassi corretta sarebbe

SELEZIONA A.Colore, B.Colore DA A SINISTRA ESTERNO UNISCI B SU A.Colore = B.Colore E B.Colore = 'Verde'

enter image description here

SQL violino

Vedi questi esempi eseguire dal vivo su SQLFiddle.com.

Si unisce vengono utilizzati per combinare i dati di due tabelle, ottenendo come risultato una nuova tabella temporanea.I join vengono eseguiti in base a qualcosa chiamato predicato, che specifica la condizione da utilizzare per eseguire un join.La differenza tra un inner join e un external join è che un inner join restituirà solo le righe che corrispondono effettivamente in base al predicato di join.Consideriamo la tabella Dipendenti e Ubicazione:

enter image description here

Unione interna: -L'unione interna crea una nuova tabella dei risultati combinando i valori delle colonne di due tabelle (Dipendente E Posizione) in base al predicato di join.La query confronta ogni riga di Dipendente con ogni riga di Posizione per trovare tutte le coppie di righe che soddisfano il predicato di join.Quando il predicato di join viene soddisfatto facendo corrispondere valori non NULL, i valori delle colonne per ciascuna coppia di righe corrispondenti Dipendente E Posizione vengono combinati in una riga di risultati.Ecco come apparirà l'SQL per un inner join:

select  * from employee inner join location on employee.empID = location.empID
OR
select  * from employee, location where employee.empID = location.empID

Ora, ecco come sarebbe il risultato dell'esecuzione di quell'SQL:enter image description here enter image description here

Unione esterna: -Un'unione esterna non richiede che ogni record nelle due tabelle unite abbia un record corrispondente.La tabella unita conserva ogni record, anche se non esiste nessun altro record corrispondente.I join esterni si suddividono ulteriormente in join esterni sinistri e join esterni destri, a seconda di quale riga della tabella viene mantenuta (sinistra o destra).

Unione esterna sinistra: -Il risultato di un left external join (o semplicemente left join) per le tabelle Dipendente E Posizione contiene sempre tutti i record della tabella "sinistra" (Dipendente), anche se la condizione di unione non trova alcun record corrispondente nella tabella "giusta" (Posizione).Ecco come apparirebbe l'SQL per un left external join, utilizzando le tabelle sopra:

select  * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional

Ora, ecco come sarebbe il risultato dell'esecuzione di questo SQL:enter image description here enter image description here

Giunzione esterna destra: -Un'unione esterna destra (o unione destra) somiglia molto a un'unione esterna sinistra, tranne per il trattamento invertito delle tabelle.Ogni riga della tabella "giusta" (Posizione) apparirà nella tabella unita almeno una volta.Se nessuna riga corrispondente dalla tabella "sinistra" (Dipendente) esiste, NULL apparirà nelle colonne da Dipendente per quei record che non hanno corrispondenza Posizione.Ecco come appare l'SQL:

select * from employee right outer join location  on employee.empID = location.empID;
//Use of outer keyword is optional

Utilizzando le tabelle sopra, possiamo mostrare come apparirebbe il set di risultati di un right external join:

enter image description hereenter image description here

Join esterni completi: -Full Outer Join o Full Join consiste nel conservare le informazioni non corrispondenti includendo righe non corrispondenti nei risultati di un join, utilizzare un full external join.Include tutte le righe di entrambe le tabelle, indipendentemente dal fatto che l'altra tabella abbia o meno un valore corrispondente.enter image description here

Fonte immagine

Manuale di riferimento di MySQL 8.0 - Sintassi Join

Operazioni di Oracle Join

Unione interna

Recupera solo le righe corrispondenti, ovvero A intersect B.

Enter image description here

SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Unione esterna sinistra

Seleziona tutti i record dalla prima tabella e tutti i record nella seconda tabella che corrispondono ai tasti uniti.

Enter image description here

SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Join esterno completo

Seleziona tutti i record dalla seconda tabella e tutti i record nella prima tabella che corrispondono ai tasti uniti.

Enter image description here

SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Riferimenti

In parole semplici:

UN unione interna recuperare solo le righe corrispondenti.

Mentre un unione esterna recupera le righe corrispondenti da una tabella e tutte le righe nell'altra tabella .... il risultato dipende da quale stai utilizzando:

  • Sinistra:Righe corrispondenti nella tabella di destra e tutte le righe nella tabella di sinistra

  • Giusto:Righe corrispondenti nella tabella di sinistra e tutte le righe nella tabella di destra oppure

  • Pieno:Tutte le righe in tutte le tabelle.Non importa se c'è una corrispondenza o meno

Un inner join mostra le righe solo se è presente un record corrispondente sull'altro lato (destro) del join.

Un join esterno (a sinistra) mostra le righe per ogni record sul lato sinistro, anche se non ci sono righe corrispondenti sull'altro lato (a destra) del join.Se non esiste una riga corrispondente, le colonne per l'altro lato (a destra) mostrerebbero NULL.

I join interni richiedono che nella tabella unita sia presente un record con un ID correlato.

I join esterni restituiranno i record per il lato sinistro anche se non esiste nulla per il lato destro.

Ad esempio, hai una tabella Orders e una OrderDetails.Sono collegati da un "OrderID".

Ordini

  • ID ordine
  • Nome del cliente

Dettagli ordine

  • ID dettaglio ordine
  • ID ordine
  • Nome del prodotto
  • Qtà
  • Prezzo

La richiesta

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
 INNER JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

restituirà solo gli ordini che hanno qualcosa anche nella tabella OrderDetails.

Se lo cambi in OUTER LEFT JOIN

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
  LEFT JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

quindi restituirà i record dalla tabella Orders anche se non hanno record OrderDetails.

Puoi usarlo per trovare ordini che non hanno OrderDetails che indicano un possibile ordine orfano aggiungendo una clausola where come WHERE OrderDetails.OrderID IS NULL.

In parole semplici:

Unione interna -> Prendi SOLO record comuni dalle tabelle padre e figlio DOVE la chiave primaria della tabella genitore corrisponde alla chiave esterna nella tabella figlio.

Unisciti a sinistra ->

pseudocodice

1.Take All records from left Table
2.for(each record in right table,) {
    if(Records from left & right table matching on primary & foreign key){
       use their values as it is as result of join at the right side for 2nd table.
    } else {
       put value NULL values in that particular record as result of join at the right side for 2nd table.
    }
  }

Partecipa correttamente :Esattamente l'opposto dell'unione a sinistra.Inserisci il nome della tabella in LEFT JOIN sul lato destro in Right Join, otterrai lo stesso output di LEFT JOIN.

Unione esterna :Mostra tutti i record in entrambe le tabelle No matter what.Se i record nella tabella di sinistra non corrispondono alla tabella di destra in base alla chiave primaria esterna, utilizzare il valore NULL come risultato dell'unione.

Esempio :

Example

Supponiamo ora per 2 tabelle

1.employees , 2.phone_numbers_employees

employees : id , name 

phone_numbers_employees : id , phone_num , emp_id   

Qui, la tabella dei dipendenti è la tabella principale, phone_numbers_employees è la tabella figlia (contiene emp_id come chiave esterna che si connette employee.id quindi è la tabella figlio.)

Join interni

Prendi i record di 2 tabelle SOLO SE la chiave primaria della tabella dei dipendenti (il suo ID) corrisponde alla chiave esterna della tabella secondaria phone_numbers_employees (emp_id).

Quindi la query sarebbe:

SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

Qui prendi solo le righe corrispondenti su chiave primaria = chiave esterna come spiegato sopra. Qui le righe non corrispondenti su chiave primaria = chiave esterna vengono saltate come risultato dell'unione.

Si unisce a sinistra :

Il left join conserva tutte le righe della tabella di sinistra, indipendentemente dal fatto che esista una riga corrispondente nella tabella di destra.

SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

Unioni esterne :

SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

Diagrammaticamente appare così:

Diagram

Usate INNER JOIN per restituire tutte le righe di entrambe le tabelle in cui è presente una corrispondenza.cioè.Nella tabella risultante tutte le righe e le colonne avranno valori.

In OUTER JOIN la tabella risultante potrebbe avere colonne vuote.L'unione esterna può essere una delle due LEFT O RIGHT.

LEFT OUTER JOIN restituisce tutte le righe della prima tabella, anche se non ci sono corrispondenze nella seconda tabella.

RIGHT OUTER JOIN restituisce tutte le righe della seconda tabella, anche se non ci sono corrispondenze nella prima tabella.

This is a good explanation for joins

Questa è una buona spiegazione schematica per tutti i tipi di join

fonte: http://ssiddique.info/understanding-sql-joins-in-easy-way.html

INNER JOIN richiede che ci sia almeno una corrispondenza nel confronto delle due tabelle.Ad esempio, tabella A e tabella B che implica A ٨ B (A intersezione B).

LEFT OUTER JOIN E LEFT JOIN sono gli stessi.Fornisce tutti i record corrispondenti in entrambe le tabelle e tutte le possibilità della tabella di sinistra.

Allo stesso modo, RIGHT OUTER JOIN E RIGHT JOIN sono gli stessi.Fornisce tutti i record corrispondenti in entrambe le tabelle e tutte le possibilità della tabella giusta.

FULL JOIN è la combinazione di LEFT OUTER JOIN E RIGHT OUTER JOIN senza duplicazioni.

La risposta è nel significato di ognuno, quindi nei risultati.

Nota :
In SQLite Non c'è RIGHT OUTER JOIN O FULL OUTER JOIN.
E anche dentro MySQL Non c'è FULL OUTER JOIN.

La mia risposta si basa su quanto sopra Nota.

Quando hai due tabelle come queste:

--[table1]               --[table2]
id | name                id | name
---+-------              ---+-------
1  | a1                  1  | a2
2  | b1                  3  | b2

CROSS JOIN / OUTER JOIN:
Puoi avere tutti quei dati di tabelle con CROSS JOIN o semplicemente con , come questo:

SELECT * FROM table1, table2
--[OR]
SELECT * FROM table1 CROSS JOIN table2

--[Results:]
id | name | id | name 
---+------+----+------
1  | a1   | 1  | a2
1  | a1   | 3  | b2
2  | b1   | 1  | a2
2  | b1   | 3  | b2

JOIN INTERNO:
Quando vuoi aggiungere un filtro ai risultati sopra in base a una relazione come table1.id = table2.id Puoi usare INNER JOIN:

SELECT * FROM table1, table2 WHERE table1.id = table2.id
--[OR]
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id

--[Results:]
id | name | id | name 
---+------+----+------
1  | a1   | 1  | a2

SINISTRA [ESTERNA] UNISCITI:
Quando vuoi avere tutte le righe di una delle tabelle nel risultato sopra, con la stessa relazione, puoi usare LEFT JOIN:
(Per ISCRIVITI GIUSTO basta cambiare posto ai tavoli)

SELECT * FROM table1, table2 WHERE table1.id = table2.id 
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
--[OR]
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id

--[Results:]
id | name | id   | name 
---+------+------+------
1  | a1   | 1    | a2
2  | b1   | Null | Null

JOIN ESTERNO COMPLETO:
Quando vuoi avere anche tutte le righe dell'altra tabella nei risultati puoi usare FULL OUTER JOIN:

SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
UNION ALL
SELECT Null, Null, * FROM table2 WHERE Not table2.id In (SELECT id FROM table1)
--[OR] (recommended for SQLite)
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION ALL
SELECT * FROM table2 LEFT JOIN table1 ON table2.id = table1.id
WHERE table1.id IS NULL
--[OR]
SELECT * FROM table1 FULL OUTER JOIN table2 On table1.id = table2.id

--[Results:]
id   | name | id   | name 
-----+------+------+------
1    | a1   | 1    | a2
2    | b1   | Null | Null
Null | Null | 3    | b2

Bene, in base alle tue necessità scegli quello che soddisfa le tue esigenze ;).

Unione interna.

Un join unisce le righe di due tabelle.UN unione interna tenta di abbinare le due tabelle in base ai criteri specificati nella query e restituisce solo le righe corrispondenti.Se una riga della prima tabella nel join corrisponde a due righe della seconda tabella, nei risultati verranno restituite due righe.Se c'è una riga nella prima tabella che non corrisponde a una riga nella seconda, non viene restituita;allo stesso modo, se c'è una riga nella seconda tabella che non corrisponde a una riga nella prima, non viene restituita.

Unione esterna.

UN a sinistra unisciti tenta di trovare la corrispondenza tra le righe della prima tabella e le righe della seconda tabella.Se non riesce a trovare una corrispondenza, restituirà le colonne della prima tabella e lascerà vuote (null) le colonne della seconda tabella.

Non vedo molti dettagli sulle prestazioni e sull'ottimizzatore nelle altre risposte.

A volte è bene sapere solo questo INNER JOIN è associativo, il che significa che l'ottimizzatore ha più opzioni per giocarci.Può riordinare l'ordine di unione per renderlo più veloce mantenendo lo stesso risultato.L'ottimizzatore può utilizzare la maggior parte delle modalità di unione.

In genere è buona pratica provare ad utilizzarlo INNER JOIN invece dei diversi tipi di join.(Ovviamente se è possibile considerando il set di risultati atteso.)

Ci sono un paio di buoni esempi e spiegazioni qui su questo strano comportamento associativo:

L'algoritmo preciso per INNER JOIN, LEFT/RIGHT OUTER JOIN sono i seguenti:

  1. Prendi ogni riga dalla prima tabella: a
  2. Considera tutte le righe della seconda tabella accanto: (a, b[i])
  3. Valutare il ON ... clausola contro ciascuna coppia: ON( a, b[i] ) = true/false?
    • Quando la condizione valuta a true, restituisce la riga combinata (a, b[i]).
    • Quando raggiungi la fine della seconda tabella senza alcuna corrispondenza, e questo è un Outer Join poi restituisci a (virtuale) accoppiare utilizzando Null per tutte le colonne dell'altra tabella: (a, Null) per l'unione esterna SINISTRA o (Null, b) per l'unione esterna DESTRA.Questo per garantire che tutte le righe della prima tabella esistano nei risultati finali.

Nota: la condizione specificata in ON la clausola potrebbe essere qualsiasi cosa, non è necessario utilizzarla Chiavi primarie (e non è necessario fare sempre riferimento alle Colonne di entrambe le tabelle)!Per esempio:

Inner Join vs. Left Outer Join


enter image description here

Nota: Unione sinistra = Unione esterna sinistra, Unione destra = Unione esterna destra.

Avendo criticato il tanto amato diagramma di Venn con ombreggiatura rossa, ho pensato che fosse giusto pubblicare il mio tentativo.

Sebbene la risposta di @Martin Smith sia di gran lunga la migliore di questo gruppo, mostra solo la colonna chiave di ciascuna tabella, mentre penso che idealmente dovrebbero essere mostrate anche le colonne non chiave.

Il meglio che ho potuto fare nella mezz'ora concessa, non penso ancora che dimostri adeguatamente che i valori nulli sono presenti a causa dell'assenza di valori chiave in TableB o quello OUTER JOIN è in realtà un'unione piuttosto che un join:

enter image description here

enter image description here

  • INNER JOIN unione più tipica per due o più tabelle.Restituisce la corrispondenza dei dati sia sulla tabella sulla chiave primaria che sulla relazione chiave esterna.
  • OUTER JOIN è lo stesso di INNER JOIN, ma include anche NULL dati su ResultSet.
    • LEFT JOIN = INNER JOIN + Dati senza eguali di Sinistra tavolo con Null corrispondenza sul tavolo a destra.
    • RIGHT JOIN = INNER JOIN + Dati senza eguali di Giusto tavolo con Null partita sul tavolo a sinistra.
    • FULL JOIN = INNER JOIN + Dati senza eguali su sia a destra che a sinistra tavoli con Null partite.
  • Il self join non è una parola chiave in SQL, quando una tabella fa riferimento ai dati in sé è conosciuta come self join.Utilizzando INNER JOIN E OUTER JOIN possiamo scrivere query self-join.

Per esempio:

SELECT * 
FROM   tablea a 
       INNER JOIN tableb b 
               ON a.primary_key = b.foreign_key 
       INNER JOIN tablec c 
               ON b.primary_key = c.foreign_key 

Definizioni più semplici

Unione interna:ritorna record corrispondenti da entrambi i tavoli.

Join esterno completo:Restituisce corrispondenze e record senza eguali da entrambe le tabelle con null per i record senza corrispondenza da Entrambe le tabelle.

Unione esterna sinistra:Restituisce i record con e senza corrispondenza solo dalla tabella in poi Lato sinistro.

Unione esterna destra:Restituisce i record con e senza corrispondenza solo dalla tabella in poi Lato destro.

In breve

Abbinato + Sinistra senza corrispondenza + Destra senza corrispondenza = Join esterno completo

Abbinato + Sinistra senza eguali = Unione esterna sinistra

Abbinato + Destra Senza eguali = Giunzione esterna destra

Abbinato = Unione interna

In parole povere,

1.INNER JOIN O EQUI JOIN: Restituisce il set di risultati che corrisponde solo alla condizione in entrambe le tabelle.

2.UNIONE ESTERNA: Restituisce il set di risultati di tutti i valori di entrambe le tabelle anche se esiste o meno una corrispondenza delle condizioni.

3.UNISCITI A SINISTRA: Restituisce il set di risultati di tutti i valori dalla tabella di sinistra e solo le righe che soddisfano la condizione nella tabella di destra.

4.ISCRIVITI GIUSTO: Restituisce il set di risultati di tutti i valori della tabella di destra e solo delle righe che soddisfano la condizione nella tabella di sinistra.

5.ISCRIZIONE COMPLETA: L'unione completa e l'unione esterna completa sono uguali.

1.Unione interna: Chiamato anche come Unisci.Restituisce le righe presenti solo nella tabella sinistra e nella tabella destra se c'è una corrispondenza.Altrimenti, restituisce zero record.

Esempio:

SELECT
  e1.emp_name,
  e2.emp_salary    
FROM emp1 e1
INNER JOIN emp2 e2
  ON e1.emp_id = e2.emp_id

output1

2.Join esterno completo: Chiamato anche Full Join.Ritorna tutte le righe presente sia nella tabella di sinistra che nella tabella di destra.

Esempio:

SELECT
  e1.emp_name,
  e2.emp_salary    
FROM emp1 e1
FULL OUTER JOIN emp2 e2
  ON e1.emp_id = e2.emp_id

output2

3.Unione esterna sinistra: O semplicemente chiamato Left Join.Restituisce tutte le righe presenti nella tabella di sinistra e le righe corrispondenti della tabella di destra (se presenti).

4.Unione esterna destra: Chiamato anche Right Join.Restituisce le righe corrispondenti dalla tabella di sinistra (se presente) e tutte le righe presenti nella tabella di destra.

joins

Vantaggi dei join

  1. Esegue più velocemente.
  • Unione interna - UN unione interna l'utilizzo di una delle query equivalenti fornisce l'intersezione dei due tavoli, cioè.le due file che hanno in comune.

  • Unione esterna sinistra - UN unione esterna sinistra fornirà tutte le righe in A, più eventuali righe comuni in B.

  • Unione esterna completa - UN unione esterna completa ti darà l'unione di A e B, cioèTutte le righe in A e tutte le righe in B.Se qualcosa in A non ha un dato corrispondente in B, allora la porzione B è nulla e viceversa

left join on (aka left outer join on) ritorna inner join on righe union all righe della tabella sinistra senza corrispondenza estese da valori null.

right join (on ovvero right outer join on) ritorna inner join on righe union all righe della tabella destra senza corrispondenza estese da valori null.

full join on (aka full outer join on) ritorna inner join on righeunion all righe della tabella sinistra senza corrispondenza estese da valori null union all righe della tabella destra senza corrispondenza estese da valori null.

(SQL Standard 2006 SQL/Foundation 7.7 Regole di sintassi 1, Regole generali 1 b, 3 c e d, 5 b.)

Quindi non farlo outer join finché non sai cosa sta sotto inner join è coinvolto.


Scoprire quali righe inner join ritorna.

Leggi i miei commenti ci sono molte risposte confuse e povere.

Quindi leggi i miei commenti qui sulle molte risposte confuse e povere.

La differenza tra inner join e external join è la seguente:

  1. L'inner join è un join che combina tabelle in base a tuple corrispondenti, mentre l'outer join è un join che combina tabelle basate su tuple corrispondenti e non corrispondenti.
  2. L'inner join unisce la riga corrispondente di due tabelle in cui le righe senza corrispondenza vengono omesse, mentre l'outer join unisce le righe di due tabelle e le righe senza corrispondenza si riempiono con un valore null.
  3. L'unione interna è come un'operazione di intersezione, mentre l'unione esterna è come un'operazione di unione.
  4. Il join interno è di due tipi, mentre il join esterno è di tre tipi.
  5. L'unione interna è più lenta, mentre l'unione esterna è più veloce dell'unione interna.

Considera di seguito le 2 tabelle:

EMP

empid   name    dept_id salary
1       Rob     1       100
2       Mark    1       300
3       John    2       100
4       Mary    2       300
5       Bill    3       700
6       Jose    6       400

Dipartimento

deptid  name
1       IT
2       Accounts
3       Security
4       HR
5       R&D

Unione interna:

Per lo più scritto come giusto GIUNTURA nelle query SQL.Restituisce solo i record corrispondenti tra le tabelle.

Scopri tutti i dipendenti e i nomi dei loro dipartimenti:

Select a.empid, a.name, b.name as dept_name
FROM emp a
JOIN department b
ON a.dept_id = b.deptid
;

empid   name    dept_name
1       Rob     IT
2       Mark    IT
3       John    Accounts
4       Mary    Accounts
5       Bill    Security

Come vedi sopra, Jose non viene stampato da EMP nell'output poiché è dept_id 6 non trova una corrispondenza nella tabella Dipartimento.Allo stesso modo, HR E R&D le righe non vengono stampate da Dipartimento tabella perché non hanno trovato una corrispondenza nella tabella Emp.

Quindi, INNER JOIN o semplicemente JOIN, restituisce solo le righe corrispondenti.

UNISCITI A SINISTRA:

Ciò restituisce tutti i record della tabella SINISTRA e solo i record corrispondenti della tabella DESTRA.

Select a.empid, a.name, b.name as dept_name
FROM emp a
LEFT JOIN department b
ON a.dept_id = b.deptid
;

empid   name    dept_name
1       Rob     IT
2       Mark    IT
3       John    Accounts
4       Mary    Accounts
5       Bill    Security
6       Jose    

Pertanto, se si osserva l'output precedente, tutti i record della tabella SINISTRA (Emp) vengono stampati solo con i record corrispondenti della tabella DESTRA.

HR E R&D le righe non vengono stampate da Dipartimento table perché non hanno trovato una corrispondenza nella tabella Emp su dept_id.

Pertanto, LEFT JOIN restituisce TUTTE le righe dalla tabella sinistra e solo le righe corrispondenti dalla tabella destra.

Puoi anche controllare DEMO Qui.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top