Perché i dati vengono separati?
Un database relazionale evita di copiare le stesse informazioni in ogni riga. La tabella clients memorizza il nome e la città di ciascun cliente, mentre la tabella commandes memorizza gli acquisti.
Per visualizzare il nome del cliente accanto a un ordine, SQL deve combinare queste due fonti durante la lettura. Questo è il ruolo di uno join.
La chiave comune rende possibile la relazione
In clients, id_client identifica in modo univoco una persona: questa è la chiave primaria. In commandes lo stesso valore indica chi ha effettuato l'ordine: funge da chiave esterna.
La relazione quindi non dipende dal nome del cliente. Due persone possono avere lo stesso nome, mentre il loro identificatore rimane unico.
clients
- id_client INTEGER PRIMARY KEY
- nom VARCHAR
- ville VARCHAR
commandes
- id_commande INTEGER PRIMARY KEY
- id_client INTEGER
- montant DECIMALScrivi uno INNER JOIN passo dopo passo
La query inizia da clients, aggiunge commandes e quindi descrive la corrispondenza nella clausola ON. INNER JOIN mantiene solo le righe per le quali esiste questa corrispondenza.
Gli alias c e co accorciano i riferimenti. Inoltre evitano qualsiasi ambiguità quando entrambe le tabelle hanno una colonna con lo stesso nome.
FROM clients AS cimposta la prima sorgente.INNER JOIN commandes AS coaggiunge la seconda tabella.ON c.id_client = co.id_clientspecifica quali righe corrispondono.SELECTsceglie solo le colonne utili per il risultato.
SELECT
c.nom,
co.id_commande,
co.montant
FROM clients AS c
INNER JOIN commandes AS co
ON c.id_client = co.id_client
ORDER BY co.montant DESC;Leggi e controlla il risultato
Un ordine associato a un cliente produce una riga nel risultato. Se un cliente ha tre ordini, il suo nome compare tre volte: non si tratta di duplicati casuali, ma di tre fatti diversi.
Prima di aggiungere calcoli, controlla manualmente alcuni identificatori. Uno join corretto deve preservare il significato commerciale delle linee e non moltiplicarne il numero senza motivo.
INNER JOIN o LEFT JOIN?
INNER JOIN risponde alla domanda "Quali ordini hanno un cliente corrispondente?" ". Un cliente senza ordine scompare dal risultato.
LEFT JOIN invece mantiene tutti i clienti del tavolo di sinistra. Le colonne dell'ordine sono NULL quando nessun ordine corrisponde. Questa scelta è utile per trovare clienti inattivi.
SELECT c.nom, co.id_commande
FROM clients AS c
LEFT JOIN commandes AS co
ON c.id_client = co.id_client;Cinque errori comuni con join
Una query può essere eseguita senza errori tecnici ma produce comunque un risultato aziendale errato. La condizione ON merita quindi un'attenta rilettura.
- Dimentica la clausola
ONe crea tutte le combinazioni possibili. - Collega il nome del cliente invece del suo ID stabile.
- Confondere
id_clienteid_commande. - Utilizza
INNER JOINmentre le righe senza corrispondenza dovrebbero essere conservate. - Selezionando tutte le colonne con
*e rendendo difficile la verifica del risultato.
Il metodo per ricordare
Identificare innanzitutto la domanda aziendale, quindi la tabella che rappresenta ciascun oggetto. Quindi individua la chiave primaria e la chiave esterna, scrivi la condizione ON e controlla alcune righe.
Quando questo risultato è affidabile, puoi aggiungere un filtro, un ordinamento o un'aggregazione. L'esercizio ordini-clienti consente di applicare immediatamente questo metodo.
Metti in pratica questa guida.
Apri l’esercizio collegato, esegui la query e confronta il risultato atteso.
