Quale popolazione dovresti mantenere?
INNER JOIN restituisce solo le righe con una corrispondenza. LEFT JOIN mantiene tutte le righe della tabella di sinistra e completa le colonne mancanti con NULL.
Per trovare clienti senza ordine, i clienti devono essere lasciati. Per analizzare solo gli ordini legati ad un cliente valido, INNER JOIN esprime meglio la necessità.
La domanda è stata spiegata
Inizia definendo cosa dovrebbe rappresentare una riga del risultato. Questa decisione determina le colonne, i raggruppamenti e i controlli necessari.
L'esempio seguente isola il meccanismo principale. Eseguilo, osserva il risultato, quindi modifica una clausola alla volta per comprenderne l'effetto.
SELECT c.nom, COUNT(co.id_commande) AS commandes
FROM clients c
LEFT JOIN commandes co ON co.id_client = c.id_client
GROUP BY c.id_client, c.nom;Leggi il risultato come un analista
COUNT è per l'ID comando nullable, non *. Un cliente senza pari ottiene quindi zero.
Un filtro sugli ordini effettuati in WHERE potrebbe rimuovere le righe NULL e annullare l'effetto di LEFT JOIN; posizionarlo su ON se la popolazione di sinistra deve rimanere completa.
- Nomina la popolazione di riferimento.
- Pianifica linee senza eguali.
- Conta una colonna sul lato destro.
- Controllare i filtri posizionati su ON o WHERE.
Errori che distorcono l'analisi
Una query può essere valida senza rispondere correttamente alla domanda. Gli errori più costosi sono spesso silenziosi: perimetro errato, linea moltiplicata o valore mancante interpretato come zero.
Prima di condividere il risultato, confrontalo con un piccolo campione calcolato manualmente e mantieni la definizione dell'ambito con la query.
- Scegli INNER JOIN per abitudine.
- Posiziona un filtro destro in WHERE dopo LEFT JOIN.
- Contare * e visualizzare 1 per un'assenza.
- Raggruppa solo per nome e unisci gli omonimi.
Mettiti in pratica
I clienti si esercitano senza un ordine e poi lo riscrivono con NOT EXISTS.
Il simulatore SQL di SQL.tn esegue solo query di lettura su dati fittizi nel tuo browser. Puoi provare più scritture e confrontare i risultati senza installare alcun software.
Verifica la differenza su dati concreti
Il negozio vuole vedere tutti i clienti, anche senza ordini. Emma ha due ordini, James uno e Olivia nessuno. Quale join conserverà Olivia?
| customer_id | customer_name |
|---|---|
| 1 | Emma |
| 2 | James |
| 3 | Olivia |
| order_id | customer_id |
|---|---|
| 101 | 1 |
| 102 | 1 |
| 103 | 2 |
SELECT c.customer_name, o.order_id
FROM customers AS c
LEFT JOIN orders AS o ON o.customer_id = c.customer_id
ORDER BY c.customer_id, o.order_id;Esegui LEFT JOIN, poi sostituiscilo con INNER JOIN. Olivia scompare. Le due righe di Emma non sono duplicati accidentali: rappresentano due ordini diversi.
Controlla il risultato: quattro righe, inclusa Olivia con un numero d’ordine NULL. Un filtro successivo in WHERE su una colonna di orders può escludere il cliente senza ordini.
Ambiente SQL nel browser
Verifica la differenza su dati concreti
Esegui una query di lettura sui dati fittizi di questo esercizio. Nulla viene inviato a SQL.tn.
