Mysql
 sql >> Database >  >> RDS >> Mysql

Prestazioni MySQL:Introduzione ai JOIN in SQL

In questo articolo, impareremo le basi dell'unione di tabelle in SQL. Impareremo le JOIN Left, Right, Inner ed Outer e forniremo esempi su come usarle.

I dati in un RDBMS (Relational Database Management System) sono raggruppati in tabelle. Queste tabelle hanno una definizione rigida del tipo di dati che possono essere archiviati in esse. Per collegare diverse tabelle, e quindi diversi tipi di dati che possono essere correlati tra loro, utilizzeremo la clausola JOIN.

Tipi di JOIN

Esistono quattro tipi fondamentali di JOIN:INNER, OUTER, LEFT e RIGHT. Quando si collegano due tabelle, ciascuna restituirà un sottoinsieme diverso delle tabelle corrispondenti in base alla condizione nella clausola ON.

  • LeFT e RIGHT JOIN svolgono un'attività simile. Entrambi restituiscono l'intera tabella con le informazioni relative alla seconda tabella.
  • Gli INNER e gli OUTER JOIN svolgono compiti molto diversi. INNER JOINs produce un risultato molto limitato, mentre OUTER restituisce un set di dati completo.
Nota:Al momento della stesura di questo articolo, MariaDB e MySQL non supportano OUTER JOIN. Forniremo tuttavia un esempio di un modo per produrre questo output in un modo diverso.

In questo esempio, stiamo usando l'esempio di un reparto vendite per questo tutorial, utilizzando tre tabelle:venditori, ordini e clienti.

La tabella dei venditori avrà tre colonne:id, nome e tasso di commissione.

Successivamente, la tabella degli ordini conterrà quattro colonne:l'ID ordine, il costo totale dell'ordine, il cliente e, se disponibile, il venditore.

La tabella cliente conterrà due colonne:id e informazioni di contatto di base.

Quindi, ora abbiamo più tabelle di informazioni utili a persone diverse in modi diversi. Utilizzando queste tre tabelle (venditori, ordini e cliente), forniremo esempi di come ciascuna delle JOIN potrebbe essere utile.

UNISCI A SINISTRA

Probabilmente il tipo più comunemente usato di JOIN è un LEFT JOIN. Se pensi che le due tabelle siano unite, quella menzionata nella clausola FROM è sulla sinistra. Quello menzionato nella clausola JOIN è a destra. In un LEFT JOIN, ogni riga della tabella LEFT (o FROM) viene restituita nel risultato ed è collegata alle righe corrispondenti della tabella RIGHT (o JOIN) che corrisponde alla clausola ON.

Tieni presente che alcune righe a SINISTRA potrebbero non avere dati corrispondenti a DESTRA. In tal caso, i campi che sarebbero stati compilati dalla tabella RIGHT nel risultato verranno popolati da un valore NULL.

Inoltre, se più righe nella tabella DESTRA corrispondono alle righe della tabella SINISTRA, verranno incluse più righe nel set di risultati. Un diagramma di Venn mostra come apparirà un LEFT JOIN:

Il Direttore Marketing ti chiede un resoconto su tutti gli ordini suddivisi per cliente. Puoi usare un LEFT JOIN per questo:

SELECT *
FROM orders
LEFT JOIN customer
ON orders.customer_id = customer.id;

Questa query richiede tutti i dati nella tabella "ordini" collegati alle righe nella tabella "cliente", dove l'id del cliente è uguale a customer_id nell'ordine. Il risultato sarebbe simile a questo:

Si noti che per il cliente Widgets LLC ci sono tre voci perché avevano tre ordini. Jolly Inc. ha effettuato due ordini e Acme Inc. ne ha effettuato uno. Cheapo non compare in questo elenco perché non sono stati effettuati ordini.

ACCEDI A DESTRA

Il RIGHT JOIN è molto simile al LEFT JOIN, tranne per il fatto che restituisce ogni riga dalla tabella RIGHT (JOIN) e solo le righe corrispondenti dalla tabella LEFT (FROM). Anche in questo caso, se non ci sono dati nella tabella LEFT, le colonne verranno popolate con valori NULL.

Se sono presenti più righe nella tabella LEFT, ci saranno più righe nel set di risultati. Il suo diagramma di Venn sarebbe simile a questo:

Se la direzione vuole un rapporto con OGNI cliente; anche se non hanno effettuato un ordine, potremmo utilizzare un RIGHT JOIN.

