Quando utilizzare un join esterno sinistro?

Non capisco il concetto di un join esterno sinistro, un join esterno giusto, o perché abbiamo bisogno di usare un join! La domanda con cui sto lottando e il tavolo su cui sto lavorando è qui: Link

Domanda 3 (b)

Costruisci un comando in SQL per risolvere la seguente query, spiegando perché ha dovuto utilizzare il metodo di join (esterno). [5 punti] “Trova il nome di ogni membro dello staff e del suo / a suo / a sposo / a, se ce ne sono”

Domanda 3 (c) –

Costruisci un comando in SQL per risolvere la seguente query, usando (i) il metodo join e (ii) il metodo subquery. [10 punti] “Trova il nome dell’id quadro di ogni membro dello staff che ha lavorato più di 20 ore nel progetto di computerizzazione”

Qualcuno può spiegarmi questo semplicemente?

I join vengono utilizzati per combinare due tabelle correlate.

Nel tuo esempio, puoi combinare la tabella Employee e la tabella Department, in questo modo:

SELECT FNAME, LNAME, DNAME FROM EMPLOYEE INNER JOIN DEPARTMENT ON EMPLOYEE.DNO=DEPARTMENT.DNUMBER 

Ciò comporterebbe un recordset come:

 FNAME LNAME DNAME ----- ----- ----- John Smith Research John Doe Administration 

Ho usato un INNER JOIN sopra. INNER JOIN combinano due tabelle in modo che vengano visualizzati solo i record con le corrispondenze in entrambe le tabelle, e in questo caso vengono uniti , sul numero del reparto (campo DNO in Dipendente, DNUMBER nella tabella Dipartimento).

LEFT JOIN consente di combinare due tabelle quando si hanno record nella prima tabella ma potrebbero non avere record nella seconda tabella. Ad esempio, supponiamo che desideri un elenco di tutti i dipendenti, più eventuali dipendenti:

 SELECT EMPLOYEE.FNAME as employee_first, EMPLOYEE.LNAME as employee_last, DEPENDENT.FNAME as dependent_last, DEPENDENT.LNAME as dependent_last FROM EMPLOYEE INNER JOIN DEPENDENT ON EMPLOYEE.SSN=DEPENDENT.ESSN 

Il problema qui è che se un dipendente non ha un dipendente, quindi il suo record non verrà visualizzato affatto – perché non c’è nessun record corrispondente nella tabella DEPENDENT.

Quindi, si utilizza un join di sinistra che mantiene tutti i dati sulla “sinistra” (cioè la prima tabella) e inserisce tutti i dati corrispondenti sulla “destra” (la seconda tabella):

 SELECT EMPLOYEE.FNAME as employee_first, EMPLOYEE.LNAME as employee_last, DEPENDENT.FNAME as dependent_first, DEPENDENT.LNAME as dependent_last FROM EMPLOYEE LEFT JOIN DEPENDENT ON EMPLOYEE.SSN=DEPENDENT.ESSN 

Ora otteniamo tutti i record dei dipendenti. Se non ci sono dipendenti corrispondenti per un determinato dipendente, i campi dependent_first e dependent_last saranno nulli.

