Uno dei maggiori vantaggi dell'utilizzo di database relazionali come MySQL è che la sua struttura relazionale consente di archiviare e interrogare facilmente le informazioni su più tabelle.

Esploriamo come recuperare esattamente i dati desiderati da più tabelle di database e i vari join disponibili che consentono di ottenere i risultati esatti desiderati.

Inizializza database di esempio

Questo non è necessario, ma se desideri seguire gli esempi in questo articolo, puoi inizializzare un database di esempio localmente con i seguenti comandi del terminale:

git clone https://github.com/mdizak/sample-select-db.git
cd sample-select-db
sudo mysql sudo mysql sampledb
mysql> SELEZIONA COUNT (*) DAI clienti;

Dovresti ottenere un risultato che indica che ci sono 2000 righe all'interno del file clienti tavolo.

Default / INNER Join

Il join predefinito utilizzato all'interno di Database MySQL è chiamato INNER join ed è il più comune e diretto. Questo join restituisce tutti i record per i quali sono presenti record corrispondenti in entrambe le tabelle e elimina tutti gli altri record.

Come connettersi a un database MySQL con Java

Java fornisce JDBC come parte di Java SDK. In questo articolo, esaminiamo i dettagli della connessione a un database MySQL e dell'esecuzione di query con esso.

Ad esempio, se desideri visualizzare il nome e il cognome del cliente, oltre all'importo e alla data dell'ordine per tutti gli ordini superiori a $ 1000, puoi utilizzare la seguente istruzione SQL:


SELEZIONARE
c.id, c.first_name, c.last_name, o.amount, o.created_at
A PARTIRE DAL
clienti c, ordini o
DOVE
o.customer_id = c.id AND o.amount> = 1000;

Alcune note relative alla query precedente:

  • Vengono selezionate cinque colonne diverse, tre dalla tabella dei clienti e due dalla tabella degli ordini.
  • All'interno della clausola FROM le due tabelle sono definite, ma suffisse con le lettere "c" e "o". Questi specificano semplicemente gli alias all'interno di SQL, possono essere qualsiasi cosa desideri e vengono utilizzati per abbreviare la query SQL.
  • Il o.customer_id = c.id è l'aspetto di unione della query e garantisce la corretta correlazione tra clienti e ordini.

Di seguito è riportato un modo diverso e tecnicamente più corretto sintatticamente per scrivere la stessa query:


SELEZIONARE
c.id, c.first_name, c.last_name, o.amount, o.created_at
A PARTIRE DAL
clienti c INNER JOIN ordini o
SU
customer_id = c.id
DOVE
o. importo> = 1000;

La query precedente tende ad essere un po 'più facile da leggere poiché puoi facilmente vedere l'unione tra la tabella dei clienti e degli ordini. Tuttavia, a tutti gli effetti, queste due query sono le stesse e produrranno esattamente gli stessi record.

SINISTRA si unisce

I join sinistri restituiranno tutti i record della tabella sinistra che corrispondono anche ai record della tabella destra e ignoreranno tutti gli altri record. Ad esempio, se desideri visualizzare l'importo totale delle vendite per ciascun prodotto nel database, puoi provare a utilizzare una query come:


SELEZIONARE
p.name, sum (item.amount) AS tamount
A PARTIRE DAL
order_items item LEFT JOIN products p
SU
item.product_id = p.id
GROUP BY item.product_id ORDER BY tamount DESC

Ciò si traduce in una bella vista a due colonne che mostra il nome del prodotto con l'importo totale delle vendite e funziona come previsto. La query ha esaminato tutti i prodotti all'interno della tabella orders_items, li ha uniti ai record all'interno della tabella products e ha restituito l'importo totale delle vendite di ciascuno.

DESTRA si unisce

Utilizzando l'esempio precedente, prendi nota del fatto che la query sopra ha restituito solo 19 record mentre nel database sono presenti un totale di 22 prodotti. Questo perché la query è iniziata con la tabella orders_items e lasciata unita alla tabella dei prodotti, e poiché alcuni prodotti non sono mai stati ordinati, non esistono record di tali prodotti all'interno di orders_items tavolo.