SELECT *
FROM orders
RIGHT JOIN customer
ON orders.customer_id = customer.id;

Anche in questo caso iniziamo con la tabella "ordini" e uniamola alla tabella del cliente. Poiché abbiamo utilizzato un RIGHT JOIN, otterremo almeno una riga per ogni voce nella tabella RIGHT (JOIN), cliente. Quando c'è una corrispondenza tra customer.id e orders.customer_id, le informazioni vengono compilate.  I risultati includono Cheapo Co con valori NULL nelle colonne dell'ordine:

UNIONE INTERNA

Un INNER JOIN restituisce solo le righe di ciascuna colonna che corrispondono alla clausola ON. Se non c'è corrispondenza a DESTRA le righe a SINISTRA vengono escluse e viceversa. Il diagramma di Venn per un INNER JOIN è simile al seguente:

È il giorno di paga e il reparto paghe deve sapere quanta commissione pagare. Per questo, dovranno conoscere gli ordini che sono stati effettuati tramite ciascun venditore. Nota che non tutti gli ordini sono passati tramite un venditore, quindi non ci interessano quelli. Per questo possiamo usare un INNER JOIN:

SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
INNER JOIN salespeople
ON orders.salesperson_id = salespeople.id;

Ancora una volta iniziamo con la tabella degli ordini. Questa volta ci uniamo al tavolo dei venditori. Se è presente una voce nella tabella degli ordini che corrisponde a una voce nella tabella dei venditori, la riga verrà inclusa. Invece di popolare le righe non corrispondenti con valori NULL, quelle righe vengono ignorate nei risultati.

Si prega di notare che stiamo dicendo al database non solo di restituire l'importo della vendita e il tasso di commissione, ma anche la commissione calcolata. I risultati sarebbero simili a questo:

UNIONE ESTERNA

Un OUTER JOIN restituisce tutto indipendentemente dalla presenza di una corrispondenza. Se dovessi combinare i risultati di un LEFT e RIGHT JOIN otterresti un OUTER JOIN. Il diagramma di Venn per un OUTER JOIN è simile al seguente:

Ora, è la fine del mese e il responsabile delle vendite vuole conoscere TUTTE le vendite e tutte le commissioni che sono state pagate. Per questo useremo un OUTER JOIN:

SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
FULL OUTER JOIN salespeople
ON orders.salesperson_id = salespeople.id;

Come il resoconto sulle retribuzioni, iniziamo con gli ordini e UNISCITI ai venditori. La differenza è che con un OUTER JOIN otterrai risultati da entrambe le tabelle LEFT e RIGHT con NULL compilato dove non c'è una corrispondenza corrispondente. I risultati si presentano così:

Ora, ricorda che abbiamo detto che MariaDB e MySQL non supportano OUTER JOIN. Abbiamo anche detto che se aggiungi un LEFT JOIN a un RIGHT JOIN avresti un OUTER JOIN. Il trucco in questi due sistemi è fare proprio questo. Lo realizziamo con la clausola UNION. Aggiunge i risultati di una query a un'altra:

SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
UNION
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
RIGHT JOIN salespeople
ON orders.salesperson_id = salespeople.id;

I risultati sarebbero simili a questo:

MULTIPLE JOIN

JOIN permette anche di collegare più di due tavoli. Se vogliamo un rapporto completo sulle vendite con informazioni su clienti e venditori, alla fine facciamo semplicemente un altro JOIN.

SELECT *
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
LEFT JOIN customer
ON customer.id = orders.customer_id;

In questo esempio, iniziamo con la tabella degli ordini e la colleghiamo alla tabella dei venditori proprio come facevamo prima. Il passaggio successivo è UNIRE il tavolo al tavolo del cliente. Questo riempirà tutte le informazioni che sono collegabili alla tabella degli ordini.

Questo articolo è una breve introduzione e non intende essere una discussione esauriente su come JOIN può essere utilizzato in SQL.

Fai clic qui sotto per utilizzare questo comodo coupon oggi!

Liquid Web ha alcuni dei server di database più potenti del settore. Questi server possono essere utilizzati per gestire la più piccola attività domestica fino ai più grandi cluster multi-database per le aziende di livello enterprise.

Chiamaci al numero 800.580.4985 o apri una chat o un ticket con noi per parlare con uno dei nostri consulenti esperti in soluzioni o hosting per scoprire come sfruttare queste tecniche oggi!

Navigazione serie<