Corsi › Decisioni basate sui dati: dalla domanda alla risposta

La tua prima query vera sugli ordini di Alpenkorb

Lezione 5 di 8 · 13 min

La forma di ogni query

Hai eseguito piccole query nei primi quattro laboratori. Questa lezione mette in ordine i pezzi, perché quasi ogni query di analisi ha lo stesso scheletro.

Text
SELECT   columns or calculations
FROM     table
WHERE    conditions on rows
ORDER BY sort columns
LIMIT    number of rows;

SQL esegue le clausole in un ordine diverso da quello in cui le scrivi. Prima FROM sceglie la tabella, poi WHERE rimuove le righe, poi SELECT calcola le colonne, poi ORDER BY ordina e LIMIT taglia. Ecco perché WHERE non può filtrare su un nome che crei in SELECT, mentre ORDER BY può ordinare in base a esso.

Filtri che corrispondono al business

Lena vuole sapere se i codici sconto comprano carrelli più grandi. Nella tabella orders, discount_code contiene codici come WELCOME10 per un primo ordine o AFFILIATE15 dai siti partner, ed è vuoto quando non è stato usato nessun codice. In SQL un valore vuoto è NULL, che significa sconosciuto, e richiede un test proprio.

SQL
SELECT order_id, order_date, source, discount_code, net_amount
FROM orders
WHERE status = 'delivered'
  AND discount_code IS NOT NULL
  AND order_date >= '2026-01-01'
ORDER BY net_amount DESC
LIMIT 3;

discount_code = NULL non restituirebbe alcuna riga. Confrontare qualsiasi cosa con sconosciuto dà sconosciuto, e WHERE mantiene solo le righe in cui la condizione è vera. Usa invece IS NULL e IS NOT NULL.

  • AND richiede tutte le condizioni, OR almeno una. Quando le combini, aggiungi le parentesi: WHERE status = 'delivered' AND (region = 'Bern' OR region = 'Basel').
  • IN è una forma breve per diversi OR: region IN ('Bern', 'Basel').
  • I confronti testuali richiedono apici singoli e l'ortografia esatta. Le regioni sono scritte 'Zurich', 'Geneva' e 'St. Gallen'.

Tre piccoli errori causano la maggior parte delle prime query fallite. I valori testuali usano apici singoli: in DuckDB "delivered" tra virgolette doppie significa una colonna chiamata delivered, e la query fallisce. Le date sono scritte come testo in formato ISO, '2026-01-01', che DuckDB confronta correttamente con una colonna di tipo data. E una virgola mancante o in eccesso tra le colonne produce un errore di sintassi vicino alla parola successiva.

La trappola dello status

La tabella orders contiene ogni ordine mai effettuato, inclusi 67 annullati e 80 resi. Il loro net_amount è comunque compilato, perché l'importo era noto nel momento in cui l'ordine è stato effettuato. Se dimentichi status = 'delivered', il fatturato risulta troppo alto. Nel primo trimestre 2026 questo errore trasforma CHF 37'107.20 in CHF 38'787.67. L'errore non è nemmeno distribuito in modo uniforme: le cancellazioni e i resi sono più frequenti in alcune fonti che in altre.

Cosa ha mostrato la domanda sugli sconti? Nel primo trimestre 2026, 90 dei 648 ordini consegnati hanno usato un codice. Il loro valore medio era CHF 57.16, contro CHF 57.28 per gli ordini senza codice. Su questa base, i codici non comprano carrelli più grandi. Potrebbero comunque conquistare nuovi clienti, il che è una domanda diversa e richiede una query diversa. Prima di fidarti di un risultato, confronta il suo numero di righe con un numero che già conosci: il laboratorio della lezione 2 ha restituito 648 ordini consegnati per questo trimestre, quindi un filtro sullo stesso trimestre non può mai restituirne di più.

💡 Costruisci una query per gradi. Inizia con SELECT * FROM orders LIMIT 10, aggiungi un filtro, eseguila, controlla il numero di righe, poi aggiungi il successivo. Una query lunga scritta tutta insieme ed eseguita una sola volta nasconde i suoi errori.
Verifica delle conoscenze
Perché WHERE discount_code = NULL non restituisce alcuna riga?

Accedi per rispondere e tracciare il tuo progresso.

Accedi
</>
Babala Software Netzwerk — Apps, Websites & KI-Lösungen aus Füllinsdorf BL
© 2026 Babala Özdemir · UID CHE-322.105.560 babala.ch info@babala.ch 076 792 63 50 Facebook Instagram