esempio (non usando le tabelle di esempio 🙂

Ho una compagnia di autonoleggio.

 Table car id: integer primary key autoincrement licence_plate: varchar purchase_date: date Table customer id: integer primary key autoincrement name: varchar Table rental id: integer primary key autoincrement car_id: integer bike_id: integer customer_id: integer rental_date: date 

Semplice, giusto? Ho 10 dischi per le auto perché ho 10 macchine.
Gestisco questo business da 10 anni, quindi ho 1000 clienti.
E affittano le macchine circa 20 volte l’anno per auto = 10 anni x 10 auto x 20 = 2000 noleggi.

Se immagazzino tutto in un grande tavolo, ho 10x1000x2000 = 20 milioni di record.
Se lo memorizzo in 3 tavoli ho 10 + 1000 + 2000 = 3010 record.
Sono 3 ordini di grandezza, ecco perché uso 3 tavoli.

Ma poiché uso 3 tabelle (per risparmiare spazio e tempo) devo usare i join per ottenere di nuovo i dati
(almeno se voglio nomi e targhe anziché numeri) .

Usando join interni

Tutti i noleggi per il cliente 345?

 SELECT * FROM customer INNER JOIN rental on (rental.customer_id = customer.id) INNER JOIN car on (car.id = rental.car_id) WHERE customer.id = 345. 

È INNER JOIN , perché vogliamo solo conoscere le auto linked to noleggi linked to clienti effettivamente accaduti.

Si noti che abbiamo anche un bike_id, che collega al tavolo della bici, che è molto simile al tavolo dell’auto ma diverso. Come potremmo ottenere tutti i noleggi bici + auto per il cliente 345.
Possiamo provare e fare questo

 SELECT * FROM customer INNER JOIN rental on (rental.customer_id = customer.id) INNER JOIN car on (car.id = rental.car_id) INNER JOIN bike on (bike.id = rental.bike_id) WHERE customer.id = 345. 

Ma questo darà un set vuoto !!
Questo perché un noleggio può essere un bike_rental o un car_rental, ma non entrambi allo stesso tempo.
E la query di inner join non funzionante darà solo risultati per tutti i noleggi in cui noleggiamo sia una bici che un’auto nella stessa transazione.
Stiamo cercando di ottenere e boolean OR relazione utilizzando un booleano AND join.

Usando join esterni

Per risolvere questo abbiamo bisogno di un outer join .

Risolviamolo con left join

 SELECT * FROM customer INNER JOIN rental on (rental.customer_id = customer.id) <<-- link always LEFT JOIN car on (car.id = rental.car_id) <<-- link half of the time LEFT JOIN bike on (bike.id = rental.bike_id) <<-- link (other) 0.5 of the time. WHERE customer.id = 345. 

Guardate in questo modo. Un inner join è un AND e un left join è un OR come nel seguente pseudocodice:

 if a=1 AND a=2 then {this is always false, no result} if a=1 OR a=2 then {this might be true or not} 

Se crei le tabelle ed esegui la query puoi vedere il risultato.

sulla terminologia

Un left join è uguale a un left outer join . Un join senza prefissi aggiuntivi è un inner join C'è anche un full outer join . In 25 anni di programmazione non l'ho mai usato.

Perché Left join

Beh, ci sono due tavoli coinvolti. Nell'esempio che abbiamo collegato
cliente al noleggio con un inner join , in un join interno entrambi i tavoli devono essere collegati in modo che non vi siano differenze tra il lato left:customer tabella left:customer e right:rental tabella right:rental .

Il link successivo era un raccordo a left join tra left:rental e right:car . Sul lato sinistro tutte le righe devono essere collegate e il lato destro non è necessario. Questo è il motivo per cui è un left join

Si utilizzano i join esterni quando sono necessari tutti i risultati da una delle tabelle di join, indipendentemente dal fatto che nell’altra tabella vi sia o meno una riga corrispondente.

Penso che la domanda 3 (b) sia confusa perché la sua intera premessa è sbagliata: non devi usare un join esterno per “risolvere la query”, per esempio considera questo (seguire lo stile della syntax nel saggio d’esame è probabilmente saggio):

 SELECT FNAME, LNAME, DEPENDENT_NAME FROM EMPLOYEE, DEPENDENT WHERE SSN = ESSN AND RELATIONSHIP = 'SPOUSE' UNION SELECT FNAME, LNAME, NULL FROM EMPLOYEE EXCEPT SELECT FNAME, LNAME, DEPENDENT_NAME FROM EMPLOYEE, DEPENDENT WHERE SSN = ESSN AND RELATIONSHIP = 'SPOUSE' 

In generale: unisci le giunture due tabelle insieme. Usa INNER JOIN quando vuoi “cercare”, come cercare informazioni dettagliate su qualsiasi colonna specifica. Usa OUTER JOIN quando vuoi “dimostrare”, come elencare tutte le informazioni delle 2 tabelle.