Cosa succede se desideri ottenere un elenco di tutti i prodotti con importi di vendita, inclusi i prodotti che non sono stati ordinati? Prova un join corretto con la seguente query:


SELEZIONARE
p.name, sum (item.amount) AS tamount
A PARTIRE DAL
order_items item RIGHT JOIN products p
SU
item.product_id = p.id
GRUPPO PER p.id ORDINA PER tamount DESC

È meglio e la query ora restituisce tutti i 22 prodotti, tre dei quali hanno una quantità di nullo. Questo perché invece di utilizzare orders_items come tabella principale che si unisce alla tabella dei prodotti, il join destro capovolge l'ordine e unisce la tabella dei prodotti alla tabella orders_items.

Join multipli in una query

A volte è necessario unire tre o più tabelle per ottenere un insieme specifico di risultati.

Ad esempio, potresti voler un elenco di tutti i clienti che hanno acquistato il microonde (ID prodotto n. 1), incluso il loro nome e la data dell'ordine. Ciò richiede un SELECT su tre tabelle che può essere eseguito utilizzando due join con la seguente query:


SELEZIONARE
c.first_name, c.last_name, o.amount, o.created_at
A PARTIRE DAL
clienti c INNER JOIN ordini o
SU
c.id = o.customer_id INNER JOIN orders_items item
SU
item.order_id = o.id
DOVE
item.product_id = 1 ORDER BY o.created_at;

Questa query restituisce tutti i 426 ordini del microonde e funziona come previsto. Prima abbina tutti i clienti ai rispettivi ordini, quindi ulteriori query che risultano impostate da abbinando tutti gli ordini solo a quelli all'interno della tabella orders_items che contengono il prodotto a microonde (id # 1).

Non utilizzare mai sottoquery con clausole IN

Come breve nota a margine, dovresti sempre evitare di utilizzare sottoquery all'interno delle tue query SQL come:

SELEZIONA first_name, last_name FROM customers WHERE id IN (SELECT customer_id FROM orders WHERE status = 'approvato' E importo <100);

Le query come sopra sono molto inefficienti, utilizzano un gran numero di risorse e dovrebbero essere evitate il più possibile. Utilizzare invece giunzioni appropriate come descritto nelle sezioni precedenti. Ad esempio, la query precedente dovrebbe essere riscritta come:

SELEZIONA c.first_name, c.last_name FROM clienti c LEFT JOIN orders o ON o.customer_id = c.id WHERE o.status = 'approvato' AND o.amount <100;

Risparmia tempo con i join SQL

Si spera che questo articolo ti aiuti a mostrare la potenza dei database relazionali come MySQL e come crearli Query SQL che recuperano i record da più tabelle all'interno di una query utilizzando i join, consentendo di recuperare i risultati esatti desiderati.

Hai imparato tre diversi join all'interno di SQL, come creare alias per nomi di colonne e tabelle, utilizzare più join in una query e perché dovresti evitare le sottoquery. Non smarrirti mai più cercando di compilare manualmente diversi set di dati in uno e iniziare a utilizzare i join per impressionare i tuoi colleghi di lavoro e risparmiare tempo.

E-mail
10 modi accurati per creare bellissimi documenti Google

Google Docs è ora una centrale elettrica per l'ufficio. Con l'aiuto di questi componenti aggiuntivi, puoi rendere i tuoi documenti Google belli ed eleganti.

Argomenti correlati
  • Programmazione
  • SQL
  • Banca dati
Circa l'autore
Matt Dizak (13 articoli pubblicati)Altro da Matt Dizak

Iscriviti alla nostra Newsletter

Iscriviti alla nostra newsletter per suggerimenti tecnici, recensioni, ebook gratuiti e offerte esclusive!

Ancora un passo…!

Conferma il tuo indirizzo e-mail nell'e-mail che ti abbiamo appena inviato.

.